Comments 1
Незачет. Конечно спасибо за проделанную работу. Я как-то не подумал кординаты выносить в ValueObject, но вы его использовали неправильно. В конструкторе нужно передавать не 2 кардинаты, а ValueObject кординат. Тогда можно изменить представление кординат не затрагивая LandRover. Можно добавить ту же ось Z не затрагивая LandRover.
Я не знаю как вы собираетесь реализовывать движение марсохода, но в случае использования ValueObject, вам нужно пересоздавать объект для изменения кординат. Эту задачу можно делегировать объекту Coordinates.
В первой статье вы говорили что марсоход может двигаться на один шаг. Вы собираетесь делать защиту от перемещения в произвольную точку? И что у вас является нулевой точкой отсчета? Из комментариев к первой статье я понял что вы ориентируетесь глобально. А не думали ореентироваться локально, относительно точки приземления?
Orientation тоже лучше предоставлять в виде ValueObject, как и любой ENUM тип. Это позволит не проверять каждый раз допустимое ли значение указано. Я так подозреваю этим вы и собираетесь заниматься в следующей статье.
Ещё ValueObject-ы типа ENUM можно кешировать если они часто используются
final class Orientation
{
private $instances = [];
private $value = '';
private __constructor(string $value)
{
// Здесь должна быть валидация
$this ->value = $value;
}
// Именованный конструктор
public static function create($value)
{
if (!isset($this->instances[$value]))
{
$this->instances[$value] = new self($value);
}
return $this->instances[$value];
}
//...
}
А еще валидация данных в домене это не очень хорошо. Рекомендую прочитать статью про опыт использования DDD.
Марсоход, Координаты посадки