Inversione del controllo: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
-A+Stub +Wikificare +senza fonti |
Corretto: "un avvio" |
||
| (49 versioni intermedie di 37 utenti non mostrate) | |||
Riga 1:
{{S|programmazione}}
{{W|informatica|novembre 2010}}▼
In [[programmazione (informatica)|programmazione]], soprattutto quella [[programmazione orientata agli oggetti|ad oggetti]], l{{'}}'''inversione del controllo''' ({{Inglese|'''inversion of control'''}}, abbreviato in '''IoC''') è un ''[[design pattern]]'' per cui un componente di livello applicativo riceve il [[flusso del controllo|controllo]] da un componente appartenente a una [[Libreria (software)|libreria]] riusabile. Può essere ulteriormente descritto come un design pattern nella quale un componente software è designato per ricevere le sue [[Dipendenza (informatica)|dipendenze]] da una fonte esterna, anziché crearsi le proprie.<ref>{{Cita web|url=https://www.linkedin.com/pulse/inversion-control-ioc-design-principle-jahid-momin/|titolo=Inversion of Control (IoC) Design principle .|sito=www.linkedin.com|lingua=it|accesso=2024-08-21}}</ref> Questo schema ribalta quello tradizionale della [[programmazione procedurale]], dove il codice applicativo svolge i propri compiti [[funzione (informatica)|richiamando]] (e quindi passando il controllo a) procedure di libreria<ref>[http://martinfowler.com/articles/injection.html Inversion of Control Containers and the Dependency Injection pattern]</ref><ref>[https://msdn.microsoft.com/en-us/library/ff921087.aspx Inversion of Control]</ref><ref>[http://www.mrwebmaster.it/java/ioc-inversion-of-control-dependency-injection_10535.html IoC e DI (Inversion of Control e Dependency Injection)]</ref>.
▲{{F|informatica|novembre 2010|commento=nessuna fonte}}
== Descrizione ==
La [[Dependency Injection]] è una delle tecniche con le quali si può attuare l'IOC. Essa prende il controllo su tutti gli aspetti di creazione degli oggetti e delle loro dipendenze. 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 suo posizionamento del servizio o altri dettagli sullo stesso.▼
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 <code>Automobile</code> che necessita di un [[Oggetto (informatica)|oggetto]] di tipo <code>Motore</code>, dichiarerà una [[variabile di istanza]] di tipo <code>Motore</code> e un [[metodo (programmazione)|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 [[Programmazione imperativa|linguaggi imperativi]], in cui, nel momento del bisogno, si richiamano [[funzione (informatica)|funzioni]] di [[classe (informatica)|classi]] o [[Libreria (software)|librerie]] esterne<ref>{{Cita pubblicazione|autore=Stefan Sobernig|autore2=Uwe Zdun|data=7 luglio 2010|titolo=Inversion-of-Control Layer|rivista=EuroPLoP '10: European Conference on Pattern Languages of Programs|editore=Association for Computing Machinery|città=New York|lingua=en|accesso=28 giugno 2023|id=ISBN 978-1-4503-0259-3|url=http://eprints.cs.univie.ac.at/2822/1/Inversion-of-Control_Layer.pdf|formato=PDF}}</ref>. 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 ===
{{Vedi anche|Dependency injection}}
▲La
== Implementazioni ed esempi ==
=== Java ===
* il framework [[Spring framework|Spring]] è una delle implementazioni più diffuse e popolari dell'Inversione del Controllo (IoC) nel mondo Java. Il framework ha giocato un ruolo cruciale nel promuovere il pattern IoC e ha una comunità ampia e attiva, rendendolo uno standard de facto per la gestione delle dipendenze e lo sviluppo di applicazioni modulari ed estensibili
* il framework Quarkus offre tempi di avvio più rapidi e un utilizzo della memoria più efficiente rispetto a Spring, rendendolo ideale per applicazioni cloud-native e ambienti serverless, ottimizzando le performance per container e microservizi
* la specifica Contexts & Dependecy Injection for Java che è parte di [[Java EE]]
* il framework KumuluzEE offre un avvio rapido e un ''footprint'' leggero, rendendolo ideale per applicazioni cloud-native e microservizi, in particolare quando la semplicità e la conformità agli standard Jakarta EE sono preferibili rispetto alla maggiore complessità e personalizzazione offerte da Spring
* il ''framework'' Guice
* il Pico Container
=== .NET ===
* lo Unity Framework in [[.NET]]
* il ''framework'' Castle Windsor
* DryIoc IoC Container per .NET
== Note ==
<references/>
{{Design pattern}}
[[Categoria:Design pattern]]
| |||