Inversione del controllo

Da Wikipedia, l'enciclopedia libera.
(Reindirizzamento da Inversion of Control)
Vai alla navigazione Vai alla ricerca

In programmazione, soprattutto quella ad oggetti, l'inversione del controllo (in inglese inversion of control, abbreviato in IoC) è un pattern per cui un componente di livello applicativo riceve il controllo da un componente appartenente a una libreria riusabile. Questo schema ribalta quello tradizionale della programmazione procedurale, dove il codice applicativo svolge i propri compiti richiamando (e quindi passando il controllo a) procedure di libreria[1][2][3].

Descrizione[modifica | modifica wikitesto]

L'obiettivo dell'inversione del controllo è lo stesso dell'Abstract factory: rendere le componenti software il più indipendenti possibile, affinché sia possibile modificarne una parte senza dover modificare le altre.

Le dipendenze tra i singoli componenti sono dichiarate in modo semplice. Per esempio una classe Automobile che necessita di un oggetto di tipo Motore, dichiarerà una variabile di istanza di tipo Motore e un metodo per impostare a run-time il riferimento all'oggetto.

Le dipendenze possono quindi essere "iniettate" dall'esterno: non si segue il normale flusso di controllo dei linguaggi imperativi, in cui, nel momento del bisogno, si richiamano funzioni di classi o librerie esterne[4]. Gli oggetti non istanziano e richiamano gli oggetti dal quale il loro lavoro dipende, ma queste funzionalità vengono fornite da un ambiente esterno tramite dei contratti definiti da entrambe le entità.

Dependency injection[modifica | modifica wikitesto]

La Dependency injection è una delle tecniche con le quali si può attuare l'inversione del controllo. Essa prende il controllo su tutti gli aspetti di creazione degli oggetti e delle loro dipendenze. La libreria Java Spring usa molto diffusamente la Dependency Injection con il risultato, tra le altre cose, di eliminare dal codice applicativo ogni logica di inizializzazione. Normalmente, senza l'utilizzo di questa tecnica, se un oggetto necessita di accedere ad un particolare servizio, l'oggetto stesso si prende la responsabilità di gestirlo, o avendo un diretto riferimento al servizio, o individuandolo con un "Service Locator" che gli restituisce un riferimento ad una specifica implementazione del servizio. Con l'utilizzo della dependency injection, l'oggetto ha in sé solamente una proprietà che può ospitare un riferimento a quel servizio e, quando l'oggetto viene istanziato, un riferimento ad una implementazione di questo servizio gli viene iniettata dal framework esterno, senza che il programmatore che crea l'oggetto sappia nulla sul posizionamento del servizio o altri dettagli dello stesso.

Implementazioni ed esempi[modifica | modifica wikitesto]

Java[modifica | modifica wikitesto]

.NET[modifica | modifica wikitesto]

Note[modifica | modifica wikitesto]

  1. ^ Inversion of Control Containers and the Dependency Injection pattern
  2. ^ Inversion of Control
  3. ^ IoC e DI (Inversion of Control e Dependency Injection)
  4. ^ (EN) Stefan Sobernig e Uwe Zdun, Inversion-of-Control Layer (PDF), in EuroPLoP '10: European Conference on Pattern Languages of Programs, New York, Association for Computing Machinery, 7 luglio 2010, ISBN 978-1-4503-0259-3. URL consultato il 28 giugno 2023.
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica