Psychology – это легкая и новая библиотека Java с открытым исходным кодом, созданная для того, чтобы сделать генерацию программного кода (или метапрограммирование) чистой и простой в реализации.
Генерация кода – это процесс, посредством которого исходный код программно генерируется на основе входных данных (также известный как модель).
Генерация кода обычно работает следующим образом:
- Определите модель/используйте существующую модель.
- Запрашивать модель и выдавать/генерировать исходный код
- (Необязательно) После внесения изменений в модель повторно создайте исходный код.
Генератор кода, предназначенный для использования психологии, обычно использует модель POJO в качестве источника модельных данных.
Альтернативными вариантами использования являются использование аннотированного исходного кода Java с помощью функций Java JSR-269 ( link ).
Для простоты в этой статье будет рассмотрен сценарий PoJo.
Пример модели POJO показан ниже (для краткости опущены геттеры/сеттеры).
Эта модель POJO обычно создается из следующих типов источников:
- JSON/XML/YAML/CSV
- С помощью запроса к базе данных
- DSL (языки, зависящие от домена)
Например:
записка: Важно, чтобы при создании экземпляра модели POJO выполнялся полный набор проверок и проверялись допущения. XML-схема или индивидуальная реализация DSL могут обеспечить ссылочную целостность и другие проверки.
Picocog выдает текст с помощью Java-кода. Никаких шаблонов, никакого отражения, никакой обработки тегов. Она преследует три основные цели:
- Легко генерируйте код с четкими отступами.
- Поддержка ввода линии вне последовательности.
- Быть простым в отладке.
Психологию можно рассматривать как альтернативу StringBuilder, ориентированную на генерацию кода.
Picocog просто записывает строки — запоминается текущий уровень отступа.
Единственный класс, который требуется, – это класс Pico Writer.
Нет необходимости вручную помещать отступы в строковые литералы, но есть необходимость отмечать отступ слева и записывать строки кода с помощью методов writeln_r(), writeln_l() и writeln_lr().
Иногда бывает удобно захотеть выполнить запись в два или более места в документе одновременно — и чтобы эти места имели свой собственный стек отступов. Чтобы сделать это, вы добавляете заполнитель с помощью метода createDeferred Writer().
Возвращаемый объект записи можно рассматривать как указатель на строку, на которой он был создан.
Исходный код генерации кода:
Customer.java (сгенерировано Picocog):
Order.java (сгенерировано Picocog):
Первоначальный выпуск Psychology не поддерживает никакого текстового экранирования. Либо напишите свой собственный экранирующий код (довольно просто), либо используйте такую библиотеку, как Commons Lang для ваших потребностей в экранировании текста .
Психология написана на Java, но она может выдавать код на любом языке .
Генератор кода может быть создан таким образом, чтобы C#, Java, JavaScript и другие языки могли быть созданы из одной модели, включая аннотации, прикрепленные к коду Java (через JSR 269).
Иногда небольшая реализация – это все, что вам нужно.
Психология доступна сегодня на GitHub .
Другим подходом к генерации кода, не основанным на шаблонах, является превосходный язык xtend .
Для более подробного обсуждения генерации кода см. Отличную статью Мэтью Фаулера ” Генерация кода для чайников “.
записка: Эта статья взята (тем же автором) из следующего сообщения в блоге на medium.com
Оригинал: “https://dev.to/ainslec/metaprogramming-with-picocog-44od”