【读书笔记-重构与模式】 代码坏味~
来源:互联网 发布:mac os 升级 编辑:程序博客网 时间:2024/05/21 15:01
<重构与模式>中指出:
重构,也就是对既有代码设计的改善,要求你首先知道什么样的代码需要改善。
书中给出了12种代码坏味的表现:
1 重复代码 2. 方法过长 3. 条件逻辑太复杂 4. 基本类型迷恋 5. 不恰当的暴露 6. 解决方案蔓延 7. 异曲同工的类 8. 冗赘类 9. 类过大 10 分支语句 11 组合爆炸 12 怪异解决方案。
另一份代码坏味列表:
类型
说明
Duplicated Code
(重复代码)
如果你在一个以上的地点看到相同的程序结构,那么可以肯定:设法将它们合而为一,程序会变得更好。
Long Method
(过长函数)
“间接层”所能带来的全部利益——解释能力、共享能力、选择能力,都是由小型函数支持的。
我们遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。
Large Class
(过大的类)
不要尝试利用单个类去做太多事情。这也是面向对象“单一职责”原则。
Long Parameter List
(过长参数列)
函数需要的东西多半可以在函数的宿主类中找到。面向对象程序中的函数,其参数列通常比在传统程序中短得多。
Divergent Change
(发散式变化)
如果某个类经常因为不同的原因在不同的方向上发生变化,Divergent Change就出现了。
Shotgun Surgery
(霰弹式修改)
如果每遇到某种变化,你都必须在许多不同的类内做出许多小修改,你所面临的坏味道就是Shotgun Surgery。
Feature Envy
(依恋情结)
函数对某个类的兴趣高过对自己所处类的兴趣。这种孺慕之情最通常的焦点便是数据。
我们的原则是:判断哪个类拥有最多被此函数使用的数据,然后就把这个函数和那些数据摆在一起。
最根本的原则是:将总是一起变化的东西放在一块儿。努力保持变化只在一地发生。
Data Clumps
(数据泥团)
一个好的评判办法是:删掉众多数据中的一项。这么做,其他数据有没有因而失去意义?如果它们不再有意义,这就是个明确信号:你应该为它们产生一个新对象。
所有的类将会组成一个小小的社会,每个类都会在其中发挥价值。
Primitive Obsession
(基本类型偏执)
对象的一个极大的价值在于:它们模糊(甚至打破)了横亘于基本数据和体积较大的类之间的界限。
Switch Statements
(switch惊悚现身)
少用switch(或case)语句。面向对象中的多态概念可为此带来优雅的解决办法。
Parallel Inheritance Hierarchies
(平行继承体系)
每当你为某个类增加一个子类,必须也为另一个类相应增加一个子类。这时PIH就出现了。
消除这种重复性的一般策略是:让一个继承体系的实例引用另一个继承体系的实例。
Lazy Class
(冗赘类)
如果一个类的所得不值其身价,它就应该消失。
Speculative Generality
(夸夸其谈未来性)
如果函数或类的唯一用户是测试用例,请把它们连同其测试用例一并删掉。但如果它们的用途是帮助测试用例检测正当功能,当然必须刀下留人。
Temporary Field
(令人迷惑的暂时字段)
有时你会看到这样的对象:其内某个实例变量仅为某种特定情况而设。这样的代码让人不易理解,因为你通常认为对象在所有时候都需要它的所有变量。在变量未被使用的情况下猜测当初其设置目的,会让你发疯的。
Message Chains
(过度耦合的消息链)
如果你看到用户向一个对象请求另一个对象,然后再向后者请求另一个对象,然后……,这就是消息链。
通常更好的选择是:先观察消息链最终得到的对象是用来干什么的。
Middle Man
(中间人)
对象的基本特征之一就是封装——对外部世界隐藏其内部细节。封装往往伴随委托。但是不要过度运用委托。
Inappropriate Intimacy
(狎昵关系)
有时候你会看到两个类过于亲密,花费太多时间去探究彼此的private成分。类之间过分狎昵的关系必须拆散。
继承往往造成过度亲密。如果你觉得该让这个孩子独自生活了,请让他离开继承体系。
Alternative Classes with Different Interfaces
(异曲同工的类)
两个函数做同一件事,却有着不同的签名,势必只能保留一个。
Incomplete Library Class
(不完美的类库)
库类构筑者没有未卜先知的能力,我们不能因此责怪他们。麻烦的是我们不可能修改其中的类使它完成我们希望完成的工作,要想其它办法解决问题。
Data Class
(纯稚的数据类)
Data Class就像小孩子,作为一个起点很好,但若要让它们像成熟的对象那样参与整个系统的工作,它们就必须承担一定责任。
Refused Bequest
(被拒绝的遗赠)
如果子类复用了超类的行为(实现),却又不愿意支持超类的接口,Refused Bequest的坏味道就会变得浓烈。拒绝继承超类的实现,这一点我们不介意。但是如果拒绝继承超类的接口,我们不以为然。
Comments
(过多的注释)
注释是好的编程习惯,但是利用注释掩盖糟糕的代码就不对了。
- 【读书笔记-重构与模式】 代码坏味~
- 代码坏味道,重构与模式
- 代码的坏味道,重构,模式
- 代码坏味道与重构
- 代码坏味道与重构
- 代码坏味道与重构
- 代码坏味道与重构
- 代码坏味道与重构
- [读书笔记]代码的坏味道---何时重构
- 重构读书笔记 第3章 代码的坏味道
- 《重构》-3-代码的坏味道-读书笔记
- 【重构笔记】重构与代码的坏味道
- 重构笔记-代码坏味
- 代码坏味及解决方案(底层重构和设计模式两个方面)
- 《重构》读书笔记——代码的坏味道(重复代码)
- 代码的坏味道——何时该考虑代码的重构(重构—读书笔记系列)
- 《重构》读书笔记(四)——第三章 代码的坏味道
- 读书笔记之《重构》第三章—代码的坏味道
- 解决Unable to locate theme engine in module_path: "pixmap"
- 什么是字符设备文件和块设备文件?
- jQuery Tools:Web开发必备的 jQuery UI 库
- Hashtable和HashMap区别
- 关于字符集 和 字符编码
- 【读书笔记-重构与模式】 代码坏味~
- oracle内置常用的sql函数(转)
- 什么是只读字段
- android模拟器安装及卸载软件
- 关于startActivity
- Win8 Metro(C#) 数字图像处理--1 图像打开,保存
- 代码库
- Android 动态加载APK--代码安装、获取安装包中的资源及Intent调用已安装apk
- vs2005不能启动