Задать вопрос
@No_name451

Как правильно писать сущности в доменном слое для разных юс-кейсов?

Поглядываю на чистую/лукову/гексагональную архитектуру

До этого работал на дефолтном MVC (MTV) - Django. Соответственно четкого обозначения доменного слоя не видел, слои сильно 'просачивались' друг в друга, + наличие орм - тоже давало возможность не реализовать доменные модели, которой всегда пользовались

Но в перечисленных выше архитектурах - доменный слой является главным. Причем, написан он должен быть по канону без сторонних библиотек, то есть быть POJO (Java) / POCO (.net) / POPO (Python).

И вот у меня назрел вопрос - как реализовать класс под какую-то сущность в доменном слое, если эта сущность используется во многих юс-кейсах, например:
1 юс-кейс использует все 10 полей из 10. Например - формирование 'досконального отчета' по списку сущностей
2 юс-кейс использует всего 7 полей из 10
3 юс-кейс использует всего 4 поля из 10. Например - формирование 'верхнеуровнего отчетика' по списку сущностей

Понятное дело, что слой сценариев должен взаимодействовать с репозиториями из слоя инфры, которые должны вернуть доменную модель из слоя домена (при этом нужно помнить о перфомансе - тянуть все поля абсолютно во всех юс-кейсах не правильно)

Но как правильно в таком случае должен выглядеть класс(ы) этой сущности в доменном слое, если вначале был представлен только 1 юс-кейс и под эту сущность написали класс с базовой логикой проверок на инварианты, при этом все 10 'атрибутов' были обязательны, НО потом появился 2 юс-кейс, где требуется 7 из 10 полей? Оставлять этот же класс под эту сущность, но внести в него изменения - сделать ему 3 'атрибута' не обязательными? Но ведь тогда возможна ситуация, когда для 1 юс-кейса будет не хватать обязательных для него 'атрибутов' + вроде как нарушается O из SOLID.
Ну и дальше развивая - появился 3 юс-кейс, где нужно 4 из 10 полей - тоже оставлять один класс и делать еще 3 'атрибута' не обязательными (тогда это ломает логику двух других юс-кейсов) - поступать как уже ранее предположил?
Либо, чисто в теории - можно плодить на каждый юс-кейс конкретный класс (то есть несколько классов на одну сущность) через механизм наследования, где и переопределять значение ненужных 'атрибутов' на пустое значение - но нормально ли это?
  • Вопрос задан
  • 139 просмотров
Подписаться 3 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
@baseddepartment
Сложилось впечатление, что ты не совсем понимаешь, что такое Use Case. Use Case - это какой-то бизнес сценарий, состоящий из от 1 до n шагов. То, что, как мне показалось, ты описываешь, это - "Interactor" a.k.a Паттерн "Command", он и является шагом юзкейса.

И вот у меня назрел вопрос - как реализовать класс под какую-то сущность в доменном слое, если эта сущность используется во многих юс-кейсах,

Зависит от сложности твоего домена, можно нарезать твое приложения по юз кейсам и сделать из каждого юз кейса отдельный модуль, в котором будут находиться доменные сущности хранящие только те данные, которые нужны юз кейсу.

Например - формирование 'досконального отчета' по списку сущностей

Это непохоже на interactor, interactor как-то меняет состояние системы, а это просто получение данных, тут, в общем-то, и доменные сущности не нужны, скорее просто какой-нибудь интерфейс к бд, которые собирает твоей "отчет".

при этом нужно помнить о перфомансе - тянуть все поля абсолютно во всех юс-кейсах не правильно

Это абсолютно нормально. Если ты будешь делать описанные тобой костыли, ты не получишь буста по перфоманусу, т.к это экономия на спичках, зато получишь код, который сложно будет поддерживать.

вроде как нарушается O из SOLID.

Open–closed principle вообще никак не связан с тем, что ты описал.

Если интересно почитать про то, как организовывать доменную модель, советвую почитать "Шаблоны корпоративных приложений. Мартина Фаулера" и что-нибудь про DDD.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы