依赖倒置原则是否必须使用接口?TypeScript场景探讨
关于TypeScript中依赖倒置原则的疑问
我看过多种编程语言里SOLID原则中**依赖倒置(Dependency Inversion)**的经典示例,比如下面这段代码就是典型的类A直接依赖类B的场景:
// A 依赖于 B class A { property; constructor() { this.property = (new B()).property; } } new A();
几乎所有示例都会用接口的等效方式来实现依赖倒置,比如这样:
interface Dependency { property: string } class B implements Dependency { ... } // A 不再直接依赖于 B class A { property; constructor(dep: Dependency) { this.property = dep.property; } } new A(new B());
在我看来,接口(或者其他语言里的抽象类)的核心用途其实是辅助测试——很多语言需要这类机制,才能让测试框架注入模拟(mock)版本替代原始实现来完成测试。
当然,使用接口也允许在运行时切换不同的实现,但根据我的经验,我写的99%的代码里,大部分类都只需要特定结构的精确依赖,很少会去编写另一个实现同一接口但功能不同的类,这种需求也几乎不会随时间变化。
我在编写TypeScript单元测试时,不用接口也能通过多种方式模拟依赖。那既然我只会有一个运行时实现,接口对于依赖倒置原则来说是不是必需的?
另外还有一个疑问:在TypeScript(以及无类型的JavaScript)中,依赖倒置原则是不是真的像下面这段代码这么简单?
// A 不再依赖于 B? class A { property; constructor(b: B) { this.property = b.property; } } new A(new B());
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

