Пользователь
0,0
рейтинг
11 апреля 2011 в 12:22

Разработка → Кодогенерация на основе UML-модели

Как нам уже известно, Visual Studio 2010 Ultimate предоставляет достаточно удобные возможности для реверс-инжиниринга. С помощью средств Visual Studio мы можем на основе существующего кода построить UML-модель и понять как у нас, собственно, все работает, но при этом не прилагать гигантские усилия по созданию диаграмм вручную и поддержанию их в актуальном состоянии.

Все бы хорошо, но у данного инструмента напрочь отсутствует возможность синхронизации модель с кодом. Т.е., после изменения модели, нам приходится вручную изменять классы. В случае большого количества мелких изменений, получается довольно неудобно, и по этой причине от полноценного моделирования частенько отказываются.

Недавно Microsoft выпустила дополнение под названием Microsoft Visual Studio 2010 Feature Pack 2. Данный инструмент дает нам прекрасную возможность синхронизировать изменения модели в код. Вкратце расскажу, как это можно использовать.

Для примера допустим, что у нас есть примитивный блог. Предметная область представлена двумя классами: Author и Article. Добавляем в солюшн новый Modeling Project. В нем создаем UML Class Diagram.



Воспользуемся возможностями Reverse Engineering. Перетаскиваем классы из Architecture Explorer-а на диаграмму. При этом на диаграмме сущность появляются вместе с атрибутами. Периодически между сущностями образуются связи, которые должны быть (и даже периодически правильно показывается тип связи), но в каких случаях – определить пока не получилось.



Как нам всем известно, стандарт UML 2.0 определяет четыре стандартных типа данных: Boolean, Integer, String и UnlimitedNatural. Остальные типы автоматически создаются в пакетах в соответствии с расположением в пространствах имен .NET.

Итак, попытаемся «починить» модель до адекватного состояния, а заодно, немного расширим ее. Для этого, создаем на диаграмме новый класс, в UML Model Explorer-е перетаскиваем его в нужный Package и выбираем стереотип C# Class (Microsoft добавила несколько специфичных для .NET стереотипов, которые используются при кодогенерации).



Заметьте, данный класс еще не присутствует в сборке Domain. Для того чтобы прописать его туда, а заодно применить все наши изменения, нужно сделать следующее.

В Model Explorer выбираем сборку Domain, идем в Properties и в пункте Text Template Binding тыкаем кнопочку «…». Добавляем новый элемент, в поле Project Path указываем имя проекта, в который будет генерироваться код, в поле Target Directory указываем папочку относительно проекта (мы генерим в корень) и указываем адрес шаблона. По умолчанию они находятся в папке «C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\Visualization and Modeling Feature Pack\2.0\Templates\Text». Можно задать несколько шаблонов на все случаи жизни. В нашем случае, выбираем ClassTemplate.t4.



После этого, нажимаем правой кнопочкой мыши в свободное место диаграммы и выбираем пункт Generate Code.



И – вуаля! Новый класс добавлен в сборку, все изменения применены в соответствии с моделью.



Кстати говоря, с помощью стереотипов имеется возможность указывать практически все: видимость членов, атрибуты, подключаемые при генерации пространства имен и пр.

Итак, M$ предлагает нам прекрасный инструмент, серьезно облегчающий жизнь архитекторам и разработчикам. К сожалению, этот очень необходимый пакет доступен только подписчикам MSDN, и компания почему-то не позволяет использовать его всем желающим легальным пользователям. И это при стоимости VS Ultimate порядка 300 тыс. рублей. Будем надеяться, что в ближайшем будущем такое положение вещей изменится.
Дмитрий @prodmitry
карма
11,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (21)

  • 0
    Чем-то напоминает Algo
  • +2
    Давно пользуемся Altova Umodel. www.altova.com/umodel/uml-code-generation.html

    Есть ли у описанного в статье решения преимущества? В принципе код схож.
  • +1
    Чем-то напоминает AlgoLib
  • +2
    Вау. Дождались. Мне одному кажется странноватым что этого не было поставлено в релизе?
    • +3
      Спасибо за плюсик в карму. Мне тоже не совсем понятно, зачем скрывать такие аддоны. Видимо, это делается с целью заставить людей покупать подписку МСДН, которая тоже стоит несколько сотен тысяч.
      • +1
        Меня не это беспокоит, а скорее то, что даже class designer поддерживает перетаскивание класса с автосозданием модели, а UML в vs2010 когда она вышла даже такого не мог, не говоря уже про roundtrip. Вообщем, для UML при релизе забили по ходу дела на все кроме генерации sequence диаграм. Неплохо конечно, но хочется намного большего. Про деньги я вообще молчу.
        • +2
          Скорее, изначально этот инструмент предполагался для описания именно концептуальной модели. А для модели реализации как раз нужно было использовать диаграммы классов в сборках с кодом.
          • 0
            То есть roundtrip уже как бы не важен? Хмм, интересненько. Ладно, я думаю все кому реально нужен UML посидят пока еще на EA (ну или на UModel). Кстати, нашел свой старый пост на эту тему.
            • +3
              Это скорее предположение, как могли думать товарищи из M$
  • +4
    Юзаю Enterprise Architect (очень нравится ценой и поддержкой языков, так же нравится интеграция с Visual Studio, работает в обе стороны, можно написать и изменения тут же в модели появятся), так же юзал Visual Paradigm.
    • +1
      Да, ЕА сейчас де факто стандарт.
  • 0
    Помню бился долго с генерацией. Никак не мог поверить, что надо выбирать модели для генерации кода.
    • 0
      А на большинстве сайтов было описание как эту модель написать.
  • +2
    А теперь внимание! Вопрос на засыпку: как синхронизировать уже сгенерированные классы с изменениями в модели, когда в самих классах мы что-то поменяли ручками? Ответ: никак. И это большой недостаток данного инструмента. Можно выставить только опцию «на затирать при генерации».
    Вообще очень надеюсь, что MS обратят внимание на UML проектирование в VS и уделят ему значительно бОльшее внимание.
    PS. На запуске студии в Санкт-Петербурге, один из уважаемых представителей компании, с большим энтузиазмом доказывал, что кодогенерация в принципе не нужна в VS.
    • 0
      Частично можно, но все равно нужно будет немного подправить связи. Нужно просто перетащить класс из Architecture Explorer, и он заново перегенерится.
      • 0
        Если я реализую в сгенерированном классе, скажем, метод, а потом в модель добавлю парочку новых свойств и сделаю новую генерацию, к сожалению я потеряю все свои реализации и вернусь обратно к пустым заготовкам.
        • 0
          Это да. Но можно сделать partial-класс и partial-методы и свойства. В одном файле будет определение класса, в другом — реализация. Получается, и волки сыты, и куры целы :)
          • +1
            Согласен, так можно. Будем надеяться, что MS сделает достойной свою подсистему UML — проектирования. :)
  • 0
    Помнится, то ли в Visual Studio.NET, то ли в Visual Studio 2003 была двухсторонняя интеграция с Visio. В следующих версиях она пропала.
  • –1
    Осталось дело за малым — найти 300k р.
  • 0
    Интересующимся кодогенерацией по UML под .NET рекомендую глянуть в сторону фреймворка ECO. Он, правда, не ограничивается лишь этим, и включает в себя ещё ORM (лучшую, на мой взгляд). Использовали на прошлой работе и, реально, жалею, что под Java нет ничего подобного.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.