《重构》:代码中的坏味道
读完《重构》,这虽然是一本详细讲解重构手法的书,但为了彰显其价值,作者前后也不遗余力得讲了很多关于为什么重构、何时重构的话题,其中有一章叫“代码的坏味道”,就是指那些现有程序中可行但不那么让人舒服的代码问题,作者建议以此作为代码有必要重构的信号。
我觉得说的确实很现实,所以摘录概要如下,也给自己长长记性。
1、重复代码(Duplicated Code),就是干着同一件事儿的相同程序结构出现了多次,可能是一个类的不同函数里,可能是互为兄弟的子类,甚至可能是互不相关的类中。
2、过长函数(Long Method),这有点算是过程化编程方式形成问题,函数的短小精悍所带来的解释能力、共享能力、选择能力,是长函数无可比拟的,书中还提出函数分解可能同样会带来阅读困难,因为可能需要为此不断转换上下文,但也指出其真正问题不是函数分解,真正的关键在于为函数取一个好名字,为此如果必要,甚至应该不惜起一个比自身程序还要长的名字。
3、过大的类(Large Class),对此,书中首先提到的就是这样的类中往往会出现太多实例变量,接着就难免重复代码的问题,至于实际情况,我相信每个程序员都还有自己的认识,反正过大的类确实会让人觉得不合适。
4、过长参数列(Long Parameter List) ,太长的参数列会难以理解、前后不一致、不易使用。要么是函数本身设计有问题,要么应该提炼参数为对象。
5、发散式变化(Divergent Change),“一个类受多种变化影响”,一个极端说法可能更容易理解,无论你要对系统做哪个方向的修改,都要去改这个类。
6、散弹式变化(Shotgun Surgery),“一个种变化引发多个类需要修改”,比如一个业务逻辑比较复杂,实现代码被分散在多个地方,一旦这个业务逻辑发生变动,就引发出很多不同地方的小修改。其实这个问题和上个问题,是一对需要互相权衡的情况。
7、依恋情结(Feature Envy),函数对于某个类的兴趣远远高于自己所在类的兴趣,调用了太多另一个类的取值函数,所以这个函数看上去是放错了位置。作者阐述这个问题中还指出对象技术的要点在于:这是一种“将数据和对数据的操作行为包装在一起的”的技术。
8、数据泥团(Data Clumps),一些数据项虽然看上去彼此独立,却总是需要同时出现,那么就值得考虑它们是不是拥有属于它们自己的对象。其实这是个数据完整性问题。
9、基本类型偏执(Primitive Obsession),是指可以提炼出对象的数据信息,因为简单仍然坚持用一些简单的基本数据类型来表示。这个问题,我想到了大学中由C转向java的学习时,还常用整数0和1做逻辑真假判断。
10、Switch 表达式(Switch Statements),作者是指这些都应该尽量用多态来取代。
11、平衡继承体系(Parallel Inheritance Hierarchies),原文说两个继承体系的名称前缀完全相同,我觉得就是两个继承体系有着相同的概念,每当为某个类增加一个子类时,必须也为另一个类增加子类,这种情况就是平衡继承体系问题。我还没遇到过,有点不理解怎么会有这种情况的出现。
12、冗赘类(Lazy Class),或者是后期随着维护变化,一个不再需要的类,或者是应对设计时考虑到的某种潜在变化而创建的类,但变化实际始终没有发生,反正就是不再用的着的类。
待续~