Address
を値オブジェクトとしてモデル化したいと思います。それは不変にするのがよい習慣であるので、私は後でそれを変更することができるかもしれないセッターを提供しないことを選択しました。DDD:複雑な値オブジェクトを不変に保つ方法は?
一般的なアプローチは、データをコンストラクタに渡すことです。値オブジェクトはかなり大きい場合しかし、それは非常に肥大化になることがあります。
class Address {
public function __construct(
Point $location,
$houseNumber,
$streetName,
$postcode,
$poBox,
$city,
$region,
$country) {
// ...
}
}
別のアプローチは、クリーンなコンストラクタで、その結果、配列として引数を提供することが、whouldことかもしれないが台無しの実装コンストラクタ:
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