前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于控制反转的一些想法

关于控制反转的一些想法

原创
作者头像
挥刀北上
修改2024-04-23 10:58:31
870
修改2024-04-23 10:58:31
举报
文章被收录于专栏:编程思维编程思维

有如下代码:

代码语言:java
复制
/**
*  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的,两者之间的耦合度非常高,当两者之间的业务逻辑复杂程度增加的情况下,维护成本与代码的可读性都会随着增加,并且很难再多引入额外的模块进行功能扩展。

修改如下:

代码语言:javascript
复制
// 通过中间件方式来收集依赖,实现解耦,减少维护成本
 
 
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档