有如下代码:
/**
* B中代码的实现是依赖A的,两者之间的耦合度非常高,当两者之间的业务逻辑复杂程度增加的情况下
* 维护成本与代码的可读性都会随着增加,并且很难再多引入额外的模块进行功能扩展
*/
class A {
name: string
constructor(name:string){
this.name = name;
}
}
class B {
age: number
entity: A
constructor (age: number) {
this.age = age;
this.entity = new A ('test');
}
}
const c = new B(18);
console.log(c.entity.name);
可以看到:B中代码的实现是依赖A的,两者之间的耦合度非常高,当两者之间的业务逻辑复杂程度增加的情况下,维护成本与代码的可读性都会随着增加,并且很难再多引入额外的模块进行功能扩展。
修改如下:
// 通过中间件方式来收集依赖,实现解耦,减少维护成本
class A {
name: string
constructor(name: string){
this.name = name;
}
}
class C {
name: string
constructor(name: string){
this.name = name;
}
}
// 中间件用于解耦
class Container {
modules: any
constructor () {
this.modules = {};
}
provide(key: string, modules: any){
this.modules[key] = modules;
}
get(key:string){
return this.modules[key];
}
}
// 实例化中间件类,依赖注入
const mo = new Container();
mo.provide('a', new A('test1'));
mo.provide('c', new C('test2'));
class B {
a: any
c:any
constructor(container: Container){
this.a = container.get('a');
this.c = container.get('c');
}
}
const b = new B(mo);
console.log(b.a.name);
console.log(b.c.name);
这次我们新建了中间控制器Container,解耦了B与A、C的关系。
刚刚举的这个例子,就是典型的通过框架来实现“控制反转”的例子。框架提供了一个可扩展的代码骨架,用来组装对象、管理整个执行流程。程序员利用框架进行开发的时候,只需要往预留的扩展点上,添加跟自己业务相关的代码,就可以利用框架来驱动整个程序流程的执行。
这里的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。
实际上,控制反转是一个比较笼统的设计思想,并不是一种具体的实现方法,一般用来指导框架层面的设计。这里所说的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程通过框架来控制。流程的控制权从程序员“反转”给了框架。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。