架构师训练营 No.2 周作业
作业一:
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则(Dependence Inversion Principle, DIP),包含如下的三层含义:
高层模块不应该依赖低层模块,两者都应该依赖其抽象
抽象不应该依赖细节
细节应该依赖抽象
问题由来:类 A 直接依赖类 B,假如要将类 A 改为依赖类 C,则必须通过修改类 A 的代码来实现。这种场景下,类 A 一般是高层模块,负责复杂的业务逻辑;类 B 和类 C 是底层模块,负责基本的原子操作;假如修改 A,会给程序带来不必要的风险。
解决方案:将类 A 修改为依赖接口 I,类 B 和类 C 各自实现接口 I,类 A 通过接口 I 间接与类 B 或者类 C 发生联系,则会大大降低修改类 A 的几率。
DIP 的本质:通过抽象(抽象类或接口)使各个类或模块实现彼此独立,不互相影响,实现模块间的松耦合。
DIP 的好处: 采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。
精简定义:面向抽象(抽象类或者接口)编程。
在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。
在软件设计中,高层模块依赖底层模块就像演艺公司依赖演员,底层模块对高层模块来讲不应该是强制被依赖的,也就是说当高层模块需要时进行对底层模块的调用。
作业二:
请描述一个你熟悉的框架,是如何实现依赖倒置原则的?
熟悉 Spring 框架的人都会听过 Spring 的 IoC(控制反转) 、DI(依赖注入)这两个概念。
IoC 是 spring 的核心,贯穿始终,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。所有的类都会在 spring 容器中登记,告诉 spring 你是个什么东西,你需要什么东西,然后 spring 会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 spring。
IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过 DI(依赖注入)来实现的。比如对象 A 需要操作数据库,以前我们总是要在 A 中自己编写代码来获得一个 Connection 对象,有了 spring 我们就只需要告诉 spring,A 中需要一个 Connection,至于这个 Connection 怎么构造,何时构造,A 不需要知道。在系统运行时,spring 会在适当的时候制造一个 Connection,然后像打针一样,注射到 A 当中,这样就完成了对各个对象之间关系的控制。
作业三:
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
优化后的类图如下图,CacheServiceImpl 类实现两个接口,IApplicationCacheService 接口包含 get put delete 暴露给应用程序,IRemoteCacheService 接口包含 rebuild 暴露给系统远程调用。从而实现接口隔离,使应用程序看不到 rebuild 方法
评论