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)定义操作的 ...
随机推荐
- 背包DP 整理
题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 基本思路 这是最基础的背包问题,特点是: ...
- hdu 4923 Room and Moor [ 找规律 + 单调栈 ]
传送门 Room and Moor Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- linux 安装报错:pkg-config not found
linux 安装报错:pkg-config not found 使用编译安装时,在执行./configure时报如下错误: ... ... checking for pkg-config... no ...
- python学习之-- shutil模块
shutil 模块功能:文件/文件夹的复制,压缩处理模块shutil.copyfileobj(fsrc,fdst[,length]):将文件内容拷贝到另一个文件中,也可以是部分内容举例:文件复制 im ...
- Triangle(dp)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- Codeforces 954 D Fight Against Traffic
Discription Little town Nsk consists of n junctions connected by m bidirectional roads. Each road co ...
- volatile关键字解析&内存模型&并发编程中三概念
原文链接: http://www.cnblogs.com/dolphin0520/p/3920373.html volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java5之前,它是一个 ...
- onfocus事件,onblur事件;Focus()方法,Blur()方法
<1> <pre name="code" class="html"><!DOCTYPE html PUBLIC "-// ...
- (void __user *)arg 中__user的作用
__user宏简单告诉编译器(通过 noderef)不应该解除这个指针的引用(因为在当前地址空间中它是没有意义的). (void __user *)arg 指的是arg值是一个用户空间的地址,不能直接 ...
- SQL2012 尝试读取或写入受保护的内存。这通常指示其它内存已损坏
今天打开SQL2012,突然就连接不了数据库.一開始还以为是某个server崩溃了.结果试了好几个.都还是如此,弹出提演示样例如以下: 尝试读取或写入受保护的内存.这通常仅仅是其它内存已损坏.(Sys ...