Pull to refresh

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.

Sign up to leave a comment.

Articles