写点什么

架构师训练营 - 第二周作业

用户头像
Mark
关注
发布于: 2021 年 01 月 07 日

1. 什么是依赖倒置

1.0 定义

依赖倒置的概念比较简单,高层次不应该依赖低层次的实现,而是应该依赖于一个接口,低层次实现这个接口。而这个接口是属于高层的。

要深入理解这个概念,就必须定义清楚什么是层次的高低(很多人对这些概念是通过直觉来理解的,类似的还有,什么是【职责】)。

当我们说两个事物的层次存在高低差,指的是两个事物之间存在【整体】和【部分】的关系。

1.1 一个现实世界中的例子

比如一个技术团队和团队中的研发工程师,技术团队由工程师组成,技术团队相对于工程师是高层次的。技术团队承接项目,而工程师负责研发维护项目中的某个模块或某些功能。

这里可能存在的依赖和问题有:

  1. 技术团队依赖工程师的研发能力,如某个技术点只有某人会,或者某个业务逻辑只有某个人了解。那么当这个员工离职时,团队的开发进度和质量就会受到影响。

  2. 工程师依赖技术团队积累的技术栈,工作流和开发工具,那么这个工程师离开技术团队后,其开发能力就会大大受限,成为只能服务于特定团队的工程师。

解决上述问题的方法就是定义技术规范和工程师能力矩阵模型,即技术团队“调用”工程师的“接口”。技术团队不依赖于具体的某个工程师,而是针对职责定义能力模型矩阵,符合能力模型矩阵的工程师经过业务培训,就可以胜任这个岗位。在项目开发过程中,项目的模块和功能被定义为设计文档,技术的使用方法被定义为技术规范,工程师在开发时实现这些设计和规范,开发任务就可以被拆解,项目交付后,只要维护人员熟悉和理解文档,就可以维护代码,这样就降低了项目的维护成本。

而对于工程师来说,他们通过实现这些“接口”,可以更清晰的了解自己的技术能力和所处的水平,更重要的是对如何实现自我提升,也有了方向。

这样便实现了依赖倒置。

1.2 依赖倒置,依赖注入与依赖注入框架

说道依赖倒置,就不得不提依赖注入,因为二者有着千丝万缕的联系。依照惯例,还是先从定义入手,对概念进行辨析,再描述二者之间的关联与区别。

依赖倒置是一个面向对象设计原则。只要现实当中的两个对象存在整体和部分的关联,我们就可以使用依赖倒置原则来帮助我们解耦两个对象之间的耦合。

依赖注入是实现依赖倒置的一种方法。其使用场景是我们需要管理较多的依赖关系,且依赖关系本身成树状或网状。思路是我们将依赖关系交给依赖注入容器集中管理,当我们需要一个对象时,依赖注入容器可以根据配置,自动装配出符合配置的对象。

依赖注入框架 是依赖注入的具体实现。除了最出名的 Spring 之外,许多语言的许多框架其实都实现了依赖注入,通过对比会发现,它们的设计思路,实现手段和使用方法都不尽相同:

  • Yii2/di - PHP 依赖注入为 Web 框架服务,功能强依赖于框架定义的 BaseObject 类

  • Google/wire - Go 利用了 Golang 编译器的特性,实现代码生成器,通过依赖关系自动生成 golang 代码

  • goava/di - Go 轻量级 DI 框架,用户自定义构造函数和定义依赖,框架利用反射机制,在运行时根据依赖关系创建对象


总结起来就是,使用依赖注入一定可以实现依赖倒置,但实现依赖倒置不一定需要使用依赖注入框架。

而如果限定必须使用特定依赖注入框架来实现依赖倒置,这样的设计本身是不符合依赖倒置原则的。


2. 如何拆分 Cache 类


根据接口隔离原则,Cache 类具有两个使用场景。1)生命周期维护 2)读写数据。

因此,针对两个场景分别定义两个接口 ICacheManger 和 ICache,Cache 类实现这两个接口。在使用时,用户应当使用对应接口的引用,而不应直接使用 Cache 对象的引用。

具体设计如下:



发布于: 2021 年 01 月 07 日阅读数: 34
用户头像

Mark

关注

还未添加个人签名 2019.06.22 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营-第二周作业