При построении многослойных («enterprise») систем часто оказывается, что создаются
Такой способ представления данных в системе обладает как положительными свойствами:
так и некоторыми недостатками:
Мы хотим реализовать фреймворк, позволяющий создавать новые «классы» (типы, конструкторы этих типов, объекты новых типов) инкрементно, используя наши собственные «кирпичики». Попутно, пользуясь тем, что мы сами изготавливаем «кирпичики», мы можем достичь таких полезных свойств:
ValueObject
'ы (или case class'ы), в которых хранится информация о каком-либо экземпляре сущности, обрабатываемом системой. Например, класс case class Person(name: String, address: Address)
Такой способ представления данных в системе обладает как положительными свойствами:
- строго типизированный доступ к данным,
- возможность привязки метаинформации к свойствам с помощью аннотаций,
так и некоторыми недостатками:
- если сущностей много, то таких классов также становится довольно много, а их обработка требует много однотипного кода (copy-paste);
- потребности отдельных слоёв системы в метаинформации могут быть представлены аннотациями к свойствам этого объекта, но возможности аннотаций ограничены и требуют использования reflection'а;
- если требуется представить данные не обо всех свойствах объекта сразу, то созданные классы использовать затруднительно;
- затруднительно также представить изменение значения свойства (delta).
Мы хотим реализовать фреймворк, позволяющий создавать новые «классы» (типы, конструкторы этих типов, объекты новых типов) инкрементно, используя наши собственные «кирпичики». Попутно, пользуясь тем, что мы сами изготавливаем «кирпичики», мы можем достичь таких полезных свойств:
- возможность описывать отдельные свойства сущностей (с указанием типа данных в этом свойстве и любой метаинформации, необходимой приложению, в форме, подходящей именно для этого приложения);
- возможность оперировать со свойствами экземпляров строго типизированным образом (с проверкой типов на этапе компиляции);
- представлять частичную/неполную информацию о значениях свойств экземпляра сущности, пользуясь объявленными свойствами;
- создавать тип объекта, содержащего частичную информацию о свойствах экземпляра сущности. И использовать этот тип наравне с другими типами (классами, примитивными типами и др.).