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

Каким образом правильно реализовать класс для сущности в доменном слое, если эта сущность используется в различных юз-кейсах, каждый из которых требует различных комбинаций полей этой сущности? Можно ли иметь один класс, в котором определены все поля, и вносить изменения в этот класс для каждого юз-кейса, делая некоторые поля необязательными? Или же стоит создавать отдельный класс для каждого юз-кейса, используя наследование и переопределяя значения ненужных полей на пустые значения?
  • 14 февраля 2024 г. 18:38
Ответы на вопрос 2
Описывая сущности в доменном слое для различных использований в рамках юз-кейсов, важно следовать принципу единственной ответственности и выделять отдельные классы для каждой конкретной сущности и каждого юз-кейса.

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

Пример реализации с использованием наследования:

```java
public abstract class BaseEntity {
    private String commonField;

    // геттеры, сеттеры и прочие методы
}

public class UseCase1Entity extends BaseEntity {
    private String specificField1;

    // геттеры, сеттеры и прочие методы
}

public class UseCase2Entity extends BaseEntity {
    private String specificField2;

    // геттеры, сеттеры и прочие методы
}

//Пример использования
UseCase1Entity entity1 = new UseCase1Entity();
entity1.setCommonField("Value1");
entity1.setSpecificField1("Value2");

UseCase2Entity entity2 = new UseCase2Entity();
entity2.setCommonField("Value1");
entity2.setSpecificField2("Value2");
```

Такой подход позволяет иметь четкую и каскадную структуру классов, что обеспечивает удобство в реализации и поддержке кода. В конкретных юз-кейсах вы можете использовать свои классы с различными комбинациями полей, не затрагивая другие классы и их состояния.
Сложилось впечатление, что ты не совсем понимаешь, что такое Use Case. Use Case - это какой-то бизнес сценарий, состоящий из от 1 до n шагов. То, что, как мне показалось, ты описываешь, это - "Interactor" a.k.a Паттерн "Command", он и является шагом юзкейса. <br/> <br/> <blockquote>И вот у меня назрел вопрос - как реализовать класс под какую-то сущность в доменном слое, если эта сущность используется во многих юс-кейсах,</blockquote> <br/> Зависит от сложности твоего домена, можно нарезать твое приложения по юз кейсам и сделать из каждого юз кейса отдельный модуль, в котором будут находиться доменные сущности хранящие только те данные, которые нужны юз кейсу. <br/> <br/> <blockquote>Например - формирование 'досконального отчета' по списку сущностей</blockquote> <br/> Это непохоже на interactor, interactor как-то меняет состояние системы, а это просто получение данных, тут, в общем-то, и доменные сущности не нужны, скорее просто какой-нибудь интерфейс к бд, которые собирает твоей "отчет". <br/> <br/> <blockquote>при этом нужно помнить о перфомансе - тянуть все поля абсолютно во всех юс-кейсах не правильно</blockquote> <br/> Это абсолютно нормально. Если ты будешь делать описанные тобой костыли, ты не получишь буста по перфоманусу, т.к это экономия на спичках, зато получишь код, который сложно будет поддерживать. <br/> <br/> <blockquote>вроде как нарушается O из SOLID.</blockquote> <br/> Open–closed principle вообще никак не связан с тем, что ты описал. <br/> <br/> Если интересно почитать про то, как организовывать доменную модель, советвую почитать "Шаблоны корпоративных приложений. Мартина Фаулера" и что-нибудь про DDD.
Похожие вопросы