这些天来,我脑海中浮现出一个问题:
我们的Javascript方法是否与传统软件开发中被认为是好的做法的几乎所有东西背道而驰?
我有一系列与此陈述有关的问题/意见,但是为了遵守StackExchange的格式,将它们分成不同的问题会更好。
模块要求
如今的标准Javascript代码如下所示:
const someModule = require('./someModule')
module.exports = function doSomethingWithRequest() {
// do stuff
someModule.someFunc()
// do other stuff
}
好处
- 封装:模块独立工作,并且知道执行其功能所需的一切。
- 作为一种颜色,客户可以更轻松地使用该模块。
缺点
- 可测试性差:在不使用DI时这是标准配置,但在动态语言(例如Javscript)中,可以通过*
mockery
或模块来规避*rewire
。 - 它确实违反了DIP-请勿与依赖注入混淆。-因为我只能导入具体模块。
- 它可能违反了OCP-例如,假设我有一个日志模块(通过
fs
模块)写入文件系统。如果我想扩展此日志模块以将其发送到网络,那将非常困难。
*这可能与CommonJS甚至AMD模块一起使用,因为它们大部分是在用户领域实现的。但是,我不确定使用ES6 import
语法怎么可能。
依赖注入
使用依赖注入,它将更像是:
module.exports = function doSomethingWithRequest(someModule) {
// do stuff
someModule.someFunc()
// do other stuff
}
好处
- 可测试性增强:现在
someModule
,即使使用ES6语法,也可以更轻松地进行存根/模拟。 - 这是可能兑现DIP:不一定但是,作为客户端模块仍然可以通过编程来实现的,不能的接口。
缺点
- 封装破损:剩下的主要问题是:
好的,那么谁来创建/获取依赖关系?
- 这样做,在模块的每一个客户似乎很湿。
- 为了在实际项目中可行,这可能需要我使用DI容器。
因此,这里的真正问题是:
为什么Javascript开发人员倾向于采用第一种方法?
这仅仅是“ JavaScript方式”吗?
我自己大部分时间都是这样编写代码的。我使用模拟库分享了相当多的测试设置,但是这样做总是很不对劲。
我想念什么吗?