微信号:zte-wxcop

介绍:WXCOP(无限靠谱)研发实践社区——聚焦互联网时代可持续快速交付价值能力提升; 知识交流与传播,社区活动信息发布的平台

【微课】软件设计 第六课 SOLID原则之单一职责

2015-09-08 07:24 范璟玮
点击上方 “WXCOP”可以订阅哦!

回顾
到上一课为止正交四原则已经全部介绍完毕,本次课程开始将介绍SOLID原则。回忆一下第一课中的洋葱环,SOLID原则位于正交四原则的外层,因此SOLID原则比正交四原则更具体,对于实践也更具指导意义。本次课程将对其中的单一职责原则(SRP:Single responsibility principle)进行介绍。
第六课 SOLID原则之单一职责
在面向对象中单一职责原则描述为:“就一个类而言,应该仅有一个引起它变化的原因”,同理在面向过程中将“类”替换为“函数”同样适用。要深刻理解单一职责原则必须首先认清这样一个问题:具有单一职责的代码提高了还是降低了代码的重用性?由于在我们生活中使用了大量集成工具(如N合1瑞士军刀)我们可能会产生这样一种直觉:功能越多则其应用范围越广,因此重用性越高。于是我们将这种直觉不自觉的应用到软件开发中,从而产生了大量如下图的重用单元。
事实上当我们产生出这样的重用单元并在多种场景下被重用时,“发散式变化”这一臭味已经慢慢在代码中扩散开来。每一个重用或修改这个单元的人都必须小心翼翼以提防“意外惊喜”。或许我们应该将重用重新定义为:“不加修改的使用,并且使用时不存在冗余代码。”当我们从SVN的记录上发现一个函数总是被反复修改时就应当警惕并考虑其是否承担了太多的职责。

下面我们通过一个例子来说明当不遵循单一职责原则时可能产生的问题。
在上图的类图中Retangle类具有两个方法:一个是把矩形绘制到屏幕上,另一个是计算矩形面积。当一个应用(Graphical Application)需要绘制一个矩形时重用Rectangel似乎没有什么问题,但当应用(Computational Geometry Application)仅仅想重用矩形类进行几何计算时就会产生非预期的依赖:几何计算时并不需要包含GUI,这一非预期依赖增加了代码的耦合度,降低了代码的维护性。一个较好的设计是把这两个职责分离,产生如下类图。
现在GUI的变化不会再对Computational Geometry Application产生影响了。

总结一下,多职责的类/函数可能可以在很大范围内“重用”,但是这种重用是具有副作用的,它会产生不必要的依赖并且使它具有多个被修改的动机,因此不遵循单一职责原则的代码其本身往往体现出“发散式变化”这一坏味道,而使用它的代码则可能体现出“散弹式修改”这一坏味道。而当一个具有多种职责的类/函数在历经多年风雨最终被维护人员供上神坛后就会孕育出了“重复”。

关于SOLID原则在很多书中都有描述,在此向大家推荐由邓辉大师翻译的《敏捷软件开发——原则、模式与实践》一书。

小贴士

回复“软件”二字可查看软件设计微课系列文章。


 
WXCOP无限靠谱 更多文章 WXCOP:"Hello World!" 【搬新家,第一弹】什么是影响力? 【搬新家,第二弹】如果程序员的世界里没有条件判断语句 【最佳实践】如何通过新颖的敏捷回顾会 激发团队士气 “代码PK”,不服?来战!
猜您喜欢 专访搜狗输入法 iOS 版开发负责人李腾杰:第三方输入法开发与优化实践 浮点类型的整数运算规则 使用Icinga2和Icinga Web2搭建监控服务 【数据人】九条吐血经验 【转】来自苹果的编程语言——Swift简介