我想模擬一個Address
作爲值對象。因爲這是一個不變的好習慣,所以我選擇不提供任何setter,以便稍後修改它。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'];
}
// ...
}
}
這對我來說也有點不自然。
關於如何正確實現一個相當大的值對象的任何建議?
就我個人而言,我認爲如果您的價值對象足夠大,這會導致問題,它需要分解成多個值對象。地址示例對我個人的敏感度似乎很好,但如果發現它太大,它可能會成爲位置+街道地址+城市(城市包括地區和國家)。 – Domenic
@Domenic:這也是一個有趣的方法! – Benjamin