神秘命名Mysterious Name
重复代码 Duplicated Code
过长函数 Long Function
过长参数列表 Long Parameter List
全局数据 Global Data
- 最大的问题在于,从代码库的任何一个角落都可以修改它,而且没有任何机制可以探测出到底哪段代码作出了修改。
- 解决:把全局数据用函数包装起来,控制对它的访问。将这个函数搬移到一个类或模块内,只允许模块内的代码使用它,从而尽量控制其作用于。
可变数据Mutable Data
- 一个变量只能有一个业务含义,var a =1 ;a = ‘aa’
发散式变化 Divergent Change
- 遇到某种变化,需要在一个模块内或一个类内修改多处。
霰弹式修改 Shotgun Surgery
- 遇到某种变化,需要在多处不同的模块或类内做修改。
- 解决:改变只在一处发生,不要多处修改。将总是一起变化的东西放到一块儿。
i#####依恋情结 Feature Envy - 所谓模块化,就是力求将代码分出区域,最大化区域内部的交互、最小化跨区域的交互。
- 当一个函数跟另一个模块中的函数或者数据交流格外频繁,远胜于在自己所处模块内部的交流,这就是依恋情结的典型情况。
- 解决:将该函数与其交流最多的模块放在一起。
数据泥团 Data Clumps
- a\b\c三个变量,经常同时出现在多个函数的参数列表中。
- 解决:那么考虑把a\b\c封为一个类内,以此类当参数。
基本类型偏执 Primitive Obsession
- 用合适的类型匹配合适的对象描述。
- 表现为:用简单的基本类型描述不同的含义的对象描述。
- 不合适的情况举例,如:0表示数学,1表示英语,2表示语文。那么可以考虑将数学/英语/语文的012用枚举定义,更易理解。
重复的switch Repeated Switches
- 表现为:在多处不同的地方,重复使用完全相同的switch语句或ifelse语句。
- 这样的问题在于,如果产生变化,需要多处修改。
循环语句。Loops
- 使用管道操作,如filter/map等,代替循环语句。
- 好处在于使得我们更快地看清被处理的元素以及处理它们的动作。
冗赘的元素 Lazy Element
- 指的是,多层不必要的包装。
- 如:方法a中包的是b,b包的是c,c包的是d。但是bc只是基于某种考虑的纯粹包装,而从未有其他变化,这时可以让a直接包d,bc就去掉吧。
夸夸其谈通用性 Speculative Generality
- 指的是,过度设计,假象的灵活机制。从未被用到的。
临时字段 Temporary Field
- 一个类内,应该具备统一的逻辑体现。
- 举例:class Letter{ a. b. c. 牛 d. e. }
过长的消息链 Message Chains
- a想获得f,过程是:c = b.getC(),d = c.getD(),e = d.getE(),f=e.getF();
- 类似一个导航链。
中间人。Middle Man
- 对象的基本特征之一就是封装-对外部世界隐藏其内部细节。封装往往伴随着委托。
- 过度委托,举例:a使用b的b1 b2 b3三个函数,但是b1 b2 b3这三个函数都是c的c1 c2 c3。那么就把b这个中间人去掉,直接a使用c1 c2 c3
内幕交易 Insider Trading
- 避免模块间的私下交流,把模块间的交流放到明面上,统一交流方式,约定都使用这些统一的方式。
过大的类 Large Class
- 让类业务功能单一,避免一个类干很多事情。
异曲同工的类 Alternative Classes with Different Interfaces
纯数据类 Data Class
- 一种情况是,这真的是纯数据类,存放数据的容器,不会改变类的变量值。这种情况没有问题。
- 另一种情况是,类内有一些字段,以及访问这些字段的函数。但是在很多其他地方频繁的对该类的字段进行访问修改。那么可以考虑,将这些频繁的行为搬移到类的内部。也就是说,把处理数据的行为从客户端搬移到纯数据类里来。
被拒绝的遗赠 Refused Bequest
- 指的是,子类只想继承超类的部分字段和函数,其他的拒绝使用。这意味着继承体系设计错误。超类中的字段函数应该是子类的必备数据。
- 继承体系设计时,应该是真是一个体系。而不应因为多个并行的类有某些行为相像的函数,而抽取超类。比如猪和牛都有四条腿和一个尾巴,但不应该抽取一个只有四条腿和一个尾巴的超类,猪牛不是一个体系的。
注释 Comments
- 一段又长又臭的代码,无法自解释,只能靠注释解释其含义。这不是注释原本的意义。
- 注释可以用来记述将来的打算之处,标记并无十足把握的区域,或是写下“为什么做某某某事”,这类信息可以帮助将来的修改者,尤其是那些健忘的家伙。