Ces jours-ci, une question m'est venue à l'esprit:
La façon dont nous Javascript va-t-elle à l'encontre de presque tout ce qui est considéré comme une bonne pratique dans le développement de logiciels traditionnel?
J'ai une série de questions / observations liées à cette déclaration, mais afin de respecter le format de StackExchange, il sera préférable de les diviser en différentes questions.
Module nécessitant
Le code Javascript standard ressemble de nos jours à:
const someModule = require('./someModule')
module.exports = function doSomethingWithRequest() {
// do stuff
someModule.someFunc()
// do other stuff
}
Les avantages
- Encapsulation: le module fonctionne de manière autonome et sait tout ce dont il a besoin pour exécuter ses fonctions.
- En tant que coloraire, il est plus facile pour les clients d'utiliser le module.
Désavantages
- Mauvaise testabilité: ceci est standard lorsque vous n'utilisez pas DI, mais dans les langages dynamiques, tels que Javscript, il peut être contourné * par des modules comme
mockery
ourewire
. - Il viole certainement le DIP - à ne pas confondre avec l'injection de dépendance. - puisque je ne peux importer que des modules concrets.
- Il viole probablement l' OCP - par exemple, imaginez que j'ai un module de journal qui écrit dans le système de fichiers (via le
fs
module). Si je veux étendre ce module de journalisation pour l'envoyer au réseau, ce serait très difficile.
* Cela peut fonctionner avec les modules CommonJS ou même AMD car ils sont implémentés principalement dans le pays utilisateur. Cependant, je ne sais pas comment cela pourrait être possible avec la import
syntaxe ES6 .
Injection de dépendance
En utilisant l'injection de dépendance, ce serait plus comme:
module.exports = function doSomethingWithRequest(someModule) {
// do stuff
someModule.someFunc()
// do other stuff
}
Les avantages
- Testabilité accrue: il est désormais plus facile de stub / mock
someModule
, même en utilisant la syntaxe ES6. - Il est possible d'honorer le DIP: pas nécessairement cependant, car le module client peut toujours être programmé pour la mise en œuvre et non une interface.
Désavantages
- Encapsulation brisée: la principale question qui reste est:
Ok, alors qui va créer / exiger les dépendances?
- Faire cela dans chaque client du module semble très mouillé .
- Cela nécessiterait probablement que j'utilise un conteneur DI afin d'être réalisable dans un projet réel.
Donc, la vraie question ici est:
Pourquoi les développeurs Javascript ont tendance à tendre vers la première approche?
Est-ce juste "la manière Javascript"?
J'écris moi-même du code comme ça la plupart du temps. J'ai eu ma part de configuration de test à l'aide de bibliothèques de simulation, mais cela m'a toujours semblé mal de le faire.
Suis-je en train de manquer quelque chose?