SOLID总结(未完待续)
SOLID原则是著名的面向对像设计五原则,之所以要引入这些原则,是为了给以防止代码腐化而进行的重构活动定下切实可行的目标。
随着系统开发的进行,产品代码不可避免地会不断腐化,就算在开发过程中很好地应用了TDD、持续集成等优秀实践,也无法避免。
腐化的臭味有:
1、僵化-当需求发生变化时,我们要对多个模块进行修改,这主要是在设计层面的问题,因为开发者接到该变更时,就知道有哪些模块要修改了。
2、脆弱-当需求发生变化时,开发者可能知道要改某一个模块,但在修改过程中,他发现由于实现上的原因,改了这个模块后,不得不去修改其它模块,否则整个系统将无法工作。
3、顽固-当开发者发现某一模块中所实现的某一功能也是另一模块所要实现的,但仍然不得不为另一模块重新开发一次,因为要复用之前模块中的代码是相当困难的。
4、粘滞-包括开发环境上的原因导致的粘滞,也包括系统设计上的粘滞(开发环境上的粘滞较容易理解,比如按照编程规范,修改某一变量需要在一头文件中,但头文件的修改会导致大量源码的重新编译,因而会耗费大量的时间,而如果在源码文件中修改相应的代码部份,只需要编译一个文件,编译时间大大缩短,也提高了短时间内的工作效率,但由此埋下的隐患即是当其他人要全量修改相应部份时,会遗漏这个地方。)可以看到开发者知道正确的做法是什么,可由于某种原因导致他用了不规范的做法,这就是由于环境带来的粘滞性。
5、不必要的复杂性-这里主要讲设计复杂性,比如为了满足客户的某个需求,只需要方案A即可,但开发人员自作聪明觉得也许客户明天要另一个需求,然后他把方案B也加进去了。也许这真的会中,但从整体来讲,这样做增加了系统设计的复杂性,也许客户以后根本不会要求增加另一个需求,这样的设计就是多余的。
6、不必要的重复-COPY PASTE问题。
7、晦涩-代码让人看不懂,其实代码可以写得通俗易懂,就像小说家写小说或者散文家写散文。
这些腐化的臭味有些是设计上的,有些是实现上的,如果任由它们不满曼延,整个产品将最终变得难以维护且漏洞百出。我全部罗列了出来,其实理解得都不算深刻,还需要在实践中不断体会玩味。
这些臭味就像是病人身上表现出来的症状,医生很快能识别出来这个人生病了,而且病得不轻。接下来就是要进行诊断并对症下药了。
如何诊断呢?就是运用SOLID,来看系统到底违反了哪些原则才导致他出现这些病症。
1、单一职责原则 Single Resposibility
具体内容:如果某一需求发生变化,导致类A发生变化,那说明这一需求变化是导致A变化的因素,如果还有另一个需求变化使得A变化,那么导致A变化的因素就有两个,这就违返了单一职责原则,这里的职责应该理解为导致A变化的因素。
如何医治:将类A进行分离设计,以满足单一职责原则。
违反单一职责原则将会产生哪些臭味?
2、开闭原则 Open-Close
具体内容:
如何医治:
3、里氏替换原则 Liskov Substitution
具体内容:
如何医治:
4、接口隔离原则 Interface Segregation
具体内容:
如何医治:
5、依赖倒置原则 Dependency-Inversion
具体内容:
如何医治:
SOLID总结(未完待续)的更多相关文章
- IOS之KVC和KVO(未完待续)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- javascript有用小功能总结(未完待续)
1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...
- ASP.NET MVC 系列随笔汇总[未完待续……]
ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...
- 关于DOM的一些总结(未完待续......)
DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)
virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...
- MVC丶 (未完待续······)
希望你看了此小随 可以实现自己的MVC框架 也祝所有的程序员身体健康一切安好 ...
- 一篇文章让Oracle程序猿学会MySql【未完待续】
一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...
- [python]爬代理ip v2.0(未完待续)
爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...
- C++语言体系设计哲学的一些随想(未完待续)
对于静态类型语言,其本质目标在于恰当地操作数据,得到期望的值.具体而言,需要: (1)定义数据类型 你定义的数据是什么,是整形还是浮点还是字符.该类型的数据可以包含的值的范围是什么. (2)定义操作的 ...
随机推荐
- BZOJ1744: [Usaco2005 oct]Skiing 奶牛滑雪
n<=100 * m<=100的地图,每个数绝对值不超过25,从1,1到n,m,一开始速度v,从数字A走到数字B速度会变成v*2^(A-B),求到终点最短时间. 可以发现,相同的数字出发的 ...
- SeaJS项目完整实例【转】
index.html——主页面. sea.js——SeaJS脚本. init.js——init模块,入口模块,依赖data.jquery.style三个模块.由主页面载入. data.js——data ...
- 洛谷——P2256 一中校运会之百米跑
P2256 一中校运会之百米跑 题目背景 在一大堆秀恩爱的**之中,来不及秀恩爱的苏大学神踏着坚定(?)的步伐走向了100米跑的起点.这时苏大学神发现,百米赛跑的参赛同学实在是太多了,连体育老师也忙不 ...
- MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate
一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...
- windows 平台使用wireshark命令行抓包
Windows网络流量大,或则需要长时间抓包时,wireshark图形界面使用起来比较麻烦 wireshark 内置 dumpcap命令 Capture interface: -i <inte ...
- java比较两个日期大小
方法一 /** * 比较两个日期之间的大小 * * @param d1 * @param d2 * @return 前者大于后者返回true 反之false */ public boolean com ...
- 学习swift从青铜到王者之swift闭包06
语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...
- 解决安装oracle11g r2时提示pdksh conflicts with ksh-20100621-2.el6.i686问题
http://blog.csdn.net/linghao00/article/details/7943740 http://www.2cto.com/os/201306/218566.html 在Ce ...
- 【网络】TCP的流量控制
一.利用滑动窗口实现流量控制 流量控制是让发送方的发生速率不要太快,要让接收方来得及接收. 发送方的发送窗口不能超过接收方给出的接收窗口的数值,TCP的窗口单位是字节,不是报文段. TCP为每一个连接 ...
- Word 2013安裝字典
不必從內建的字典中開始,Word 2013 可將您連結到 Office 市集,方便您挑選免費的字典,或從包括多語字典的字典集合中購買. 若要選擇並安裝您想要的字典,請以滑鼠右鍵按一下任何單字,並按一下 ...