12
votes

Toute nécessité d'injection de dépendance dans des langues dynamiques?

Pour écrire un code C # testable, j'utilise di fortement.

Cependant, je me suis en train de jouer avec IronPython et j'ai constaté que, comme vous pouvez vous moquer de méthodes / classes / fonctions, etc. ... vous aimez, le besoin de di est parti. p>

est-ce le cas des langagues dynamiques telles que Python? P>

au lieu de: p>

class Person() {
...
    // Address initialised in here.


1 commentaires

Cela semble être un duplicata de la question .. Stackoverflow.com/Questtions/2273683/...


4 Réponses :


10
votes

L'injection de dépendance est également sur la manière dont vous faites de la manière dont vous faites des choses, qui n'a rien à voir sur la moqueur des objets dépendants. Il y a une différence entre avoir un foo -Instance qui nécessite une barre -connection de certains le genre instancez-le directement et le permettez-le d'ignorer complètement comment il < em> obtient cette connexion tant que cela a it.

Si vous utilisez une injection de dépendance, vous aussi gagnez une meilleure vérification. Mais l'inverse n'est pas vrai. Testabilité plus facile en pouvant écraser tout ce qui n'apporte pas les autres avantages de l'injection de dépendance. Il existe de nombreux composants / di-cadre pour Python disponibles exactement pour ces raisons.


1 commentaires

Quels sont les "autres avantages" de l'injection de dépendance?



-2
votes

Je pense que vous présentez une question qui semble être la meilleure pratique, mais est en fait sur la performance de l'exécution.

Débarrassez-vous de l'injection de dépendance? Comment un gestionnaire de libété de logiciel peut-il dormir la nuit? P>

Les tests de fonction à effectuer doivent sûrement ralentir le programme sur une ou deux Tads. P>

// my generic function entry point - IronPython
if func="a":
  ...
if func="b":
  ...
if func="c":
  ...


1 commentaires

Lire cela m'a laissé confus.



10
votes

Je suis fortement en désaccord avec votre déclaration que l'injection de dépendance n'est pas nécessaire dans des langues dactylographiées dynamiquement. Les raisons pour lesquelles di sont utiles et nécessaires sont complètement indépendants de la discipline de frappe de la langue.

La principale différence est que di dans les langues dactylographiées dynamiquement est facile et sans douleur: vous n'avez pas besoin d'une framework poids lourd et d'une gagnition de lignes de configuration XML.

en rubis, par exemple, il n'y a que deux cadres di. Les deux ont été écrits par un programmeur Java. Aucun des deux cadres n'est utilisé par un projet Single . Pas même par l'auteur de ces cadres.

Cependant, DI est utilisé partout dans Ruby.

Jamis Buck, qui est l'auteur de ces deux cadres donna un discours appelé Récupération de l'entreprise à RubyConfr 2008 sur la façon dont et pourquoi il a écrit ces cadres et pourquoi c'était une mauvaise idée, qui vaut la peine d'être observée. Il y a aussi un Poste de blog d'accompagnement si Vous souhaitez lire. (Il suffit de substituer "Python" à chaque fois qu'il dit "Ruby" et tout sera aussi valide.)


4 commentaires

"Gazillion" n'est-il pas une exagération? J'utilise très lourdement en C # et j'utilise très peu, le cas échéant, de la configuration XML.


Oui, tout est certainement une exagération. C'est aussi une exagération obsolète, car les cadres post-.net2 et post-Java5 DI ont tendance à utiliser des attributs / annotations au lieu de XML. L'idée de base est la suivante: le câblage des choses de manière dynamique dans Java ou C # est difficile. C'est pourquoi il est logique d'utiliser un cadre DI: je ne me soucie pas d'analyser XML ou des annotations / attributs de traitement, donc je laisse quelqu'un d'autre faire le travail, qui aime ce genre de choses. Mais dans Python ou Ruby, tout est Toujours Wired up dynamiquement, de toute façon . La langue la langue est déjà un cadre DI. Pas besoin de mettre un autre sur le dessus.


Une autre façon d'y penser: Que fait un cadre DI? Il glisse ensemble des composants indépendants. Et qu'est-ce que nous appelons habituellement des composants indépendants collants ensemble? Scrips! Et comment déterminent-il quoi faire? Il lit un fichier XML ou un ensemble d'annotations. Et qu'est-ce que nous appelons habituellement un ensemble d'instructions qui racontent comment coller les choses ensemble? Un script! Et la chose qui exécute ces instructions est un interprète de script. Donc, un cadre DI n'est qu'un interprète pour un (généralement assez merdique, surtout lors de l'utilisation de la langue de script XML). Mais dans Python, nous déjà avez-vous ce: python!


Pas de xml dans mon Ninject / StructureMap et d'autres conteneurs de la COI ... Désolé mais avec un développement moderne dans .NET MVC3 / MVC4 Il est super simple. XML Yuck, les 90's appelées et veulent leur code XML en arrière (j'exagère, mais je ne fais pas zéro configuration XML avec NInject et Structurmap). Mais oui, vous avez raison dans la question de l'opération sur DI avec des langues dynamiques est une bonne pratique.



0
votes

Je vais essayer à nouveau. Ma dernière réponse a manqué la question de la question d'un kilomètre et d'un point de vue zoomé.

Utilisation de pseudo-code, l'injection de dépendance affirme avec: xxx

et avec: xxx

,., et généralement dans la mise en place de l'objet et l'appel dans différents fichiers à des fins SCM.

si "x", "Y" ou " Z "sont moqueurs (... s'ils étaient à la place des objets ... (!) ... (!) ...) N'avez rien du tout à faire avec si je suis bon. Vraiment. : -)

di est simplement plus facile dans Python ou Ruby, comme beaucoup d'autres tâches, car il y a plus d'une approche de script, comme le dit Jörg; Et bien sûr, moins une culture et une tendance à dire que les constantes et les adaptateurs doivent être renseignés dans des modèles et des constantes mondiales.

en termes pratiques pour moi, c'est la première étape vers la séparation de ces paramètres d'application, Les constantes d'API et les usines dans des fichiers séparés pour aider à rendre votre rapport de suivi de révision moins semblable à Spaghetti ("étaient ces Checkins supplémentaires sur l'AppController pour modifier la configuration .. ou pour mettre à jour le code ...?") Et plus d'informations, et plus facile à lire.

Ma recommandation: Continuez à utiliser di ...: -)


0 commentaires