Введение
Инженерная работа циклического преобразования (RTE) в контексте архитектуры, управляемой моделью, — это функциональность инструментов разработки программного обеспечения, которая синхронизирует два или более связанных программных артефакта, таких как исходный код, модели, файлы конфигурации, документация и т. д., между собой. Необходимость в циклическом преобразовании возникает, когда одна и та же информация представлена в нескольких артефактах и когда может возникнуть несогласованность в случае обновления некоторых из них. Например, определенная часть информации была добавлена или изменена только в одном артефакте (исходном коде), и, как следствие, она стала отсутствовать или не соответствовать другим артефактам (моделям).
Обзор
Инженерная работа в обоих направлениях тесно связана с традиционными дисциплинами разработки программного обеспечения: прямой инженерией (создание программного обеспечения на основе спецификаций), обратной инженерией (создание спецификаций на основе существующего программного обеспечения) и реинженерией (анализ существующего программного обеспечения и его модификация). Инженерная работа в обоих направлениях часто ошибочно определяется как простая поддержка прямой и обратной инженерии. На самом деле, ключевой характеристикой инженерной работы в обоих направлениях, отличающей её от прямой и обратной инженерии, является возможность синхронизации существующих артефактов, которые развиваются параллельно, путем постепенного обновления каждого артефакта для отражения изменений, внесенных в другие артефакты. Более того, прямая инженерия может рассматриваться как частный случай инженерной работы в обоих направлениях, в котором присутствует только спецификация, а обратная инженерия – как частный случай инженерной работы в обоих направлениях, в котором присутствует только программное обеспечение. Многие действия по реинженерии также можно понимать как инженерную работу в обоих направлениях, когда программное обеспечение обновляется для отражения изменений, внесенных в ранее восстановленную спецификацию.
Автоматическая синхронизация
Другая особенность прямой и обратной инженерии — автоматическое обновление артефактов в ответ на автоматически выявленные несоответствия. В этом плане она отличается от прямой и обратной инженерии, которые могут быть как ручными (традиционно), так и автоматическими (путем автоматической генерации или анализа артефактов). Автоматическое обновление может выполняться мгновенно или по запросу. В случае мгновенной прямой и обратной инженерии все связанные артефакты обновляются немедленно после каждого изменения, внесенного в один из них. В случае прямой и обратной инженерии по запросу авторы артефактов могут одновременно обновлять артефакты (даже в распределенной среде) и в определенный момент выбирать выполнение сопоставления для выявления несоответствий, а также решать, какие из них распространять и как разрешать потенциальные конфликты.
Итеративный подход
Инженерная работа в обратном направлении может включать итеративный процесс разработки. После синхронизации вашей модели с измененным кодом вы по-прежнему можете выбрать оптимальный способ работы – внести дополнительные изменения в код или изменить модель. Вы можете синхронизировать данные в любом направлении в любое время и повторять этот цикл столько раз, сколько необходимо.
Программное обеспечение
Многие коммерческие инструменты и исследовательские прототипы поддерживают эту форму RTE; книга 2007 года перечисляет Rational Rose, Micro Focus Together, ESS Model, BlueJ и Fujaba как инструменты, обладающие такой возможностью, при этом утверждается, что Fujaba также способен выявлять шаблоны проектирования.
Ограничения
В книге 2005 года о Visual Studio, например, отмечается, что распространенная проблема в инструментах обратной разработки (RTE) заключается в том, что восстановленная модель не идентична исходной, если инструменты не поддерживают создание подробных аннотаций в исходном коде. Поведенческие аспекты UML создают еще большие трудности для RTE. Диаграммы классов UML обычно поддерживаются в той или иной степени, однако некоторые концепции UML, такие как ассоциации и включение, не имеют прямого отражения во многих языках программирования, что ограничивает удобство использования сгенерированного кода и точность анализа/обратной инженерии кода (например, включение сложно распознать в коде). Более эффективная обратная разработка реализуется в контексте прикладных программных интерфейсов (API) фреймворков, где модель, описывающая использование API фреймворка в приложении, синхронизируется с кодом этого приложения. В этом случае API определяет все корректные способы использования фреймворка в приложениях, что позволяет точно и полно обнаруживать случаи использования API в коде, а также создавать полезный код, реализующий правильное использование API. Два известных примера реализации RTE в этой категории – специализированные языки моделирования для фреймворков и Spring Roo (Java). Обратная разработка критически важна для обеспечения согласованности между несколькими моделями, а также между моделями и кодом в архитектуре, управляемой моделями (MDA) Object Management Group (OMG). OMG предложила стандарт QVT (query/view/transformation) для обработки преобразований моделей, необходимых для MDA. На сегодняшний день создано несколько реализаций этого стандарта. (Необходимо представить практический опыт использования MDA в контексте RTE).
Спор о генерировании кода
Создание кода (прямое проектирование) из моделей означает, что пользователь абстрактно моделирует решения, которые представлены данными модели, а затем автоматизированный инструмент генерирует из этих моделей части или весь исходный код программной системы. В некоторых инструментах пользователь может предоставить каркас исходного кода программы в виде шаблона, где предопределенные маркеры заменяются фрагментами исходного кода во время процесса генерации кода. Спецификация диаграмм UML (при использовании для MDA) критиковалась за недостаток детализации, необходимой для хранения того же объема информации, что и в исходном коде программы. Некоторые разработчики даже утверждают, что "Код – это и есть проектирование".
Недостатки
Существует серьезный риск того, что сгенерированный код быстро отклонится от модели, или что модель, полученная обратной инженерией, перестанет соответствовать коду, либо комбинация этих проблем в результате повторных циклов реинжиниринга. Что касается поведенческой/динамической части UML, такой как диаграммы состояний, в языках программирования нет прямых эквивалентов. Их трансляция при генерации кода приведет к тому, что стандартные программные конструкции либо будут отсутствовать, либо будут интерпретированы неверно. Редактирование и повторный импорт могут привести к изменению или неполноте модели. То же самое относится к фрагментам кода, используемым на этапе генерации кода для реализации шаблонов и пользовательской логики: при их смешивании обратная инженерия может оказаться затруднительной. Кроме того, существует общий недостаток продвинутых инструментов моделирования, сравнимых с современными IDE (для тестирования, отладки, навигации и т.д.) для языков программирования общего назначения и специализированных языков.