Предыдущая серия была тут - Описываем конкретную модель.
Теперь - что мы можем сделать с описанной моделью?
А вот что:
https://bitbucket.org/lulinalex/mindstream/src/cb7f3dbb5abeb53f61109b3742d41234f513f540/Examples/Scripts/CodeGeneration/CodeGen22.ms.script?at=B284
Теперь - что мы можем сделать с описанной моделью?
А вот что:
https://bitbucket.org/lulinalex/mindstream/src/cb7f3dbb5abeb53f61109b3742d41234f513f540/Examples/Scripts/CodeGeneration/CodeGen22.ms.script?at=B284
USES metaMACRO.ms.dict ; Test CodeGen REMARK ' %SUMMARY это мета-информация, которая позволяет привязывать документацию к элементам кода. Эта документация доступна потом из скриптовой машины. ' %SUMMARY ' Тут будем тестировать построение сначала мета-модели, потом модели, а потом и кодогенерации ' ; // %SUMMARY // --------------------------------------------------------------------------- meta-meta-model-begin 'Тут будем определять аксиоматику мета-мета-модели, а потом вынесем её в отдельный словарь. ' StereotypeStereotypeProducer meta %SUMMARY ' Определяем базовый элемент мета-модели Тот самый который позволяет тащить всё остальное "за волосы из болота" Через этот примитив выводятся все остальные ' ; // %SUMMARY ; // meta meta-meta-model-end // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- meta-model-begin 'Тут будем определять аксиоматику мета-модели, а потом вынесем её в отдельный словарь. Дальше будем определять понятия из UML - https://ru.wikipedia.org/wiki/UML Там бывают КАТЕГОРИИ и КЛАССЫ (Category и Class) На самом деле разница между ними - "призрачна", но раз умные дяди так решили, то так тому и быть Вот с них и начнём: ' <<@meta>> UMLCategory %SUMMARY ' Категория в терминах UML ' ; // %SUMMARY ; // UMLCategory <<@meta>> UMLClass %SUMMARY ' Класс в терминах UML ' ; // %SUMMARY ; // UMLClass meta-model-end // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- concrete-model-begin 'Модель шаблонов' 'Тут будем определять аксиоматику конкретной модели. Пока - "модели шаблонов". А потом вынесем её в отдельный словарь. ' <<UMLCategory>> Project %SUMMARY ' Наверное у нас при разработке встречаются проекты. Так вот Project это стереотип, который описывает наши проекты. ' ; // %SUMMARY ; // Project <<UMLCategory>> Library %SUMMARY ' Наверное у нас при разработке встречаются проектные библиотеки. Так вот Library это стереотип, который описывает наши библиотеки. ' ; // %SUMMARY ; // Library <<UMLCategory>> Programm %SUMMARY ' Наверное у нас при разработке встречаются программы. Так вот Programm это стереотип, который описывает наши программы. ' ; // %SUMMARY ; // Programm <<UMLClass>> Class %SUMMARY ' Наверное у нас при разработке встречаются проектные классы. Так вот Class это стереотип, который описывает наши проектные классы. ' ; // %SUMMARY ; // Class REMARK ' Могут ли Library вкладываться в Project, а Project в Library Или могут ли Programm вкладываться в Class, а Class в Programm И прочие отношения между стереотипами - мы определим несколько позже. Когда начнём использовать их. ' model-end // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- concrete-model-begin 'Модель конкретного проекта' 'Тут будем определять аксиоматику конкретной модели конкретного проекта. А потом вынесем её в отдельный словарь. ' <<Project>> Project1 %SUMMARY ' Это наш первый проект - Project1 ' ; // %SUMMARY <<Library>> Library1 %SUMMARY ' Наверное наш проект содержит какие-то проектные библиотеки. Так вот Library1 - это наша первая проектная библиотека ' ; // %SUMMARY ; // Library1 <<Library>> Library2 %SUMMARY ' Наверное наш проект достаточно серьёзен и содержит НЕ ОДНУ библиотеку. Так вот Library2 - это наша вторая проектная библиотека. ' ; // %SUMMARY ; // Library2 <<Library>> Library3 %SUMMARY ' Наверное наш проект НАСТОЛЬКО серьёзен, что содержит даже НЕ ДВЕ библиотеки. Так вот Library3 - это наша третья проектная библиотека. ' ; // %SUMMARY ; // Library3 <<Programm>> Programm1 %SUMMARY ' Наверное наш проект реализует какую-то программу. Иначе - зачем бы он нам был бы нужен? Так вот Programm1 - это программа внутри нашего проекта Project1. ' ; // %SUMMARY <<Class>> Class1 %SUMMARY ' Наверное наша программа содержит какие-то классы реализации. Иначе - кто будет реализовывать наш функционал? Так вот Class1 - это наш ПЕРВЫЙ класс реализации внутри нашей программы Programm1. ' ; // %SUMMARY ; // Class1 <<Class>> Class2 %SUMMARY ' Наверное наша программа достаточно серьёзна и содержит НЕ ОДИН классы реализации. Так вот Class2 - это наш ВТОРОЙ класс реализации внутри нашей программы Programm1. ' ; // %SUMMARY ; // Class2 ; // Programm1 ; // Project1 REMARK ' РЕМАРКА. Все эти слова "наверное" вообще говоря должны проистекать из требований, ТЗ и UseCase Но мы про это позже поговорим. ' model-end // --------------------------------------------------------------------------- USES CodeDump.ms.dict // - тут подключаем словарь CodeDump.ms.dict, чтобы "увидеть" слово DumpElement ; @SELF DumpElement REMARK ' - тут дампим элемент CodeGen и его содержимое в стандартное устройство вывода. Чисто для отладки того, что мы сейчас написали. ' help REMARK ' Выводим всю доступную аксиоматику в стандартное устройство вывода. Чисто для отладки того, что мы сейчас написали. ' REMARK ' Теперь, что мы можем сделать с нашим проектом? Ну для начала выведем его имя на стандартное устройство вывода. ' PROCEDURE DumpModelElement TtfwWord IN aWord %SUMMARY ' Процедура печатающая содержимое элеиента модели ' ; // %SUMMARY aWord |N Print ; // DumpModelElement @ Project1 DumpModelElement REMARK ' Теперь выведем на стандартное устройство вывода имена всех его непосредственных детей. ' for ( @ Project1 MembersIterator ) DumpModelElement ; // CodeGen CodeGen- мы напечатали имя нашего проекта и его непосредственных детей.
Комментариев нет:
Отправить комментарий