Сегодня я хотел бы поговорить про состояния сущностей предметной области.
На днях увидел виео и статью в блоге одного интересного разработчика. И в этой статье он пишет именно о том, о чем я говорил в предыдущем своем посте, о разделении состояния и сущности. Да, немного другими словами, но приводит те-же аргументы за разделение. И сейчас я хочу немного подробнее поговорить по состояния и их хранение.
Вполне очевидно, как я ранее и замечал, что при сохранении сущностей речь конечно идет о сохранении их состояний. Вообще не корректно говорить о осхранении сущностей, так как сущность это про поведение, а оно храниться в коде вашего приложения, а никак не в базе данных. И из-за этого и возникает вся эта путаница с ОРМ и в часности с Entity Framework который пытается неявным образом выделить состояние сущности для сохранения, что вызывает сложности в нетривиальных случаях. Было бы гораздо удобнее заранее отделить состояние сущности в виде отдельного класса.
Состояние сущности
Если взглянуть на состояние сущности как отдельный элемент программы, то это будет классический Data Transfer Object дпозволяющий передавать даные тз доменной модели в подсистему хранения данных. Этот класс должен содержать набор полей которые представляют сосбой состояние сущности и при конструировании сущности логично будет выглядеть конструктор принимающий объект этого класса как параметр.
Итак, что нам дает состояние сущности в виде отдельного класса:
- Состояние легко сериализуется и легко сохраняется различными ORM. При этом публичный доступ ко всем его полям не нарушает инкапсуляцию.
- Моменты изменения состояния хорошо видны в коде. Как бы мы не пытались скрыть то, что состояние сущностей надо сохранять, это все равно происходит, и хорошо когда моменты изменения и сохранения вы можете видеть явно.
- Сериализованное состояние может сохраняться не только в базу данных. Но об этом я напишу в следующем своем посте.