Pourquoi le schéma d'injection de dépendance n'a-t-il pas été inclus dans le groupe des quatre?

37

Pourquoi le schéma d'injection de dépendance n'a-t-il pas été inclus dans la bande de quatre ? GOF a-t-il précédé les tests automatisés généralisés? L'injection de dépendance est-elle maintenant considérée comme un schéma central?

Tom Squires
la source
18
..parce que "l'injection de dépendance" n'est pas un motif!
Dipan Mehta
1
@DipanMehta stackoverflow.com/questions/823387/…
Tom Squires
14
Tout ce qui se répète forme un motif de répétition. Tous les éléments de conception (qui ne sont pas uniques, les idées folles) sont des "modèles".
S.Lott
3
Ces longues réponses sont probablement trompeuses, car elles valident en quelque sorte la question. Comme mentionné précédemment, l'injection de dépendance n'est pas un modèle de conception. C'est un "mécanisme" d'instanciation d'objet, généralement géré par la structure.
Nazar Merza
1
L'injection de dépendance est un motif . Il s'oppose au modèle de localisateur de service. Lisez Fowler qui a inventé le terme. Je ne sais absolument pas comment tant de gens ont voté contre un tel non-sens.
James

Réponses:

101

J'étais rédacteur en chef du magazine Software Development lorsque le livre Gang of Four est paru et je peux dire en toute confiance que les tests unitaires n'étaient pas une pratique répandue en 1994, lorsque Design Patterns a été publié à l'origine.

En 1994, C ++ était le langage orienté objet le plus couramment utilisé et la plupart des personnes le programmant provenaient d'un arrière-plan C. L’une des choses que les gens n’avaient tout simplement pas à faire est de penser à des centaines, voire des milliers de points d’entrée dans votre programme. Vous avez pensé à la main(). Si vous avez travaillé sur un grand projet, vous pourriez avoir un fichier makefile (généralement très élaboré) pour créer un programme basé sur des modules. Mais "tests unitaires"? Vous démarrez un processus, créez le contexte de mémoire nécessaire, exécutez-le et supprimez-le, méthode par méthode ? C'était très radical.

Java a rendu plus évidente la programmation de points d’entrée multiples. Au moment du boom initial de Dot-Com, les tests unitaires étaient une technique bien connue, mais c’est vraiment JUnit (vers 2001?) Qui l’a incendiée et est devenue une pratique universelle.

Bien que la stratégie et le concept général de programmation pour une interface fassent partie du GoF et du zeitgeist du milieu des années 90, l’idée de l’ injection est venue assez tard au parti (vers 2003-2005?). Honnêtement, mes cheveux gris sont encore assez douteux à propos de cet aspect de la DI ("Enlève-moi de ma pelouse, ma fichue configuration!").

Larry OBrien
la source
17
Je regrette de n'avoir qu'un seul vote à voter pour une réponse aussi perspicace.
@Larry OBrien: l'analyse des enregistrements basés sur des conventions simplifie grandement le code de configuration et élimine pratiquement la configuration xml dans les conteneurs ioc.
Quentin-Starin
4
J'aimerais ajouter que l'injection de dépendance en son cœur ne repose pas du tout sur des fichiers de configuration. Vous pouvez tout faire à la main, ce qui le rend très facile à utiliser et reste une approche très flexible.
marco-fiset
31

Ils l'appelaient stratégie .

Leur stratégie semble avoir toutes les caractéristiques de l'injection de dépendance sans le nom à consonance complexe.

S.Lott
la source
16
-1. Désolé! Le modèle de stratégie n'a rien à voir avec l'injection de dépendance.
Dipan Mehta
14
@Dipan: avant de procéder à cette analyse, réfléchissez bien à la réponse, cinq minutes.
Doc Brown
6
Il est vrai que l’injection de dépendance peut être considérée comme très similaire au modèle de stratégie, mais lorsque les gens disent injection de dépendance, ils désignent généralement l’inversion de contrôle, ce qui, à mon avis, est bien plus distinct de Strategy (notamment le conteneur IoC).
MattDavey
8
DI est plutôt un motif de création. Il crée et injecte des stratégies. Dire que c'est une stratégie n'est que la moitié de la vérité. DI est plus un motif de micro-noyau! Je n'en reviens pas. La stratégie s'apparente davantage à un trait d'une bonne ID, pas à une nécessité.
Falcon
0

Je pense que l'injection de dépendance est plus pertinente pour séparer la mise en œuvre en niveaux. Un autre domaine où nous pensons à l'injection de dépendance est le test unitaire. Et votre suggestion antérieure à la date semble être correcte. Si le gang devait collecter et séparer les schémas en 2012, l'injection de dépendance serait définitivement là.

Une stratégie pourrait être abordée lors des discussions mais cette stratégie ne parle pas d'injection de dépendance. Mais lorsque vous utilisez un modèle de stratégie dans un seul projet ou dans une dll (toutes les classes et interfaces restent dans un projet), il semble que nous procédions à une injection de dépendance. En fait nous ne sommes pas.

Maintenant, si les classes et les interfaces mentionnées dans le modèle de stratégie sont séparées dans différents projets ou niveaux, WE devra alors utiliser des techniques d'injection de dépendance. Nous pourrions utiliser des fichiers de configuration unitaires (aucun changement d’exécution possible cependant). Mais le modèle de stratégie ne dit pas comment injecter une dépendance.

S'il existe un modèle qui ressemble de près à l'injection de dépendance, il s'agit du modèle de méthode abstraite d'usine. Ce modèle pourrait être utilisé dans un modèle de stratégie pour injecter une dépendance.

Nuages ​​bleus
la source
2
Cela ne répond pas à la question. Veuillez lire la question initiale au lieu de répondre à d'autres réponses :)
Andres F.
-4

la réponse Stratégie est correcte à 100%. J'ai voté mais peux commenter.

"Strategy permet à l'algorithme de varier indépendamment des clients qui l'utilisent. [1] La stratégie est l'un des modèles inclus dans le livre influent Design Patterns de Gamma et al. Qui a popularisé le concept d'utilisation de modèles pour décrire la conception de logiciels."

Un motif de conception ne dépend pas de son utilisation. L'injection de dépendance est mise en œuvre à l'aide du modèle de stratégie. Si nous nommions chaque modèle en fonction du cas d'utilisation, nous devions renommer beaucoup de modèles.

Le modèle de référentiel n'est pas un nouveau modèle, c'est le modèle de modèle.

"Dans la méthode de modèle de ce modèle de conception, une ou plusieurs étapes de l'algorithme peuvent être remplacées par des sous-classes afin de permettre des comportements différents tout en garantissant que l'algorithme global est toujours suivi."

Les modèles sont souvent combinés et nommés par plusieurs modèles, tels que le modèle MVC.

GOF ne possédait pas d'interface avec les classes Pure Abstract utilisées et exploitait également la capacité du C ++ d'hériter de plusieurs classes.

Coach David
la source
1
Le but d'un motif est absolument important dans la distinction. Parmi les modèles GoF, Adapter et Proxy sont de bons exemples - ils ont la même forme, mais leur objectif est différent. Je ne suis pas non plus d'accord avec votre affirmation selon laquelle l'ID est mis en œuvre à l'aide de la stratégie; La stratégie est plus spécifique dans son but et la manière dont l'objet configuré est utilisé. Il est donc plus raisonnable de dire que la stratégie est mise en œuvre avec DI.
Jules