Ciao, e benvenuto nella terza puntata della trentaduesima stagione. Nelle scorse puntate abbiamo capito la missione di Spring e il pendolo della complessità. Oggi entriamo nel cuore tecnico di Spring, l'idea profonda e potente che sta al centro di tutto, e che lo distingue nettamente da altri framework: il modo in cui gli oggetti di un programma ottengono gli strumenti di cui hanno bisogno. L'idea è controintuitiva ma bellissima: gli oggetti non devono costruirsi o procurarsi da soli i propri attrezzi, ma devono farseli fornire da qualcun altro. Si chiama iniezione delle dipendenze. Oggi capiamo il problema che risolve e l'idea di fondo.
Partiamo dal ricordare come è fatto un programma a oggetti, dalla stagione su Java, perché è il presupposto. Ricordi? Un programma è fatto di tanti oggetti, ciascuno con un suo compito, che collaborano tra loro. Ma per fare il suo compito, un oggetto spesso ha bisogno di altri oggetti: di strumenti, di collaboratori, di pezzi che gli servono per lavorare. Chiamiamo questi altri oggetti, di cui uno ha bisogno, le sue dipendenze: le cose da cui dipende per funzionare. Un oggetto che gestisce gli ordini, per esempio, potrebbe aver bisogno di un oggetto che parla con la base di dati, e di uno che manda le email. Quegli oggetti di cui ha bisogno sono le sue dipendenze.
Ora, ecco il problema: come fa un oggetto a procurarsi le sue dipendenze, gli strumenti di cui ha bisogno? Il modo ingenuo, spontaneo, è che ogni oggetto si costruisca o si vada a cercare da solo le sue dipendenze. L'oggetto che gestisce gli ordini si costruisce da sé l'oggetto che parla con la base di dati, e da sé quello che manda le email. Sembra naturale: se mi serve uno strumento, me lo procuro da solo. Ma questo modo, apparentemente sensato, nasconde un problema serio, che voglio farti apprezzare: lega tutto insieme in modo rigido, e crea un groviglio difficile da gestire.
Voglio spiegarti perché procurarsi da soli le dipendenze sia un problema. Se ogni oggetto si costruisce da solo i suoi strumenti, allora deve sapere esattamente come costruirli, quali sono, dove trovarli, ed è legato in modo rigido a quegli strumenti specifici. E se un giorno vuoi cambiare uno strumento, devi andare a modificare tutti gli oggetti che se lo costruivano da soli. Tutto è saldato insieme. È come se ogni operaio, per lavorare, dovesse costruirsi da solo i propri attrezzi ed essere legato per sempre a quelli. È rigido, ripetitivo, e difficile da cambiare.
Ed ecco l'idea rivoluzionaria di Spring, l'iniezione delle dipendenze, che voglio farti afferrare bene. L'idea è: gli oggetti non devono procurarsi da soli le loro dipendenze. Invece, ogni oggetto dichiara semplicemente di cosa ha bisogno, quali strumenti gli servono, e qualcun altro glieli fornisce, glieli consegna già pronti. L'oggetto non dice io mi costruisco lo strumento per parlare con la base di dati; dice io ho bisogno di uno strumento per parlare con la base di dati, e aspetta che qualcuno glielo dia. Non si procura le cose da solo: le riceve. Le sue dipendenze gli vengono iniettate dall'esterno, consegnate, invece di essere costruite da lui. È un ribaltamento: dal procurarsi da soli, al farsi fornire.
Voglio darti l'immagine che rende questa idea concreta, perché è illuminante: il cuoco e gli ingredienti. Immagina due modi di lavorare per un cuoco. Nel primo, il cuoco, per cucinare, deve procurarsi da solo tutti gli ingredienti: andare a fare la spesa, coltivare le verdure, allevare il pollo. È assurdo: passa più tempo a procurarsi gli ingredienti che a cucinare, ed è legato a dove li trova. Nel secondo modo, il cuoco dichiara semplicemente di cosa ha bisogno, farina, uova, pomodori, e questi ingredienti gli vengono consegnati alla sua postazione, già pronti. Lui si concentra solo sul cucinare. L'iniezione delle dipendenze è il secondo modo: l'oggetto dichiara di cosa ha bisogno, e gli viene consegnato, invece di doverselo procurare da solo.
Voglio anticiparti perché questa idea, che sembra solo comodità, sia profondamente potente. Il fatto che gli oggetti si facciano fornire le dipendenze ha una conseguenza enorme: gli oggetti diventano disaccoppiati, non più saldati agli strumenti specifici. Un oggetto dichiara di aver bisogno di uno strumento per parlare con la base di dati, ma non sa, e non gli importa, quale preciso gli verrà dato: ne accetta uno qualunque che faccia quel lavoro. E questo dà flessibilità straordinaria: puoi cambiare gli strumenti senza toccare gli oggetti che li usano. Ma per capire chi fornisce le dipendenze, serve la prossima puntata, sull'assemblatore centrale.
Per oggi ci fermiamo qui. Il cuore tecnico di Spring è l'iniezione delle dipendenze. In un programma a oggetti, ogni oggetto ha bisogno di altri oggetti per lavorare, le sue dipendenze. Il modo ingenuo è che ogni oggetto se le procuri da solo, ma questo lega tutto insieme in modo rigido e difficile da cambiare, come un operaio che deve costruirsi da solo i propri attrezzi. L'idea di Spring è ribaltare questo: gli oggetti dichiarano di cosa hanno bisogno, e qualcun altro glielo fornisce, glielo inietta, come un cuoco a cui vengono consegnati gli ingredienti invece di doverseli procurare. Questo li rende disaccoppiati e flessibili. Nella prossima puntata vediamo chi fa la consegna, e perché è così potente: l'assemblatore centrale. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.