Estoy en un proyecto TDD, por lo que trato de apegarme lo más posible a las buenas prácticas involucradas con ese tipo de desarrollo. Uno de ellos es evitar tanto como sea posible estático y global.
Estoy enfrentando este problema: tengo un objeto "artículo" que puede tener "opciones" ("microartículos" adicionales vinculados a él).
No puedo entender cómo tener un buen enfoque que no sea contraproducente o genere demasiadas consultas porque estaría en una situación en la que todo está tan desacoplado que básicamente necesitaré hacer 1 consulta por objeto.
Desde mi perspectiva real, veo 3 opciones:
1) Construir dentro del artículo:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: directo
Const: Maintenability: el objeto del artículo ahora contiene la lógica de construcción para el objeto Option. Esto probablemente conducirá a la duplicación de código.
2) Usando una opción Factory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: la lógica de construcción no está fuera de la clase Artículo
Const: estoy rompiendo la regla "estática es difícil de burlar", haciendo que mi clase de artículo sea difícil de probar.
3) Separar todas las lógicas.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: el artículo solo maneja su propia responsabilidad, y no le importa su enlace "padre" a las opciones. Las cosas están realmente desacopladas
Const: requerirá más código dentro del controlador cada vez que necesite acceder a las Opciones. Eso significa que nunca debería usar una Fábrica dentro de un objeto, y eso me suena un poco utópico ...
¿Cuál es el mejor camino a seguir? (¿Me perdí algo?) Gracias.
Editar:
Sin mencionar que si no puedo llamar a la fábrica dentro de la clase, básicamente nunca puedo usar el patrón de inicialización diferida también ...