Question Qu'est-ce que l'inversion de contrôle?


Inversion de contrôle (ou IoC) peut être assez confus quand il est d'abord rencontré.

  1. Qu'Est-ce que c'est?
  2. Quels problèmes résout-il?
  3. Quand est-ce approprié et quand non?

1426
2017-08-06 03:35


origine


Réponses:


Les modèles Inversion de contrôle (IoC) et Injection de dépendances (DI) concernent tous la suppression des dépendances de votre code.

Par exemple, dites que votre application dispose d'un composant d'éditeur de texte et que vous souhaitez effectuer une vérification orthographique. Votre code standard ressemblerait à ceci:

public class TextEditor {

    private SpellChecker checker;

    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

Ce que nous avons fait ici crée une dépendance entre TextEditor et le SpellChecker. Dans un scénario IoC, nous ferions plutôt quelque chose comme ceci:

public class TextEditor {

    private IocSpellChecker checker;

    public TextEditor(IocSpellChecker checker) {
        this.checker = checker;
    }
}

Dans le premier exemple de code, nous instancions SpellChecker (this.checker = new SpellChecker();), ce qui signifie TextEditor classe dépend directement de la SpellChecker classe.

Dans le deuxième exemple de code, nous créons une abstraction en ayant le SpellChecker classe de dépendance dans TextEditor signature constructeur (ne pas initialiser la dépendance en classe). Cela nous permet d'appeler la dépendance puis de la passer à la classe TextEditor comme ceci:

SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

Maintenant, le client crée le TextEditor classe a le contrôle sur lequel SpellChecker la mise en œuvre à utiliser parce que nous injectons la dépendance à la TextEditor Signature.

Ceci est juste un exemple simple, il y a une bonne série d'articles par Simone Busoli qui l'explique plus en détail.


1137
2017-08-06 07:22



Inversion de contrôle est ce que vous obtenez lorsque vos rappels de programme, par ex. comme un programme gui.

Par exemple, dans un menu old school, vous pourriez avoir:

print "enter your name"
read name
print "enter your address"
read address
etc...
store in database

contrôlant ainsi le flux d'interaction de l'utilisateur.

Dans un programme GUI ou quelque chose, nous disons plutôt

when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase

Alors maintenant le contrôle est inversé ... au lieu que l'ordinateur accepte l'entrée de l'utilisateur dans un ordre fixe, l'utilisateur contrôle l'ordre dans lequel les données sont entrées, et quand les données sont sauvegardées dans la base de données.

Fondamentalement, tout ce qui a une boucle d'événement, des rappels ou des déclencheurs d'exécution tombe dans cette catégorie.


495
2017-08-06 05:42



Qu'est-ce que l'inversion de contrôle?

Si vous suivez ces deux étapes simples, vous avez effectué une inversion de contrôle:

  1. Séparé quelleà faire partie de quandpartie à faire.
  2. Veiller à ce que quand partie sait comme peu que possible à propos de quelle partie; et vice versa.

Il existe plusieurs techniques possibles pour chacune de ces étapes en fonction de la technologie / langue que vous utilisez pour votre implémentation.

-

le inversion une partie de l'Inversion de Contrôle (IoC) est la chose déroutante; car inversion est le terme relatif. La meilleure façon de comprendre l'IoC est d'oublier ce mot!

-

Exemples

  • Gestion des événements. Gestionnaires d'événements (partie "quoi faire") - Evènements d'élévation (partie "à faire")
  • Interfaces Composant client (partie à faire) - Implémentation de l'interface de composant (partie à faire)
  • xUnit fixure. Setup et TearDown (partie à faire) - Appels de frameworks xUnit à l'installation au début et TearDown à la fin (partie à faire)
  • Modèle de conception de méthode de modèle. méthode de modèle partie de la tâche à effectuer - partie de la mise en œuvre de la sous-classe primitive
  • Méthodes de conteneur DLL dans COM. DllMain, DllCanUnload, etc (partie de quoi faire) - COM / OS (partie de-to-do)

359
2017-07-22 17:34



L'inversion des contrôles consiste à séparer les préoccupations.

Sans IoC: Tu as un portable ordinateur et vous cassez accidentellement l'écran. Et sacrément, vous trouvez le même écran d'ordinateur portable de modèle est nulle part sur le marché. Donc vous êtes coincé.

Avec IoC: Tu as un bureau ordinateur et vous cassez accidentellement l'écran. Vous trouvez que vous pouvez simplement saisir presque n'importe quel moniteur de bureau sur le marché, et cela fonctionne bien avec votre bureau.

Votre ordinateur de bureau implémente avec succès IoC dans ce cas. Il accepte une variété de moniteurs, alors que l'ordinateur portable ne le fait pas, il a besoin d'un écran spécifique pour se corriger.


89
2017-09-25 14:24



Inversion of Control, (ou IoC), est à propos de obtenir la liberté (Vous vous mariez, vous avez perdu la liberté et vous êtes contrôlé, vous avez divorcé, vous venez de mettre en place l'inversion de contrôle, c'est ce que nous appelons "découplé" ... Un bon système informatique décourage certaines relations très étroites.) plus de flexibilité (La cuisine de votre bureau ne sert que de l'eau du robinet, c'est votre seul choix quand vous voulez boire.) Votre patron a mis en place Inversion of Control en installant une nouvelle machine à café.Vous avez maintenant la possibilité de choisir l'eau du robinet ou le café. ) et moins de dépendance (Votre partenaire a un emploi, vous n'avez pas d'emploi, vous dépendez financièrement de votre partenaire, vous êtes donc contrôlé Vous trouvez un emploi, vous avez implémenté Inversion de contrôle Un bon système informatique encourage l'indépendance.)

Lorsque vous utilisez un ordinateur de bureau, vous avez asservi (ou dit, contrôlé). Vous devez vous asseoir devant un écran et le regarder. Utilisation du clavier pour taper et utiliser la souris pour naviguer. Et un logiciel mal écrit peut vous asservir encore plus. Si vous remplacez votre ordinateur de bureau par un ordinateur portable, vous avez inversé le contrôle. Vous pouvez facilement le prendre et vous déplacer. Alors maintenant, vous pouvez contrôler où vous êtes avec votre ordinateur, au lieu de contrôler votre ordinateur.

En implémentant Inversion of Control, un consommateur de logiciel / objet obtient plus de contrôles / options sur les logiciels / objets, au lieu d'être contrôlé ou d'avoir moins d'options.

Avec les idées ci-dessus à l'esprit. Nous manquons toujours une partie clé de l'IoC. Dans le scénario d'IoC, le logiciel / objet consommateur est un framework sophistiqué. Cela signifie que le code que vous avez créé n'est pas appelé par vous-même. Maintenant, expliquons pourquoi cette façon fonctionne mieux pour une application web.

Supposons que votre code soit un groupe de travailleurs. Ils ont besoin de construire une voiture. Ces travailleurs ont besoin d'une place et d'outils (un cadre logiciel) pour construire la voiture. UNE traditionnel cadre logiciel sera comme un garage avec de nombreux outils. Les travailleurs doivent donc faire eux-mêmes un plan et utiliser les outils pour construire la voiture. Construire une voiture n'est pas une affaire facile, il sera très difficile pour les travailleurs de planifier et de coopérer correctement. UNE moderne cadre logiciel sera comme une usine automobile moderne avec toutes les installations et les gestionnaires en place. Les travailleurs n'ont pas à faire de plan, les gestionnaires (une partie du cadre, ils sont les gens les plus intelligents et ont fait le plan le plus sophistiqué) aideront à coordonner pour que les travailleurs sachent quand faire leur travail. Les travailleurs doivent juste être suffisamment flexibles pour utiliser les outils que les gestionnaires leur donnent (en utilisant l'injection de dépendances).

Bien que les travailleurs donnent le contrôle de la gestion du projet au plus haut niveau aux gestionnaires (le cadre). Mais il est bon d'avoir des professionnels qui aident. C'est le concept de l'IoC qui vient vraiment.

Les applications Web modernes avec une architecture MVC dépendent du framework pour effectuer le routage d'URL et mettent des contrôleurs en place pour l'infrastructure à appeler.

L'injection de dépendance et l'inversion de contrôle sont liées. L'injection de dépendance est au micro niveau et Inversion de contrôle est au macro niveau. Vous devez manger chaque bouchée (mettre en œuvre DI) afin de terminer un repas (mettre en œuvre IoC).


80
2018-03-04 19:33



Avant d'utiliser Inversion of Control, vous devez être conscient du fait qu'il a ses avantages et ses inconvénients et vous devriez savoir pourquoi vous l'utilisez si vous le faites.

Avantages:

  • Votre code est découplé afin que vous puissiez facilement échanger des implémentations d'une interface avec des implémentations alternatives
  • C'est un puissant facteur de motivation pour le codage des interfaces au lieu des implémentations
  • Il est très facile d'écrire des tests unitaires pour votre code, car cela dépend de rien d'autre que les objets qu'il accepte dans son constructeur / setters et vous pouvez facilement les initialiser avec les bons objets en isolation.

Les inconvénients:

  • IoC n'inverse pas seulement le flux de contrôle dans votre programme, il l'assombrit considérablement. Cela signifie que vous ne pouvez plus lire votre code et passer d'un endroit à un autre car les connexions qui seraient normalement dans votre code ne sont plus dans le code. Il s'agit plutôt de fichiers de configuration XML ou d'annotations et du code de votre conteneur IoC qui interprète ces métadonnées.
  • Il y a une nouvelle classe de bogues où vous avez tort votre config XML ou vos annotations et vous pouvez passer beaucoup de temps à découvrir pourquoi votre conteneur IoC injecte une référence nulle dans un de vos objets sous certaines conditions.

Personnellement, je vois les points forts d'IoC et je les aime vraiment mais j'ai tendance à éviter IoC autant que possible car cela transforme votre logiciel en une collection de classes qui ne constituent plus un "vrai" programme mais juste quelque chose qui doit être assemblé par La configuration XML ou les métadonnées d'annotation tomberaient (et tomberaient) sans elle.


73
2018-02-12 14:31



  1. Article Wikipedia. Pour moi, l'inversion du contrôle transforme votre code séquentiellement écrit et le transforme en une structure de délégation. Au lieu que votre programme contrôle explicitement tout, votre programme crée une classe ou une bibliothèque avec certaines fonctions à appeler quand certaines choses arrivent.

  2. Il résout la duplication de code. Par exemple, dans l'ancien temps, vous écririez manuellement votre propre boucle d'événements, interrogeant les bibliothèques système pour de nouveaux événements. De nos jours, la plupart des API modernes indiquent simplement aux bibliothèques système les événements qui vous intéressent et vous permettent de savoir quand elles se produisent.

  3. L'inversion de contrôle est un moyen pratique de réduire la duplication de code, et si vous vous retrouvez en train de copier une méthode entière et de ne modifier qu'un petit morceau du code, vous pouvez envisager de l'aborder en inversant le contrôle. L'inversion du contrôle est rendue facile dans de nombreuses langues grâce au concept de délégués, d'interfaces ou même de pointeurs de fonctions brutes.

    Il n'est pas approprié de l'utiliser dans tous les cas, car le déroulement d'un programme peut être plus difficile à suivre lorsqu'il est écrit de cette façon. C'est un moyen utile de concevoir des méthodes lors de l'écriture d'une bibliothèque qui sera réutilisée, mais il devrait être utilisé avec parcimonie dans le cœur de votre propre programme, à moins qu'il ne résout vraiment un problème de duplication de code.


55
2017-08-06 04:33



Mais je pense que vous devez être très prudent avec cela. Si vous allez abuser de ce modèle, vous allez rendre la conception très compliquée et le code encore plus compliqué.

Comme dans cet exemple avec TextEditor: si vous n'avez qu'un seul SpellChecker, n'est-il pas vraiment nécessaire d'utiliser IoC? Sauf si vous avez besoin d'écrire des tests unitaires ou quelque chose ...

Quoi qu'il en soit: soyez raisonnable. Modèle de conception sont bonnes pratiques mais pas de la Bible à prêcher. Ne le colle pas partout.


39
2017-08-06 22:08



Supposons que vous êtes un objet. Et vous allez dans un restaurant:

Sans IoC: vous demandez "pomme", et vous êtes toujours servi la pomme quand vous demandez plus.

Avec IoC: Vous pouvez demander "fruit". Vous pouvez obtenir différents fruits chaque fois que vous êtes servi. par exemple, pomme, orange ou melon d'eau.

Donc, évidemment, IoC est préféré quand vous aimez les variétés.


35
2017-09-25 14:00



IoC / DI à moi est en train de pousser des dépendances aux objets d'appel. Super simple.

La réponse non-techy est d'être capable d'échanger un moteur dans une voiture juste avant de l'allumer. Si tout se raccorde bien (l'interface), vous êtes bon.


34
2017-09-19 02:54



  1. L'inversion de contrôle est un motif utilisé pour découpler des composants et des couches dans le système. Le modèle est implémenté en injectant des dépendances dans un composant lors de sa construction. Ces dépendances sont généralement fournies en tant qu'interfaces pour un découplage ultérieur et pour soutenir la testabilité. Les conteneurs IoC / DI tels que Castle Windsor, Unity sont des outils (bibliothèques) qui peuvent être utilisés pour fournir IoC. Ces outils fournissent des fonctionnalités étendues au-delà de la simple gestion des dépendances, notamment la durée de vie, l'AOP / Interception, la stratégie, etc.

  2. une. Atténue qu'un composant soit responsable de la gestion de ses dépendances.
    b. Fournit la possibilité d'échanger des implémentations de dépendances dans différents environnements.
    c. Permet à un composant d'être testé en se moquant des dépendances.
    ré. Fournit un mécanisme de partage des ressources à travers une application.

  3. une. Critique lors du développement piloté par les tests. Sans IoC, il peut être difficile à tester, car les composants testés sont fortement couplés au reste du système.
    b. Critique lors du développement de systèmes modulaires. Un système modulaire est un système dont les composants peuvent être remplacés sans nécessiter de recompilation.
    c. Critique si de nombreuses préoccupations transversales doivent être traitées, de manière parallèle dans une application d'entreprise.


23
2017-09-19 02:27