L'originale Foo
fa tre cose:
-
$this->bar = new Bar(new Quz(rand($min, $max))
- definisce
calc()
come new Quz(rand($min, $max))
- ricorda
$min
e $max
in modo che calc non li abbia superati
L'originale Foo
sta già facendo l'iniezione di dipendenza. È principalmente costruzione. La cosa di rand
è un tocco di comportamento e mi piace molto separare il comportamento dalla costruzione, quindi avere un codice hard in costruzione è un po 'strano per me, ma non è il mio punto debole.
La mia lamentela principale è che non vedo nulla di simile all'uso. Questo si legge come un esempio forzato. Non riesco davvero a vedere che tutto ciò stia aiutando.
Ma va bene. Immaginerò come viene usato il% originale di% co_de. Supponiamo che abbia bisogno di un Foo
fatto come Bar
rende Foo
. Oh, e ho bisogno di un po 'di Bar
. Così faccio questo:
$foo = new Foo(1,10);
$bar = $foo.bar;
$quz1 = $foo.calc();
$quz2 = $foo.calc();
$quz3 = $foo.calc();
Tutto ciò è codice di costruzione. Tutto quello che mi ha comprato non era dover scrivere in questo modo:
How can I implement the above class with DI but without factories?
$min = 1;
$max = 10;
$bar = new Bar(new Quz(rand($min, $max));
$quz1 = new Quz(rand($min, $max));
$quz2 = new Quz(rand($min, $max));
$quz3 = new Quz(rand($min, $max));
Che, lo giuro su Dio, è in realtà più facile da leggere. È anche incredibilmente flessibile. Inietterò ciò che mi piace. Userò qualsiasi metodo che mi piace su $ min e $ max.
Ma bene, vediamo cosa otteniamo quando passiamo al Quz
migliorato:
$foo = new Foo(new BarFactoryDefault(), new QuzFactoryDefault());
$foo.init(1,10);
$bar = $foo.bar;
$quz1 = $foo.calc();
$quz2 = $foo.calc();
$quz3 = $foo.calc();
Or am I doing it terribly wrong?
Si
Oltre a quanto sopra è più complicato di una delle due soluzioni precedenti, devo ancora creare queste classi predefinite, per non parlare delle interfacce per esse. Sì, questo è terribilmente sbagliato.
Ciò che stai facendo è raggiungere gli schemi e le tecniche che hai ascoltato erano buone e pensavo che usando buoni ingredienti avresti cucinato del buon cibo. Assapora sempre il cibo che cucini prima di servirlo. Mi piace il ketchup e mi piace il latte. Non mi piace il ketchup nel mio latte. Non è un problema né con il ketchup né con il latte.
Il problema qui è che l'esempio è anemico. I problemi che queste tecniche risolvono non sono in questo esempio. Quindi provare a esplorare le tecniche qui diventa un festival di ingegneria eccessiva che non ti insegna nulla di buono.
Hai fatto qualche altra domanda su cui mi occuperò successivamente, ma il punto principale che voglio fare qui è non progettare queste classi senza pensare a come vengono utilizzate.
Are factories required when doing dependency injection?
No.
L'iniezione di dipendenza non richiede fabbriche. Le fabbriche sono uno dei tanti modelli di costruzione. L'iniezione di dipendenza non richiede nemmeno schemi di costruzione. Puoi farlo in main. Le fabbriche potrebbero eseguire iniezioni. Le fabbriche possono essere iniettate. Fabbriche astratte dettagli di costruzione. Utilizzi principalmente le Fabbriche per nascondere le dipendenze che vuoi trattare come valori predefiniti ragionevoli. Almeno lo faccio.
Do I really need a factory method or class for each class?
Hai bisogno di un metodo di fabbrica per ogni cerimonia di costruzione che sei stufo di guardare. È assurdo pensare che ci sia qualche rapporto 1 a 1 qui. È zero per molti.
Do I indeed need the init() function to replace the constructor?
Penso che sia un peccato imperdonabile lasciare che Foo
esista in uno stato non inizializzato. Ci sono molti modi per risolverlo. Piegalo nel costruttore. Spezzalo in due oggetti. Modelli di costruttori. Trova solo un modo per non costringermi ad aggrapparmi a qualcosa che non posso usare se non seguo la sua cerimonia.
Mi dispiace che questo si sia trasformato in un tale rant. Ricordo di aver attraversato schemi di progettazione e di chiedermi di cosa si trattasse. I cattivi esempi come questo erano una grande ragione per cui ho impiegato così tanto tempo per ottenerlo. Per favore, non accettare che questa roba sia buona fino a quando non riesci a capire perché è buona. La fede è un assassino qui. Assapora il cibo prima di servirlo.