IMHO, cả hai cách tiếp cận đều có giá trị như nhau, trong khi đợi native support for value objects.
Cá nhân tôi ủng hộ cách tiếp cận thứ hai (instantiating chúng thông qua accessors khi có yêu cầu) vì hai lý do:
- Như bạn nói, nó cung cấp hiệu suất tốt hơn như việc chuyển đổi chỉ được thực hiện khi cần thiết;
- Nó tách riêng ứng dụng của bạn khỏi phụ thuộc Doctrine: bạn đang viết ít mã hơn là Doctrine cụ thể.
Một ví dụ của phương pháp này:
class User
{
protected $street;
protected $city;
protected $country;
public function setAddress(Address $address)
{
$this->street = $address->getStreet();
$this->city = $address->getCity();
$this->country = $address->getCountry();
}
public function getAddress()
{
return new Address(
$this->street,
$this->city,
$this->country
);
}
}
Mã này sẽ là khá dễ dàng để cấu trúc lại khi thuyết sẽ cung cấp hỗ trợ VO bản địa.
Về custom mapping types, tôi sử dụng chúng là tốt, cho lĩnh vực đơn VO (Decimal
, Point
, Polygon
...) nhưng sẽ có xu hướng dành chúng cho các mục đích chung, các loại tái sử dụng mà có thể được sử dụng trên nhiều dự án , không dành riêng cho dự án một lĩnh vực cụ thể VO nơi tôi sẽ ủng hộ cách tiếp cận ở trên.