Supponiamo che tu abbia una stringa $action
run-time, che specifica quale tipo di $object
deve essere creato: $dbobject
, $memcacheobject
, $fileobject
, $xmlobject
, ecc. Supponiamo anche, la creazione di un oggetto non è banale e è richiesto un $factory
.
Ovviamente, diversi tipi di oggetti dipendono da cose diverse, uno su PDO, un altro su Memcache e così via. Quindi, come dovrei creare un oggetto in queste condizioni? Sono rimasto con alcune opzioni:
-
Crea un
switch ($action) {}
esterno di una fabbrica per chiamare diverse sottoclassi della mia fabbrica, che chiamerà il suo tipo di oggetto, ad esempio:case 'db': $obj = new DBFactory($dbh); break;
.Questo è chiaramente negativo, dal momento che questo switch deve essere presente ovunque dove è necessario l'oggetto.
-
Avere un
switch ($action) {}
all'interno di una sorta di fabbrica, che farà il codice al punto # 1. Da che cosa dovrebbe dipendere la fabbrica madre, tutto ciò che potrebbe creare? Dal momento che potrebbe avere bisogno di database e memcache, per seguire le regole di dipendenza delle dipendenze è necessario fornire la fabbrica principale con entrambe le istanze di pdo e memcache, anche se ha vinto " li usa . Anche questo sembra piuttosto brutto.
Un altro problema è che se creo un altro tipo di oggetto che dipende da qualcosa di nuovo, allora devo aggiungere le sue dipendenze in tutto il codice in cui vengono create le fabbriche, che è un cambiamento orizzontale che dovrei in realtà evitare. Questo mi dice che c'è un concetto per questo problema che non vedo adesso, quindi la domanda.
Quello che sto cercando di sottolineare è che anche se è necessario solo il $fileobject
, che non dipende da nulla, il codice che analizza $action
ha ancora bisogno di tutte le dipendenze (che è un eccessivo) o lo farà instantiace alcuni di loro (che è contro DI) o ha bisogno di raggiungere lo stato globale / usare singleton / registro, che è anche considerato una cattiva pratica. Quale sarebbe quindi una buona pratica in questa situazione?