Где-то в конце декабря нашел интересное видео об UML на сайте modelmakertools.com и расписал совместно со своим преподавателем все действия, на русском языке в виде практической работы. Но только сейчас руки добрались до опубликования этого труда.
ModelMaker — это инструмент для визуального моделирования и рефакторинга, основанный на технологии UML 2. ModelMaker позволяет создавать и редактировать классы, создавать шаблоны кода для обеспечения создания классов с похожей функциональностью, легко создавать классы-оболочки. Возможно визуальное проектирование классов при помощи UML — подобных диаграмм классов. Имеется оригинальный редактор кода. Поддерживаются средства документирования создаваемых классов. Также есть средства просмотра зависимостей между модулями, визуализации различий в коде.
Для начала работы, необходимо:
— установить систему Delphi либо RAD Studio;
— скачать с официального сайта (http://www.modelmakertools.com/) ModelMaker и установить приложение.
Следует обратить внимание, что ModelMaker разрабатывается отдельно для C# и Pascal (Delphi). В данной статье рассматривается проектирование на примере Pascal edition, версия 11.5. Pascal edition поддерживает интеграцию с системами Delphi 4-7, Delphi 2007-2010 и Delphi XE-XE5.
В ModelMaker используется понятие модели как аналог проекта в Delphi. Рассмотрим пример разработки печи с термометром и нагревательным элементом, в котором покажем возможности прямого и обратного проектирования. Ниже перечислены основные этапы работы с ModelMaker.
1. Создается новая модель.
2. В модель помещается новый класс. При этом определяется родительский класс и указывается имя нового класса.
3. В классе определяются новые и (или) перекрываются старые свойства, методы и события.
4. Для каждой новой сущности класса программист кодирует только операторы исполняемого кода.
5. Новый класс помещается в модуль.
6. Выполняется генерация вновь созданной модели, в результате которой получается полный исходный текст модуля (прямое проектирование). Модель и файл модуля сохраняются на диске.
7. Производится синхронизация модели из файла модуля (обратное проектирование).
Рассмотрим каждый из указанных этапов более подробно.
Внимание! Перед началом работы с ModelMaker, запустите IDE Delphi (RAD Studio).
Для начала мы создаем новую модель. По умолчанию, она создается автоматически при запуске программы. Либо мы можем выбрать в меню: File -> New -> Delphi project.
После создания нового проекта, появляется окно, показанное ниже. Для продолжения работы нам необходимо создать новую диаграмму. Создадим диаграмму классов.
Для этого необходимо выбрать Add New Diagram -> Structure Diagram -> New Class Diagram. После чего появится модальное окно, в котором необходимо вписать название диаграммы – назовем ее ovens (печи).
После нажатия на кнопку ОК, вид окна программы немного изменится.
Кружком и цифрой 1 выделена область, отображающая название диаграммы Ovens. Если в проекте будут созданы еще диаграммы, то нажав на кнопку выпадающего списка, можно быстро перейти к нужной диаграмме.
На следующем шаге нам необходимо добавить класс (т.к. мы работаем с диаграммой классов). Для этого необходимо нажать на надпись класс, обведенную на рисунке выше красным цветом и помеченную цифрой 2. После чего щёлкнем левой кнопкой мышки в область холста проектирования. Сразу же выскочит модальное окно редактирования нового класса.
В поле Class name впишем название класса TOven и нажмем кнопку OK. Таким же образом добавим еще два класса Theater и TThermometer. В итоге, наш холст проектирования будет выглядеть примерно так:
Далее, установим между классами ассоциацию по свойствам. Для этого нажмем на кнопку Property Association, щелкнем левой кнопкой мыши по классу TOven и протянем ассоциацию до класса THeater, где левую кнопку мыши нужно опустить.
На экране появится модальное окно редактирования ассоциации по свойству. Нам необходимо на вкладке стандарт указать, что класс TOven будет считывать данные с класса THeater по параметру Heater. При этом, записывать данные он не сможет. Для этого установим Read Access: Field, Write Access: None. Не нажимая на кнопку ОК, перейдем на вкладку Creational Wizard, где установим, чтобы THeater создавался и уничтожался вместе с компонентом TOven. На вкладке нам нужно нажать на кнопку Composition в графе Presets (заготовки). Не нажимая кнопки ОК, перейдем на вкладку Visualization.
На вкладке визуализации нам необходимо выбрать стиль отображения – композиция. После чего, нажать на кнопку ОК. После чего может выскочить окошко с предупреждающей надписью, на которой нужно нажать на кнопку Yes, после чего снова нажать на кнопку ОК.
Вы можете заметить, что класс TOven пополнился одним новым атрибутом Heater от класса THeater и операциями создания и уничтожения класса.
На следующем шаге установим ассоциацию по полю между классами TOven и TThermometer. В классе TOven будет создано поле с типом TThermometer. Для этого необходимо нажать на кнопку Field Association, на холсте проектирования левой клавишей мыши щелкнуть по классу TOven и протянуть связь до класса TThermometer, после чего отпустить левую кнопку мыши. В появившемся модальном окне выберем вкладку Creational wizard, где выберем заготовку Composition. Не нажимая кнопку ОК, перейдем на вкладку Visualization. На вкладке визуализации нам необходимо выбрать стиль отображения – композиция. После чего, нажать на кнопку ОК.
Теперь добавим новые методы классу THeater. Для этого выделим класс THeater и нажмем на кнопку добавления метода Add Method.
По нажатию на кнопку Add Method выйдет модальное окно редактирования метода, в котором необходимо указать название метода SwitchOn и нажать кнопку ОК. Аналогичным образом необходимо добавить метод SwitchOff. Таким образом в последующем в этих методах можно будет реализовать функции включения и выключения кипятильника.
В результате добавления методов мы получим следующий вид на холсте проектирования.
Следующим шагом добавим классу TThermometer новое свойство Temperature, через которое планируется в последующем снимать показания с термометра. Для этого выделим класс TThermometer и нажмем на кнопку добавления свойства Add Property.
По нажатии на кнопку Add Property появится модальное окно редактирования свойств, в котором необходимо указать название свойства и указать права доступа на чтение и на запись. В данном случае должны быть доступны права на чтение данных, но не на запись.
После нажатия на кнопку ОК, мы получим следующую картину на холсте проектирования:
Теперь, когда взаимодействие между классами организовано, нам необходимо сгенерировать код на основе нашей модели.
Для этого нужно выбрать вкладку модели, на которой мы видим список классов, не хранящихся в модулях. Для распределения классов по модулям, нам необходимо создать новый модуль. Для этого нажмем на кнопку добавления модуля.
После нажатия на кнопку добавления модуля выйдет окно редактирования модуля, в котором необходимо указать Алиас-путь сохранения модуля, название самого модуля и список классов, которые должны в нем содержаться. Для переноса классов в наш модуль, необходимо выделить нужные классы и нажать на кнопку добавления классов в модуль. После чего необходимо нажать на кнопку ОК.
После всех этих операций мы увидим на панели модулей, что все классы хранятся в модуле Ovens. Теперь разблокируем возможность генерации кода, нажав на кнопку в виде амбарного замка. Для, включения автогенерации кода, необходимо выделить модуль Ovens и нажать на кнопку Enable Auto Generation, после чего будет произведена генерации кода, а точнее сказать, скелета будущей программы. В случае наличия большого числа классов, по нажатию на значок Delphi можно перейти к нужному классу в системе RAD Studio. Это достигается благодаря глубокой интеграции программ ModelMaker и RAD Studio.
Пример сгенерированного кода можно рассмотреть в среде Delphi, открыв указанный файл.
Таким образом мы произвели прямое проектирование кода. Давайте теперь попробуем организовать обратное проектирование. Для этого добавим новый тип данных THeaterState, а также свойство State классу THeater и сохраним модуль.
Теперь, перейдя в ModelMaker и нажав на кнопку Synchronize model, мы увидим, что модель изменилась и у класса THeater добавилось новое свойство.
Теперь осталось только сохранить проект и наполнить модуль ovens.pas необходимой логикой для его полноценной работы.
При желании, вы можете скачать файл в формате MS Word по ссылке