Рефакторинг доменной логики, которая обращается к репозиториям в устаревшей системе

Я работаю с устаревшей системой, которая имеетмодель анемичной области.

Домен имеет следующие классы сущностей:,,,.CarCarTypeCarComponentCarComponentType

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

Мне нужно реализовать метод, который определяет, является лиCarComponentType может быть прекращено поставщиком. Логика такова: компонент может быть снят с производства только в том случае, если сегодня не существует автомобилей с этим компонентом.

Первоначально я реализовал это в классе обслуживания.

public boolean canBeDiscontinued(CarComponentType carComponentType) {
    List cars = carRepository.getCarsWithComponent(carComponentType);
    return cars.isEmpty();
}

Это работает - но эта логика используется из нескольких других мест в коде. Это может расти, и это выглядит как то, что может соответствоватьвнутри CarComponentType класс вместо:

public boolean canBeDiscontinued() {
    List cars = carRepository.getCarsWithComponent(this);
    return cars.isEmpty();   
}

Тем не менее, я могуЯ бы сказал, потому что ему нужен доступ к хранилищу (и, насколько я понимаю, это очень серьезный антипаттерн для объектов, которые должны знать об уровне доступа к данным). При загрузке компонента типа я могузагрузить все машины этого типа, поскольку это могут быть тысячи объектов. Мы не используем ORM, поэтому сборка с отложенной загрузкой будет не только громоздкой, но и очень подверженной ошибкам.

Более уместно ли иметь этот метод в классе обслуживания, как я это сделал сначала? Разве это не важно? Есть ли другая альтернатива? Должен ли я начать рефакторинг с другой отправной точки?

Есть похожий вопросВот, Но мой вопрос относится к Java, поэтому я неНе думаю, что решение применимо в моем случае. Кроме того, заранее извините за использование автомобилей и компонентов в качестве модели моего домена. :)

Ответы на вопрос(4)

Ваш ответ на вопрос