Преамбула
Возьмем к примеру
MDA. К нему еще до кучи MVC и вообще трех- четырехслойную архитектуру. Все на базе java.
Какие языки, помимо java, при этом будут использоваться:
- UML для описания модели.
- JSF с нахлобучками (Seam, Facelets) для описания GUI.
- Конфигурация контейнера (сервер с нахлобучками вроде Spring + Hibernate) под приложение.
- Еще что-нибудь для начального наполнения базы данных: SQL, XML + свой парсер и т.п.
Возникает вопрос: Нафига это все на разных языках? Удобнее что-ли?
Возьмем к примеру UML. Чтобы его редактировать нужны специальные программы (кстати, платные и кривые). Записывается он в специальном формате. Через это никакой возможности совместной работы над моделью нету. Невозможно сливать вместе изменения, сделанные разными людьми и сохраненными в систему контроля версий.
Возьмем JSF. Возможность сохранять и объединять изменения есть. Отсюда возможность нормальной совместной работы. Но! Инструменты для редактирования в зачаточном состоянии. Ни рефакторинга, ни даже нормальных подсказок и способа документирования нету. Юнит-тестов нету в принципе.
Возьмем SQL для начального наполнения базы. Это вообще не выдерживает никакой критики. Никакой привязки к модели, все на соплях, ошибки можно отловить только во время исполнения, да и то не всегда. Это не говоря уже о юнит-тестах.
Теперь возьмем Java. Тут все гораздо, гораздо лучше! Совместная работа присутствует. Объединение изменений - отличное. Привязка к модели - отличная. Большинство ошибок видно еще во время редактирования, даже без юнит-тестов. Ну а с юнит-тестами вообще очень много что вылавливается. Плюс развитые инструменты с рефакторингом и прочими плюшками.
Отсюда мысль: Почему бы не использовать java на всех этапах вместо всех вышеуказанных языков?
Решаемые задачи
Итак MDA. Как я вижу она применяется:
- База для всего - модель данных
- Из модели генерируется структура базы данных
- Из модели генерируются классы и интерфейсы для доступа к данным
- Из модели генерируется конфигурация Hibernate
- Если модель меняется - все вышеуказанное перегенерируется по-новой
Что из модели не генерируется (т.к. в модели никак не присутствует):
- Начальное состояние базы данных. Т.е. собственно начальные данные. Например, группы пользователей, базовые права пользователей, обязательные объекты и т.п.
- Тестовые данные.
- Бизнес-логика.
То, что из модели не генерируется, описывается на разных языках (см. выше) вплоть до Comma Separated файлов.
UML и модель данных
Что описывает UML?
- Структуры данных (в т.ч. с описанием способов persistance)
- Интерфейсы
- Даже видел графы переходов состояний
Это, собственно, все, что используется для генерации.
Можно ли это описать на java?
Почему бы и нет?
В java есть все вышеуказанное. Есть структуры, есть интерфейсы. Спрашивается, зачем UML вообще нужен?
Чтобы графы состояний мышкой рисовать? Это смешно.
Вся модель все-равно привязывается к структурам данных в java. Так и надо использовать java сразу. Без промежуточных шагов.
Конфигурация контейнера
Давно уже решено и перенесено в java при помощи аннотаций. См.
Seam.
GUI
JSF и прочие xml-образные языки изначально придуманы чтобы писать "голый HTML". Вроде как для облегчения задачи. Чтобы не мучаться постоянно с вызовом функций, выводящих текст в выходной поток.
На сегодняшний день это вообще никак не актуально. Более-менее приличное приложение использует свой набор GUI-элементов и не лезет напрямую в HTML код (или делает это очень и очень редко и неохотно). Получается, что разработчик страниц (не верстальшик и не дизайнер) вообще не видит HTML в глаза. Он пишет на неком придуманном языке, сильно ограниченном из-за того, что он основан на xml. Здесь нет нормальных циклов, нет нормальных разветвлений, нет наследования, нет типизации, нет наследования не говоря уже о шаблонах, вообще все в жутком состоянии. И разработчики мучаются с этим ради непонятно чего.
Почему бы не взять понятный и доступный язык?
Java, будучи правильно приготовленной, отлично может описывать пользовательские интерфейсы.
Собственно одно решение проблемы уже есть и очень бодро используется. См.
GWT.
Наполнение базы данных
Ну тут вообще все понятно. Зачем хранить данные в текстовых файлах непонятно каких форматов (SQL, XML, CSV), когда их можно хранить в текстовых файлах формата java?
Преимущества на лицо:
Любая оптимизация сложных структур, автогенерация, наследование данных, любые навороты, которые придут в голову. Плюс к этому автоматическая проверка любой IDE на соответствие модели. Плюс полное соответствие типов данных. Плюс правильный контекст и возможность вызова сервисов прямо через нужные интерфейсы.
[примеры воспоследуют]
P.S.
Если вместо java взять, например, ruby - все будет гораздо веселее.