Есть сущность 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);
}
Первый способ вроде как противоречит общепринятым правилам. Но второй выглядит куда более громоздко. Плюс к тому, размазывать внутреннее поведение объекта по дополнительным сервисам, имхо, противоречит инкапсуляции.
Вопрос: какие вы видите плюсы и минусы обеих решений? Есть ли другие способы решения данной задачи?