Внедрить ли сервис в сущность для простоты интерфейса сущности?

Есть сущность MapPoint. У неё есть свойство location. Также должно быть свойство fakeLocation, значение которого может вычисляться разными алгоритмами. Для вычисления и описания алгоритмов хочу использовать паттерн Стратегия

Есть два варианта реализации.

Первый. Внедрить стратегию в сущность как сервис (например, как описано здесь).
class MapPoint
{
    /** @var array(ширина, долгота)  */
    private $location;

    private $fakeLocationBuilderStrategy;


    public function getFakeLocation()
    {
        return $this->fakeLocationBuilderStrategy->createFakeLocation($this->location);
    }

    // прочие геттеры и сеттеры...
}


Второй. Создать дополнительный сервис FakeLocationBuilder. В него внедрить FakeLocationBuilderStrategy. И для каждой сущности вызывать:
FakeLocationBuilder::setFakeLocation(MapPoint $mapPoint)
{
    $fakeLocation = $this->fakeLocationBuilderStrategy->createFakeLocation($this->location);
    $mapPoint->setFakeLocation($fakeLocation);
}


Первый способ вроде как противоречит общепринятым правилам. Но второй выглядит куда более громоздко. Плюс к тому, размазывать внутреннее поведение объекта по дополнительным сервисам, имхо, противоречит инкапсуляции.

Вопрос: какие вы видите плюсы и минусы обеих решений? Есть ли другие способы решения данной задачи?
  • Вопрос задан
  • 2263 просмотра
Пригласить эксперта
Ответы на вопрос 1
@maxloyko
Я бы создал отдельно сервис и использовал его там где это нужно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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