Esistono prove del fatto che l'uso dell'iniezione di dipendenza migliora i risultati nell'ingegneria del software?


18

Nonostante la sua popolarità, ci sono prove empiriche che dimostrano che l'iniezione di dipendenza (e / o l'uso di un contenitore DI) aiuta, diciamo, a ridurre il numero di bug, migliorare la manutenibilità o aumentare la velocità di sviluppo su progetti software nella vita reale?


3
Possibile duplicato dell'iniezione di dipendenza: come venderlo E prima di guardare solo il titolo e pensare "ehi, questo non è letteralmente un inganno" - leggi quell'altra domanda e le risposte, penso che si adattino molto bene a questa domanda qui.
Doc Brown,

5
Accetta il fatto che molte pratiche di sviluppo di software professionale non hanno "prove scientifiche", sono basate sull'esperienza pratica. Quindi, anche se ora hai peggiorato la tua domanda solo per aver cercato di renderla artificialmente "meno duplicata" rispetto a quella a cui ho collegato, la vera domanda che avresti dovuto porre per ottenere le risposte che vuoi davvero sapere è che l'altra domanda a cui ho collegato . E a proposito, ora sembra che tu stia chiedendo risorse di terze parti, che è fuori tema su questo sito.
Doc Brown,

6
Pochissime tecniche nello sviluppo del software sono accompagnate da prove scientifiche, del tipo in cui è possibile indicare un documento di ricerca e dichiarare definitivamente che una tecnica è preziosa. Di conseguenza, la maggior parte di noi si affida all'esperienza e alle analisi costi / benefici per giustificare le nostre decisioni. Scegli una tecnica come l'iniezione di dipendenza perché hai bisogno dei benefici che offre e perché questi benefici superano i costi. Certo, quel calcolo è sempre in qualche modo soggettivo.
Robert Harvey,

1
@DocBrown Onestamente, non lo vedo né come duplicato, né come off-topic, io stesso. La logica e l'efficacia di una pratica di sviluppo sembrano molto rilevanti per SE.SE. E fornirò una risposta. L'OP probabilmente non gradirà la mia risposta ... ma, penso che valga la pena avere una risposta obiettiva (quasi-risposta) al fatto che i TPO e i PM possano aspettarsi di vedere aumentare magicamente la produttività dei loro team (o che i loro tassi di errore diminuiscano) come appena qualcuno urla "iniezione di dipendenza".
svidgen,

3
@gnat probabilmente vale la pena iniziare una meta-domanda distinta per domande "di prova", che sono state aggiunte all'ambito di quella meta-risposta "fuori dal sito" molto tempo dopo che l'ho votata. Certo, chiederci di andare a trovare le statistiche probabilmente non è utile. Ma l'essenza della domanda è perfettamente ragionevole. E, per me, sembra pigrizia chiamarlo così fuori tema. I commenti qui specificatamente danno l'impressione che siamo un gruppo di dogmatici DI che semplicemente non possono difendere le nostre pratiche. Bene, possiamo. E dovremmo.
svidgen,

Risposte:


14

TLDR

I dati empirici sono irrilevanti. Strumenti e pratiche (come DI) risolvono problemi particolari . Comprendi i tuoi problemi, impara come usare gli strumenti e diventerà ovvio quando uno strumento è prezioso - e sarai in grado di spiegare i risultati molto più profeticamente di qualsiasi dato generalizzato, aggregato, empirico.


E ora, con molta più verbosità ...

Esistono prove empiriche?

Certo, probabilmente. O almeno forse. Ma a chi importa? Non è rilevante

Un'analisi statistica costi-benefici di DI può essere interessante a livello accademico, ma non prevede necessariamente il successo individuale. I risultati aggregati nascondono singoli successi e fallimenti. E potrei sostenere che i dati relativi alle pratiche "evangeliche" sono particolarmente velenosi. Queste discipline tendono ad attrarre sia zeloti che sciocchi, entrambi i quali oscurano l'impatto netto di un'implementazione "pura", e in entrambi i casi potresti essere!

Quindi, come facciamo a sapere che l'iniezione di dipendenza è preziosa ?

Buona domanda! GRANDE domanda, in effetti. E sono con te - odio perdere tempo e sforzi mentali su "best practice" dogmatiche che nessuno può giustificare. Quindi, sono felice che tu l'abbia chiesto.

Uhh. Ma, ecco il problema imbarazzante ... In generale termini, si non lo sai. E, ancora più imbarazzante, il tuo codice potrebbe non migliorare in alcun modo introducendo DI.


GASP!

    ⊙▃⊙     . . .      (╯°□°)╯︵ ┻━┻

...


Quindi, forse ora ti stai chiedendo ...

Perché dovrei preoccuparmi delle cose che non sono state provate e non è vero !?

Prima di tutto, andiamo tutti, su ogni lato del dibattito, a sistemarci. Posso assicurarti che tra dogmatismo e scetticismo c'è un bellissimo paradiso di ragione e intimità. (E l'occasionale post SE.SE eccentrico.) E il POAP può condurti lì.

... Con questo intendo, il Principio di applicare i principi :

Principi, schemi e pratiche non sono scopi finali. La corretta e corretta applicazione di ciascuno è quindi ispirata e limitata da uno scopo superiore e più finale.

Devi capire perché stai facendo quello che stai facendo!

(Il POAP non è esente dal POAP.)

(Direi "enfasi sul mio", ma proviene comunque dal mio "blog". Quindi, è tutto mio!)

Permettetemi di ribadire il punto principale qui: è necessario capire perché stai facendo quello che stai facendo.

E forse per chiarire, di solito non ha senso prendere un dato "qualcosa" (come Dependency Injection) e usarlo senza già capire quale problema risolve - per te in particolare. Se capisci i tuoi problemi e come funziona il "qualcosa" (come DI), sarà in qualche modo "ovvio" quanto sia utile il "qualcosa", indipendentemente da ciò che suggeriscono i dati generalizzati, aggregati, empirici.

Se la disponibilità di DI o un -helpfulness a voi non è evidente - o almeno oltre le capacità di ragionamento - si sia non si capisce DI, o non si capisce i propri problemi.


Consideriamo una "parabola" del mondo reale.

Dobbiamo costruire una scatola. Abbiamo il legno. Abbiamo le unghie. E, abbiamo due strumenti: un martello da carpentiere standard e un cacciavite .

Ora, potremmo avere alcuni dati empirici ampi per mostrare che le scatole costruite con cacciaviti sono scatole complessivamente molto più robuste, rispetto a quelle costruite con martelli. Ma, se provi ad avvitare quei chiodi, non finirai affatto con una scatola. E, se provi a schiacciarli con il cacciavite, potresti eventualmente inserirli; ma richiederà molto più tempo e fatica, e il risultato finale sarà meno preciso (e robusto) rispetto al semplice utilizzo del martello.

E, se hai mai visto qualcuno usare uno degli strumenti prima e se hai capito come appare una scatola, la decisione è ovvia.

Telecinesi!

Err ... hmm ...


Sì, quindi, quale problema risolve l'iniezione di dipendenza?

Funziona per impedire il codice rigido, non configurabile, che spesso è quindi non testabile .

Lo fa consentendo al codice di invocazione di decidere con quali oggetti opera un modulo. E so che ci stai pensando, e hai ragione: questo non è nemmeno un concetto remoto. I parametri metodo / funzione sono esistiti da quando si è verificata l'algebra.

Abbiamo iniziato a evangelizzare il passaggio dei parametri di base, chiamandolo "Iniezione di dipendenza", una volta che abbiamo accumulato ed ereditato abbastanza codice per vedere i nostri squilibri. Le montagne di codice su cui eravamo seduti non potevano essere facilmente modificate, testate o persino riutilizzate , semplicemente perché le dipendenze erano nascoste.

Quindi, la crociata zelante per l'iniezione di dipendenza ...

K. Ma posso passare degli argomenti bene. Perché i quadri ?

Da quanto ho capito, i framework DI risolvono principalmente il problema dell'accumulo di scaldabagni (a causa di DI zelanti, IMO), in particolare quando ci sono dipendenze "predefinite" standard per tutti i moduli che li richiedono. I framework DI fanno cose magiche (potenzialmente anche cattive!) Per far scivolare quelle dipendenze predefinite quando non sono esplicitamente passate al punto di invocazione. (Stesso effetto di un Service Locator se utilizzato in questo modo, attenzione!)

L'iniezione di dipendenza, in quanto "disciplina", in realtà è davvero difficile da ottenere. Non si tratta di usare DI o no; si tratta di sapere quali dipendenze potrebbero cambiare o necessitano di deridere e iniettare quelle . E poi, si tratta di decidere se DI si adatta meglio di qualche alternativa, come Service Location ...

Ma, l'invitiamo a Google che , magari vedere questa risposta SO , eventualmente, parlare con uno sviluppatore super-esperto e di successo nel proprio settore, e gli esempi specifici pubblicare a CR.SE .


4
Hai annusato un po 'della colla di @ CandiedOrange? +1 per il Principio degli scopi applicati.
Robert Harvey,

1
@RobertHarvey Vorrei poter dire di nuovo quale colla stavamo parlando! Ho avuto una vendetta di vecchia data contro l'ingegneria basata sulla fede ... A meno che non ti riferisca alla narrazione - forse anche alla strana - natura del post?
svidgen,

2
Nota a margine dei votanti, nulla mi riempie di più con fiducia nella mia decisione di rispondere a una domanda di voti su e giù ben bilanciati! ... Sarebbe bello vedere le tue critiche nei commenti però ...
svidgen

3
@RobertHarvey non sono sicuro di quale delle mie molte colle ti riferisca, ma mi trovo d'accordo su ogni parola di questo. È facile pensare che un martello faccia schifo quando lo usi su viti.
candied_orange

Ha iniziato la modifica per includere più dettagli su DI in modo specifico e portare il TLDR in alto. E poi i bambini hanno iniziato a agitarsi, quindi ho premuto Salva. ... Se inavvertitamente ho perso l'essenza di ciò che hai votato (per quelli di voi che lo hanno fatto), per favore fatemi sapere!
svidgen,

12

Ho cercato Google, Google Scholar, ACM e IEEE Ecco i documenti che sono stato in grado di trovare:

  • Framework di iniezione delle dipendenze: un miglioramento della testabilità? . Sostiene che "testabilità" può essere definita come "bassa coesione". Afferma che DI porta a una coesione più bassa, una coesione più bassa è correlata a una copertura di test più elevata e che una copertura di test più elevata è correlata con più guasti riscontrati. Dice che, in base a ciò, DI migliora la testabilità.

    Non mi piace per un paio di ragioni. Prima di tutto, sta dicendo "A è correlato a B, B è correlato a C, quindi A causa C", che è un paio di passaggi nella logica che non vedo come ben supportati dal documento. In secondo luogo, ammette che sta solo misurando "sottoparti della testabilità" e che la "testabilità" in generale non è qualcosa di facile da definire. Infine, la loro misura della testabilità è definita in termini di numero di dipendenze iniettate!

  • Effetti dell'iniezione di dipendenza sulla manutenibilità . Confrontano i progetti che utilizzano DI con i progetti che non utilizzano DI che hanno trovato su SourceForge e vedono se ci sono differenze nelle metriche di coesione. Per ridurre la distorsione, hanno abbinato i progetti per essere il più simile possibile. Alla fine, hanno visto segnali che i progetti con molti DI erano in qualche modo meno accoppiati rispetto ai progetti con solo un piccolo DI. Tuttavia, sembra che non vi fosse alcuna differenza significativa nella coesione tra i progetti DI e la loro coppia non DI, quindi potrebbe essere una conseguenza dei domini specifici. Elencano "nessuna correlazione" come risultato principale e il "forse aiuta un po '?" come argomento per ulteriori studi.

  • Valutazione empirica dell'impatto dell'iniezione di dipendenza sullo sviluppo di applicazioni di servizi Web . L'abstract non spiega davvero cosa stanno cercando. Ho scavato e letto una prestampa e per quanto ne so in realtà riguarda quanto bene gli strumenti automatizzati possono scoprire i servizi. I servizi scritti in stile DI sono stati scoperti più facilmente. Inoltre, cita il precedente studio che ho elencato come prova empirica che DI riduce l'accoppiamento, che è l'opposto di quanto affermato da quel documento.

Per questi tre articoli (e per An Empirical Study in Use of Dependency Injection in Java , che riguarda solo il rilevamento) ho dato seguito a tutti gli articoli che li citavano, nessuno dei quali riguardava la determinazione dell'efficacia di DI. Alla luce di tutto ciò, sono fiducioso nel dire che no , non abbiamo ancora prove empiriche sul fatto che DI migliori o meno la qualità del software.


2
Questo risponde direttamente alla domanda. +1
Matthew James Briggs,

3
@MatthewJamesBriggs Non sono il downvoter, ma rispondere direttamente alla domanda è importante se la risposta è fuorviante o incompleta ???
svidgen,

@svidgen Non vedo come la risposta sia incompleta. La domanda era "abbiamo prove empiriche che DI funziona?" e la risposta è "no". Questo non dice nulla sul fatto che funzioni o meno, solo che non ci sono ricerche su di esso.
Hovercouch,

1
Incompleto e fuorviante in quanto la tua risposta limita la portata delle "prove" ai "documenti che sei stato in grado di trovare" e coperto "dall'efficacia" senza rispetto per gli scopi reali di DI, e che hai pertanto ho concluso che la risposta è "no" senza qualifica ... Direi che, se hai intenzione di "direttamente" rispondere alla domanda, come suggerisce @MatthewJamesBriggs, c'è un onere pesante su di te per scavare in profondità ed essere in grado di dimostrare con alta certezza che hai esplorato tutti i viali ...
svidgen,

1
E immagino che, combinandolo con la tua valutazione affrettata dell'unica risorsa che hai citato, potrei persino definire questa risposta molto fuorviante. Perché, a parte tutte le potenziali prove che stai ignorando, stai prendendo prove documentate e le stai immediatamente scontando per ragioni non completamente spiegate. ... Se dovessi affermare, ad esempio, che "non ci sono prove che siamo atterrati sulla luna" perché il "solo" documento che io abbia mai letto sull'argomento proveniva da una revisione "deprecata" del libro di testo che non fidati, spero che saresti scettico sui miei metodi ...
svidgen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.