В Visual Studio UML Explorer реализована возможность запуска Generate Code, после этого будет сгенерирован C# код на основе UML описания. Нам захотелось сгенерировать java код, а не C#.
C# и java достаточно близкие языки, чтобы не писать трансформацию uml-> java самому. (Среди того, что может быть сгенерировано из UML этих различий и того меньше.) Мы взяли готовые C# шаблоны и модифицировали их.
Способы генерации
Было в принципе 3 способа генерации:
- Сгенерировать код через WriteLine чисто в C#, но это как-то некрасиво, ибо конкатенация.
- Второй вариант — это написать на t4, и написать свою кнопку, по которой произойдет генерация. Проблема в том, что t4 пришлось бы писать самим полностью, т.к. код готового шаблона завязан на определенные библиотеки, и как это правильно вызвать, чтобы не вылетало ошибок — я так и не понял.
- Изменить t4 шаблон для кодогенерации уже существующей кнопкой в visual studio.
В итоге мы остановились на последнем варианте, т.к. это наименее ресурсно затратный способ.
Поиск показал, что изменить t4 шаблон при геренации не сложно. Нужно при первом нажатии generate code выставить пути к шаблонам.
Cписок модификаций template
- Переименовали файла с CSharp* на Java, чтобы было очевидно.
- Убрали unsafe, partial, internal, protected-internal ключевые слова. Для этого аккуратно удалили все методы, которые содержат эти слова.
- Затем убрали подключаемые по умолчанию namespace типа system.linq — это бесполезно.
- Заменили sealed на final.
- Поправили расстановку границы namespace. Т.к. в C# — namespace {}, а в java — package.
- Изменили шаблон наследования с двоеточия на extends
- Убрали модификатор override и заменили атрибутами.
- Заменили auto properties на тройку get_x,set_x,_x.
Для базовых вещей — этого должно хватить.
Распространение t4 шаблона
Теперь вопрос — как распространять наши t4 шаблоны, чтобы их можно было не только локально запускать, но и на любой другой машине не занимаясь копированием файлов руками.
Решение одно — создать расширение visual studio и вместе с ним ставить эти шаблоны.
Я долго искал информацию по теме «как правильно установить t4 шаблоны», но ничего лучшего не нашел, как просто скопировать эти шаблоны в assembly, а саму сборку использовать как MEF расширение к студии.
Вот примерно к тем же выводам пришел человек, на несколько лет раньше меня.
Итог
-
У нас есть t4 шаблоны для кодогенерации
-
Есть расширение Visual Studio для дистрибуции шаблонов.
-
Нажимаем на кнопку generate code
-
Подставляем шаблоны по которым генерировать код
-
и получаем из UML модели java интерфейсы.
Приятного прочтения.
Автор: SychevIgor