书中的简单实用的重构方法基本上都是针对代码的Bad Smell,书中常见的坏味道:重复代码,过长函数,太大的类,太长参数列,面向过程的switch等等。其实了解了这些应该避免的简单错误,就很容易想到应对的方法:搬移函数,封装字段,封装类,提炼类,用继承代替switch,太大的if-else语句等等。记住这些代码中不该出现的bad smell就可以随时重构自己的代码。
但是这本书时间距离我们现在已经很久了,是2003年jdk1.4时代的产物,所以介绍的都是一些面向对象的基本原理。其中也没有java5之后的内容,所以其中的很多重构建议也都有了后来的更具体的方法。 第一种情况比如Replace Type Code with Class 类取代类型码,是不是就能用java5中枚举类来具体实现呢。 第二种情况就是很多已经在各种java代码规范中具体化了的内容,比如Replace Data Value with Object 以对象代替数据值指的就是Entity,Separate Domain from Presentation 将领域和表述/显示分离指的就是VO,引入参数对象指的就是DTO。
这本书和设计模式应该放在一起看,因为设计模式和重构都是帮助我们更好的认识和使用面向对象,用好封装,继承,多态三大特性。重构的很大一部分工作也可以说是更好地在项目中使用设计模式,书中主要举了四个设计模式:策略模式/状态模式,工厂模式和访问者模式作为例子来说明这一点。重构很大程度上是对你的代码用好设计模式的六大原则:开闭原则,单一职责原则,里式替换原则,依赖逆置原则,接口隔离原则和迪米特原则。
重构还有一点需要注意的就是重构本身其实是一种选择,面向对象意味着更好的可扩展性,可读性和可维护性;但是与此同时你也要付出这些重构带来的额外开发成本和速度的降低,如果你实现的模块非常简单而且不会再被扩展/复用那你也许不需要重构。书中使用负债比喻你未重构的代码可以说是非常形象,你可以负债即不重构来加速系统的开发,但是随着你的系统变得复杂时你需要还债。考虑到这种选择的看法,书中也有很多重构技巧是完全相反的选择:值对象/引用对象,添加参数/移除参数,使用委托还是集成等等。ps:最近在实习中遇到了很多这样的选择,举个例子:使用@AllArgsConstructor省略自定义构造函数,还是自己写一个然后this.a=a,this.b=b...这样呢.第二种方法的好处就是可以使用@Qualifier来调用子类,但是我觉得还是第一种好吧。
最后写一个我从这本书中学习到的不太常用的重构技巧:引入空对象,这种重构技巧是为了不用随时担心你的对象是否为null,在每个不确定的地方进行判断。
第一步:
Class类中加入
boolean isNull(){return false;}和newNull(){return new NullClass();}
然后加入一个子类NullClass作为Class的子类,子类中重写isNull(){return true;}
这一步可以直接写也可以通过实现一个Nullable接口来实现
第二步:
在NullClass中制造一份处理空对象Float函数的副本,然后对其进行修改(当为null时会产生的变化放在其中处理,比如当空对象时返回0等)
使用这种做法之后,只在对象变为null时调用newNull()将其转为NullClass即可,用户在使用类中的方法时不需要再判断是否为null。
这个重构技巧还可以扩展到类的有特殊情况的时候,比如Float中的NaN,可以通过构建特例类子类来处理而绝对不会抛出异常。
网友评论