Sono su un progetto TDD, quindi cerco di attenermi il più possibile alle buone pratiche coinvolte in quel tipo di sviluppo. Uno di questi sta evitando il più possibile statico e globale.
Sto affrontando questo problema: ho un oggetto "articolo" che può avere "opzioni" ("micro-articoli" aggiuntivi) collegati ad esso.
Non riesco a capire come avere un buon approccio che non sia controproducente o generi troppe query perché mi troverei in una situazione in cui tutto è così disaccoppiato che dovrò fondamentalmente fare 1 query per oggetto.
Dal mio punto di vista reale, vedo 3 opzioni:
1) Costruire all'interno dell'articolo:
class Article
{
//[...]
public function getArrOption(){
//Build an array of Options instance.
//return an array of Options.
}
}
Pro: dritto
Cost: Manutenibilità: l'oggetto articolo ora contiene la logica di costruzione per l'oggetto Option. Ciò porterà probabilmente alla duplicazione del codice.
2) Utilizzo di un'opzione Factory
class Article
{
//[...]
public function getArrOption(){
return OptionFactory::buildFromArticleId($this->getId());
}
}
Pro: la logica di costruzione non è fuori dalla classe Article
Costante: sto infrangendo la regola "statico è difficile da deridere", rendendo difficile testare la mia classe di articoli.
3) Separare 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 propria responsabilità e non si preoccupa del collegamento "padre" alle opzioni. Le cose sono davvero disaccoppiate
Cost: richiederà più codice all'interno del controller ogni volta che avrò bisogno di accedere alle Opzioni. Ciò significa che non dovrei mai usare una Fabbrica all'interno di un oggetto, e quel tipo di suono per me utopico ...
Qual è il modo migliore per andare? (Mi sono perso qualcosa?) Grazie.
Modificare:
Per non parlare del fatto che se non riesco a chiamare factory inside class, non posso praticamente mai usare lo schema di inizializzazione pigra ...