【发布时间】:2011-11-16 08:15:26
【问题描述】:
我想将Address 建模为值对象。由于使其不可变是一种很好的做法,因此我选择不提供任何设置器,以便以后对其进行修改。
一种常见的做法是将数据传递给构造函数;但是,当值对象非常大时,它可能会变得非常臃肿:
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:这也是一种有趣的方法!
标签: domain-driven-design immutability php-5.3 value-objects