暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OOP七大设计原则的Python实现--依赖倒置原则

稻壳编程 2019-12-02
701

作者简介

211工程院校贵州大学管理学院硕士研究生、互联网金融行业资深DevOps研发工程师. 曾在国内多家知名互联网公司 平安科技、微众银行、顺丰科技、魅族任职. 具有多年国内一线互联网公司自动化运维平台设计与开发经验。



OOP七大设计原则的Python实现

依赖倒置原则

前言:

        每个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑称之为低层模块,在Python中用抽象类来表示,由原子逻辑组装而成的就是高层模块,抽象类是不能被实例化的。细节就是实现类,通过继承抽象类而产生的类就是细节,是可以被直接实例化的。一言以蔽之,采用依赖倒置原则可以减少类间的耦合性、提高系统的稳定性、提高代码的可读性和可维护性。依赖倒置原则包含如下三层含义:

  • 高层模块(由原子逻辑组装而成)不应该依赖低层模块(不可分割的原子逻辑), 两者都应该依赖抽象

  • 抽象(抽象类)不应该依赖细节(实现类)

  • 细节应该依赖抽象

 1 

依赖倒置原则究竟倒置在哪里?

"倒置"指的是和一般面向对象的代码的设计思考方式完全相反。举个例子,假设现在要建设一个汽车城,首先会想到的是这里会卖很多品牌的汽车。如奔驰、宝马、奥迪、沃尔沃等。汽车城是上层模块,汽车是下层模块。如下图所示:

利用上图模块间依赖关系设计的代码,当每新增一个品牌的汽车(低层模块),汽车城(高层模块)就多了一个新的依赖;汽车城(高层模块)依赖所有品牌的汽车(低层模块),因为它直接创建汽车;对于不同品牌的汽车(低层模块)具体实现的任何改变都会影响到汽车城(高层模块),这就违背了依赖倒置原则。根据依赖倒置原则,高层模块不应该依赖低层模块,两者都应该依赖抽象。也就是说汽车城这个高层模块是不应该依赖汽车品牌这个低层模块的,所以代码设计思路应该从下层模块开始思考并对其进行抽象。如下图所示:
这样就很好的解释了“上层模块不应该依赖底层模块,它们都应该依赖于抽象”这一概念,在最开始的设计中,高层模块(汽车城)直接依赖低层模块(不同品牌的车),调整设计后高层模块和低层模块都依赖于抽象(小汽车)。

 2 

依赖倒置原则应用

先不考虑依赖倒置原则,假设有如下类图所描绘的场景

由以上类图所描绘的场景可知,司机类和奔驰车类都属于细节,并没有实现或继承抽象。它们是对象级别的耦合。通过类图可知司机类Driver有一个用来开车的drive()方法, Benz类有一个表示车辆运行的run()方法, 并且奔驰车类Benz依赖于司机类Driver,用户模块Client是一个高层模块,负责调用司机类Driver和奔驰车类Benz。未采用依赖倒置原则的代码如下:

这是最不灵活的写法,如果驾驶员的车库中新增了一辆bmw,新车无法上路。 继续修改代码如下:

以上代码中,如果benz或bmw的运行方法不是run,那么将会报错。此时需要将Car类的run方法进行抽象,来对子类进行约束。上面代码的设计没有使用依赖倒置原则,我们已经郁闷的发现,模块与模块之间耦合度太高、生产力太低,只要需求一变就会面临代码的大面积重构。现在引入依赖倒置原则,重新设计的类图如下:

示例代码:

 3 

结束语

如果本文可以对您的工作学习带来帮助,请扫描左侧赞赏码以资鼓励作者;文章勘误请扫描右侧二维码联系作者。



文章转载自稻壳编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论