Вроде простой вопрос, но не так он прост как кажется. Если ударяться в крайности, с одной стороны у нас будут анемичные модели, где сущность не содержит какой-либо логики, а с другой — модели, которые делают слишком много всего, что с ними напрямую не связано. Как выбрать в конкретном случае, стоит ли оставить метод в сущности или вынести в отдельный класс?
Я для себя вывел несколько критериев оставления метода в сущности. Они, конечно, не покрывают всех случаев, но помогают принять решение.
- Метод работает с экземпляром сущности.
- Метод работает или только с самой сущностью или с небольшим количеством внешних данных, передаваемых через аргументы.
- Метод применим ко всем контекстам, в которых используется сущность.
- Метод описывает поведение самой сущности, а не технические детали, такие, например, как сохранение или загрузка из базы.
Еще заметка. Если не ошибаюсь, в руководстве DDD написано что в случае когда непонятно к какой из двух сущностей относится логика, то нужно выносить ее в сервис для работы с обоими сущностями. Так же в самой сущности нужно максимально абстрагироваться от реализаций внутри метода и по мере возможности использовать интерфейсы. Собственно, то, что ждет yii — di.
Я исхожу из принципа Information Expert, Low Coupling и High Cohesion из GRASP при прнятии таких решений. Если грубо — у кого есть необходимые данные для выполнения операции и кто не станет от этого переполнен зависимостями, тот и получит метод.