In questi giorni mi è venuta in mente una domanda:
Il modo in cui Javascript va contro quasi tutto ciò che è considerato una buona pratica nello sviluppo di software tradizionale?
Ho una serie di domande / osservazioni relative a questa affermazione, ma per rispettare il formato di StackExchange, sarebbe meglio se le dividessi in domande diverse.
Modulo richiesto
Oggi il codice Javascript standard assomiglia a:
const someModule = require('./someModule')
module.exports = function doSomethingWithRequest() {
// do stuff
someModule.someFunc()
// do other stuff
}
vantaggi
- Incapsulamento: il modulo funziona da solo e conosce tutto ciò di cui ha bisogno per svolgere le sue funzioni.
- Come colorario, è più facile per i clienti usare il modulo.
svantaggi
- Scarsa testabilità: questo è standard quando non si utilizza DI, ma in linguaggi dinamici, come Javscript, può essere eluso * da moduli come
mockery
orewire
. - Certamente viola il DIP - da non confondere con l'iniezione di dipendenza. - dal momento che posso importare solo moduli concreti.
- Probabilmente viola l' OCP - ad esempio, immagina di avere un modulo di registro che scrive nel file system (tramite il
fs
modulo). Se voglio estendere questo modulo di registro per inviarlo alla rete, sarebbe molto difficile.
* Questo potrebbe funzionare con CommonJS o persino con i moduli AMD poiché sono implementati principalmente nella terra dell'utente. Tuttavia, non sono sicuro di come ciò sia possibile con la import
sintassi ES6 .
Iniezione di dipendenza
Usando l'iniezione di dipendenza, sarebbe più simile a:
module.exports = function doSomethingWithRequest(someModule) {
// do stuff
someModule.someFunc()
// do other stuff
}
vantaggi
- Maggiore testabilità: ora è più facile stub / deridere
someModule
, anche usando la sintassi ES6. - È possibile onorare il DIP: non necessariamente, poiché il modulo client può ancora essere programmato per l'implementazione e non un'interfaccia.
svantaggi
- Incapsulamento rotto: la domanda principale che rimane è:
Ok, allora chi creerà / richiederà le dipendenze?
- Farlo in ogni client del modulo sembra molto WET .
- Ciò probabilmente mi richiederebbe di utilizzare un contenitore DI per essere fattibile in un progetto reale.
Quindi, la vera domanda qui è:
Perché gli sviluppatori Javascript tendono ad appoggiarsi al primo approccio?
È solo "il modo Javascript"?
Io stesso scrivo codice come questo la maggior parte delle volte. Ho avuto la mia giusta dose di configurazione di test usando librerie beffardo, ma mi è sempre sembrato sbagliato farlo.
Mi sto perdendo qualcosa?