Estou em um projeto de TDD, então tento manter o máximo possível as boas práticas envolvidas com esse tipo de desenvolvimento. Uma delas é evitar o máximo possível de estática e global.
Estou enfrentando esse problema: tenho um objeto "artigo" que pode ter "opções" ("micro-artigos" adicionais) vinculados a ele.
Não consigo descobrir como ter uma boa abordagem que não seja contraproducente ou gere muitas consultas, porque eu estaria em uma situação em que tudo está tão dissociado que basicamente precisarei fazer 1 consulta por objeto.
Da minha perspectiva real, vejo três opções:
1) Construa o artigo interno:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: direto
Const: Manutenção: O objeto de artigo agora contém a lógica de construção do objeto Opção. Isso provavelmente levará à duplicação de código.
2) Usando um optionFactory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: a lógica de construção não está fora da classe Article
Const: estou violando a regra "estática é difícil de zombar", dificultando o teste da minha classe Article.
3) Separe todas as lógicas.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: o artigo lida apenas com sua própria responsabilidade e não se importa com o link "pai" para as opções. As coisas estão realmente dissociadas
Const: exigirá mais código dentro do Controller toda vez que precisar acessar as Opções. Isso significa que eu nunca deveria usar uma fábrica dentro de um objeto, e isso me parece utópico ...
Qual o melhor caminho a percorrer? (Perdi alguma coisa?) Obrigado.
Editar:
Sem mencionar que, se eu não posso ligar para a fábrica dentro da classe, basicamente também nunca posso usar o padrão de inicialização lenta ...