Come gestire correttamente le dipendenze condizionali in una fabbrica?

1

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:

  1. 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.

  2. 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?

    
posta sky 25.05.2014 - 08:22
fonte

1 risposta

1

Puoi inserire le dipendenze separatamente introducendo un registro di fabbriche.

Dividi la tua grande fabbrica in più piccole. Ogni factory crea solo un tipo di oggetto e la loro aggregazione - registro, li gestisce e invia la richiesta di creazione. Solo le fabbriche necessarie sono create (e popolate con dipendenze) e un chiamante richiama il registro invece dell'accesso diretto alla fabbrica.

In questo modo puoi avere dipendenze solo per le fabbriche (e il tipo di oggetti) necessarie mentre sei ancora in grado di utilizzare il registro nel modo in cui sei abituato.

Fai attenzione ai guasti di runtime dovuti a tipi di factory mancanti, dovresti assicurarti che nessuna chiamata di registro richieda la fabbrica assente.

    
risposta data 26.05.2014 - 03:11
fonte

Leggi altre domande sui tag