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)定义操作的 ...
随机推荐
- ES6__数据结构 Set
/* 数据结构 Set */ /* *集合的基本概念:集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中. *特点:key 和 val ...
- SHELL脚本运行的几种方法以及区别
#1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh,如果如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可(这和运行 ...
- 某考试 T1 table
我们把每一行看成一个多项式 f[i][1] + f[i][2] * x + f[i][3] * x^2 + ..... + f[i][n] * x^(n-1) 的话,一行转移到下一行就相当于乘上一个{ ...
- TeamCity - Docker创建
// 创建Server docker run -it --name teamcity-server-instance \-v /home/tc_datadir:/data/teamcity_serve ...
- 【c++】【转】结构体字节对齐
http://www.cnblogs.com/heyonggang/archive/2012/12/11/2812304.html
- 【Nginx】I/O多路转接之select、poll、epoll
当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或 ...
- HTML大文件上传(博客迁移)
Html大文件上传:跳转 通过github和hexo进行搭建博客,主要是在没有网络的时候,可以本地访问,并支持markdown语法. 新博客地址:跳转
- OCR简介及使用
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...
- Office WORD如何为每一页设置不同的页眉页脚
如下图所示,我想要为封面和目录,摘要等等设置不同的页眉页脚(一般封面和目录不需要页脚) 而从正文开始,套用相同的页眉和以页数作为页脚(注意"第一章 绪论"不是这个文档的第一页) ...
- Material UI:很强大的CSS框架
Material UI 是一款功能很强大,界面却十分清新简洁的CSS框架.Material UI利用了Google的Material Design 全新设计语言.而且让每个UI组件都变得很独立.因此开 ...