Utilizzo della Dependency Injection in PHP

19 luglio 2013

Non di rado l’esistenza di vincoli di dipendenza tra le classi disponibili rende difficoltoso lo sviluppo di codici sorgenti che siano leggibili e caratterizzati da componenti facilmente riutilizzabili. Nel corso di questa breve trattazione, verrà descritto il funzionamento del Design pattern Dependency Injection come soluzione valida per ridurre al minimo gli effetti collaterali dovuti alla sussistenza di dipendenze tra classi.

Il concetto di dipendenza tra le classi

La gestione delle dipendenze tra le classi è un problema abbastanza ricorrente nella realizzazione di applicazioni complesse scritte in PHP e il cui codice sia basato sul paradigma della programmazione orientata agli oggetti; sostanzialmente una “dipendenza” è definibile in programmazione come il vincolo esistente tra le varie componenti che costituiscono un’applicazione, tale legame stabilisce in pratica il livello di relazione per il quale il funzionamento di una parte “dipende” dalla natura e dalla presenza delle altre parti.

Quanto detto è traducibile dal punto di vista dell’Object Oriented Programming facendo riferimento al meccanismo della classi. Si ipotizzi di disporre di due classi, denominate rispettivamente “Automobile” e “Benzina”, nel caso in cui la classe “Automobile” debba utilizzare la classe “Benzina” si dirà che la prima classe dipende dalla seconda; ciò significa inoltre che “Automobile” (dipendente) non funzionerà senza “Benzina” (dipendenza) e che non si potrà utilizzare la prima senza coinvolgere la seconda.

L’esempio proposto fa emergere il problema implicito nella presenza delle dipendenze, esse infatti influenzano negativamente il grado di flessibilità di un progetto perché limitano le opportunità di reimpiego delle classi, lo sviluppatore dovrà infatti tenere sempre presente le implicazioni dovute all’adozione di una classe se per il suo funzionamento essa necessita di un ulteriore modello per la creazione di oggetti.

Caratteristiche della Dependency Injection

Un sistema per la risoluzione delle problematiche correlate alle dipendenze fa riferimento all’utilizzo di un pattern, cioè di uno schema progettuale, che prende il nome di Dependency Injection; in pratica, quest’ultimo permetterà di effettuare iniezioni di oggetti nel contesto di una classe evitando di doverli generare all’interno di essa. Per chiarire la meccanica dell’iniezione di dipendenze è possibile partire da un caso pratico e cioè dall’origine del problema; si parta quindi dalla definizione della seguente classe:

class Dipendente
{
    private $_vincolo;
    public function __construct($pippo, $pluto)
    {
        $this->_vincolo = new Dipendenza($pippo, $pluto);  
    }
}
$oggetto = new Dipendente('pippo', 'pluto');

Dal punto di vista sintattico il codice presentato non include particolari problematiche o complessità, ma rianalizzandolo a livello funzionale è possibile osservare l’esistenza di un vincolo di dipendenza a carico del costruttore, quest’ultimo genera un legame tra la classe “Dipendente” e la classe “Dipendenza”; ne consegue che il verificarsi di un evento, come per esempio l’inserimento di un parametro passato alla dipendenza, influirà su qualsiasi istanza della sua dipendente.

Nel caso di un’eventualità del genere, potrebbe tornare utile il discorso relativo alla Dependency Injection, questo perché essa darà allo sviluppatore la possibilità di inserire la dipendenza senza la necessità di doverla generare nel costruttore della classe; sulla base di quanto anticipato si potrà modificare il codice precedentemente proposto nel modo seguente:

class Dipendente
{
    private $_vincolo;
    public function __construct($vincolo)
    {
        $this->_vincolo = $vincolo;  
    }
}
$vincolo = new Dipendenza('pippo', 'pluto');  
$oggetto = new Dipendente($vincolo);

Quanto contenuto nell’esempio mostrato riassume la modalità più diffusa per l’utilizzo della Dependency Injection, cioè quella che prevede i passaggio delle dipendenze al costruttore di classe, è però possibile fare in modo che le dipendenze vengano iniettate anche tramite metodi e proprietà; da notare poi come nel caso del codice proposto l’inserimento di nuovi parametri tramite l’istanza dell’oggetto di classe della dipendenza non avrà influenza sulle istanze relative alla dipendente:

$vincolo = new Dipendenza('pippo', 'pluto', 'paperino');  
$oggetto = new Dipendente($vincolo);

Un altro evidente vantaggio nell’uso della Dependency Injection sta nel fatto che, grazie ad essa, la dipendenza potrà essere configurata indipendentemente dal vincolo che la lega alla componente dipendente, per cui la prima potrà essere anche rimpiazzata con un’altra senza per questo dover intervenire in alcun modo sulla seconda.

Se vuoi aggiornamenti su Utilizzo della Dependency Injection in PHP inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Utilizzo della Dependency Injection in PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy