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总结(未完待续)的更多相关文章

  1. IOS之KVC和KVO(未完待续)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  2. javascript有用小功能总结(未完待续)

    1)javascript让页面标题滚动效果 代码如下: <title>您好,欢迎访问我的博客</title> <script type="text/javasc ...

  3. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  4. 关于DOM的一些总结(未完待续......)

    DOM 实例1:购物车实例(数量,小计和总计的变化) 这里主要是如何获取页面元素的节点: document.getElementById("...") cocument.query ...

  5. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  6. virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)

    virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...

  7. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  8. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  9. [python]爬代理ip v2.0(未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  10. C++语言体系设计哲学的一些随想(未完待续)

    对于静态类型语言,其本质目标在于恰当地操作数据,得到期望的值.具体而言,需要: (1)定义数据类型 你定义的数据是什么,是整形还是浮点还是字符.该类型的数据可以包含的值的范围是什么. (2)定义操作的 ...

随机推荐

  1. CPU问题定位与解决

    CPU问题定位基本流程:   性能计数器诊断 主要用到的性能计数器 %Process Time 全实例 (主要用于查看当前服务器的CPU 情况) %Process Time sqlservr (主要用 ...

  2. [codevs] 1699 开关灯

    题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这些路灯全是关着的,六点之后,会有M(2<=m<=100000)个人 ...

  3. CF830B:Cards Sorting

    对叠放着的n张牌,第i张牌写有数字Ai,进行操作:将牌堆顶的牌取出,若是当前牌堆最小值就扔掉,否则放到牌堆底,求牌堆空时操作次数. 怎么看怎么像约瑟夫..不过约瑟夫DP我不太熟,于是就yy了一下 “当 ...

  4. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

  5. Codeforces 618C(计算几何)

    C. Constellation time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  6. Jquery操作事件

    1.文档加载事件 2.DOM单击双击事件 3.DOM获得焦点,失去焦点问题 4.DOM鼠标移入,移出事件 <!DOCTYPE html> <html> <head> ...

  7. THUPC2017看题总结

    THUPC2017 看题总结 #2402. 「THUPC 2017」天天爱射击 / Shooting 果题. 求当前子弹能会使多少块木板损坏,发现因为木板会随着子弹数目的增加而更加容易损坏,故此询问具 ...

  8. Intersection--poj1410(判断线段与矩形的关系)

    http://poj.org/problem?id=1410 题目大意:给你一个线段和矩形的对角两点  如果相交就输出'T'  不想交就是'F' 注意: 1,给的矩形有可能不是左上 右下  所以要先判 ...

  9. Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

    说明:这种方式应该算是最通用的,原理是通过判断标签实现. <!-- if-then form --> <if condition="some conditional exp ...

  10. 佳能 imageclass mf40120

    加粉2612A 加粉方式: 完全拆解安装:在技术部 自已研究 简单拆开,一分为二,倒粉,然后,加分:一些其他单位 外部加粉,拆粉口外盖:一些其他单位