@a_halala

Как правильно разработать архитектуру объекта и обслуживающих его сервисов?

Всем привет. Вопрос к опытным знатокам ООП дизайна. Представим простую систему, где есть клиент и сервис, обслуживающий его.
public interface ClientService {
    void disableClient(String id);

    void sendEmailToClientWithId(String id);
}

public class Client {
    private String id;
    private String username;
    private String email;
    private Boolean isActive = true; // конструктор и куча других полей
}

Надо продумать способ взаимодействия объекта и его сервиса. Допустим мы получаем все необходимые данные в контроллере и собираем через фабрику объект Client. Вот и вопрос: что лучше?
1. Сделать агрегацию сервиса и объекта и предоставить апи для изменения состояния этого объекта, например
public class Client {
    private String id;
    private String username;
    private String email;
    private Boolean isActive = true; 

    @Autowired
    private ClientService clientService;

    public void printWelcomeMessage() {
        System.out.println(String.format("Hello, %s!", username));
    }

    public void disableClient() {
        clientService.disableClient(this.id);
        this.isActive = false;
    }

    public void printClientStatus() {
        System.out.println(this.isActive? "Active" : "Inactive");
    }

    public void sendEmail() {
        clientService.sendEmailToClientWithId(this.email);
    }
}

2. Сделать сервис, с такими же методами, но в качестве параметра будет приходить сам Client (в котором, соответственно, будут геттеры/сеттеры)

Т.е. вопрос даже вот в чем: Правильно ли с точки зрения ооп и дизайна делегировать управление состоянием объекта внешним сервисам через геттеры/сеттеры? И какие подводные камни могут быть у каждого из мною предложенных вариантов?
Надеюсь, что мой вопрос ясен. Надеюсь на ответы, спасибо!
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Второй вариант с точки зрения ООП однозначно правильнее. Ответ на вопрос: да, правильно.

В первом случае главный подводный камень будет в том, что тебе нужно будет в каждую сущность внедрять сервис.
Вот в этой книге всё достаточно доступно описано.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы