DDD: Как сохранить комплексное значение объекта, неизменным?

Я хотел бы моделировать адрес в качестве объекта значения. Поскольку это хорошая практика, чтобы сделать это неизменным, я решил не предоставить какой-либо установку, что может позволить изменять его позже.

Общий подход - передавать данные в конструктор; Однако, когда объект стоимости довольно большой, то это может стать довольно раздутым:

class Address {
    public function __construct(
        Point $location,
        $houseNumber,
        $streetName,
        $postcode,
        $poBox,
        $city,
        $region,
        $country) {
        // ...
    }
}

Другой подход, который могло бы предоставить аргументы в качестве массива, что приводит к чистому конструктору, но это может испортить реализацию конструктора:

class Address {
    public function __construct(array $parts) {
        if (! isset($parts['location']) || ! $location instanceof Point) {
            throw new Exception('The location is required');
        }
        $this->location = $location;
        // ...
        if (isset($parts['poBox'])) {
            $this->poBox = $parts['poBox'];
        }
        // ...
    }
}

Это также выглядит немного неестественно для меня.

Любой совет о том, как правильно реализовать привлекательный объект большого значения?

6
задан Benjamin 13 September 2011 в 16:30
поделиться