Me gustaría modelar un Address
como un objeto de valor. Como es una buena práctica hacerlo inmutable, decidí no proporcionar ningún setter, que podría permitir modificarlo más tarde.DDD: ¿cómo mantener inmutable un objeto de valor complejo?
Un enfoque común es pasar los datos al constructor; Sin embargo, cuando el objeto de valor es bastante grande, que puede llegar a ser bastante hinchada:
class Address {
public function __construct(
Point $location,
$houseNumber,
$streetName,
$postcode,
$poBox,
$city,
$region,
$country) {
// ...
}
}
Otro enfoque whould sea para proporcionar los argumentos como una matriz, lo que resulta en un constructor limpio, pero que podría estropear la aplicación de la constructor:
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'];
}
// ...
}
}
Eso también me parece un poco antinatural.
¿Algún consejo sobre cómo implementar correctamente un objeto de valor bastante grande?
Personalmente, creo que si su objeto de valor es lo suficientemente grande como para causar problemas, debe dividirse en varios objetos de valor. El ejemplo de dirección parece estar bien para mi sensibilidad personal, pero si lo encuentras demasiado grande, tal vez se convierta en la ubicación + dirección + ciudad (donde la ciudad incluye la región y el país). – Domenic
@Domenic: ¡ese es un enfoque interesante también! – Benjamin