Lo stesso problema di base che si presenta spesso con la programmazione orientata agli oggetti, le regole di stile e praticamente tutto il resto. È possibile - molto comune, in effetti - fare troppa astrazione, aggiungere troppa indiretta e applicare generalmente buone tecniche eccessivamente e nei posti sbagliati.
Ogni modello o altro costrutto applicato porta complessità. L'astrazione e l'indirizzamento indiretto sparpagliano le informazioni, a volte spostando i dettagli irrilevanti di mezzo, ma ugualmente a volte rendendo più difficile capire esattamente cosa sta succedendo. Ogni regola che applichi comporta inflessibilità, escludendo opzioni che potrebbero essere l'approccio migliore.
Il punto è scrivere codice che fa il lavoro ed è robusto, leggibile e gestibile. Sei uno sviluppatore di software, non un costruttore di torri d'avorio.
Link pertinenti
http://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
Probabilmente la forma più semplice di iniezione di dipendenza (non ridere) è un parametro. Il codice dipendente dipende dai dati e tali dati vengono iniettati mediante il passaggio del parametro.
Sì, è sciocco e non affronta il punto di iniezione di dipendenza orientato agli oggetti, ma un programmatore funzionale ti dirà che (se hai funzioni di prima classe) questo è l'unico tipo di iniezione di dipendenza di cui hai bisogno. Il punto qui è fare un esempio banale e mostrare i potenziali problemi.
Prendiamo questa semplice funzione tradizionale: la sintassi C ++ non è significativa qui, ma devo scriverla in qualche modo ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
Ho una dipendenza che voglio estrarre e iniettare: il testo "Hello World". Abbastanza facile ...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
In che modo è più flessibile dell'originale? Bene, se decidessi che l'output dovrebbe essere unicode. Probabilmente voglio passare da std :: cout a std :: wcout. Ma ciò significa che le mie stringhe devono essere di wchar_t, non di char. O ogni chiamante deve essere modificato, o (più ragionevolmente), la vecchia implementazione viene sostituita con un adattatore che traduce la stringa e chiama la nuova implementazione.
Questo è il lavoro di manutenzione che non sarebbe necessario se avessimo conservato l'originale.
E se sembra banale, dai un'occhiata a questa funzione del mondo reale dall'API Win32 ...
http://msdn.microsoft.com/en-us/library/ms632680%28v=vs.85%29.aspx
Sono 12 le "dipendenze" da affrontare. Ad esempio, se le risoluzioni dello schermo diventano davvero enormi, forse avremo bisogno di valori di coordinate a 64 bit e di un'altra versione di CreateWindowEx. E sì, c'è già una versione precedente ancora in giro, che presumibilmente viene mappata alla versione più recente dietro le quinte ...
http://msdn.microsoft.com/en-us/library/ms632679%28v=vs.85%29.aspx
Queste "dipendenze" non sono solo un problema per lo sviluppatore originale: tutti coloro che usano quell'interfaccia devono cercare quali sono le dipendenze, come sono specificate e cosa significano, e capire cosa fare per la loro applicazione. È qui che le parole "impostazioni predefinite sensibili" possono semplificare la vita.
L'iniezione di dipendenza orientata agli oggetti non è diversa in linea di principio. Scrivere una classe è un sovraccarico, sia nel testo del codice sorgente che nel tempo dello sviluppatore, e se quella classe è scritta per fornire dipendenze secondo alcune specifiche degli oggetti dipendenti, allora l'oggetto dipendente è bloccato nel supportare quell'interfaccia, anche se è necessario per sostituire l'implementazione di quell'oggetto.
Nulla di tutto questo dovrebbe essere letto come affermando che l'iniezione di dipendenza è male - tutt'altro. Ma ogni buona tecnica può essere applicata eccessivamente e nel posto sbagliato. Proprio come non tutte le stringhe devono essere estratte e trasformate in un parametro, non tutti i comportamenti di basso livello devono essere estratti da oggetti di alto livello e trasformati in una dipendenza iniettabile.