Sono su un progetto TDD, quindi cerco di attenermi il più possibile alle buone pratiche coinvolte in questo tipo di sviluppo. Uno di questi è quello di evitare il più possibile statico e globale.
Sto affrontando questo problema: Ho un "articolo" oggetto che può avere "opzioni" (ulteriori "micro-articoli") collegati ad esso.
Non riesco a capire come avere un buon approccio che non sia controproducente o generare troppe query perché mi troverei in una situazione in cui tutto è così disgiunto che basterò fondamentalmente a creare 1 query per oggetto .
Dalla mia prospettiva attuale, vedo 3 opzioni:
1) Costruisci all'interno dell'articolo:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: Straight forward
Const: manutenibilità: l'oggetto article ora contiene la logica di costruzione per l'oggetto Option. Questo probabilmente porterà alla duplicazione del codice.
2) Usando un'opzioneFactory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: la logica di creazione non è esclusa dalla classe Article
Const: Sto violando la regola "statico è difficile da deridere", rendendo difficile la verifica della mia classe Article.
3) Separa tutte le logiche.
//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());
Pro: l'articolo gestisce solo la sua responsabilità e non si preoccupa del suo link "padre" alle opzioni. Le cose sono davvero disaccoppiate
Const: richiederà più codice all'interno del Controller ogni volta che avrò bisogno di accedere alle Opzioni. Ciò significa che dovrei mai usare una Fabbrica all'interno di un oggetto, e questo mi sembra un po 'utopico ...
Qual è il modo migliore per andare? (Ho perso qualcosa?) grazie.
Modifica:
Per non parlare del fatto che se non riesco a chiamare factory in classe, posso basicamente non usare mai il modello di inizializzazione pigro ...