GNG敏捷开发分享--代码重构
这次敏捷开发分享主要是关于代码重构的方法。第一次参加这种开发者分享会,从上午9:30到下午6:00,中途午餐免费提供。
重构与重写:重构应当伴随着单元测试。其核心就是TDD(TEST DRIVE DEVELOPMENT). 用一张图来表示就是[插图]。步骤如下:先写一个fail的单测->实现功能使单测pass->重构代码+运行测试保证通过->再写一个fail的单侧..(循环)。TDD在重构时做设计,而不是事先有完美的设计,一个环平均下来大概5~10分钟。
重写对代码能力提高的帮助不大。
重构第一步:找出代码的臭味。
常见臭味:
1.没用的注释 :删除
2.神奇数字 :提取成方法,并用合理的方法名。
3.长方法 : 合理的方法长度应该控制在10~20行。消除臭味的方法如提取方法,内联(inline)变量。
4.重复代码 : 提取方法
5.调试信息没有删除 :删除。
不常见的臭味:
1.数据簇
2.无法沟通的名字(uncommunicatable name)
3.懒惰的类:没有数据部分,只调用其他类的方法。移动方法,将方法移动到操作对象的内部。
4.死亡代码:永远不会执行的代码
5.迷恋原始类型 : 关注实际操作的对象
6.抽象干扰 :几个方法取名很相似时,说明实现的功能相似,可以重命名,或者创建领域对象。
7.特性嫉妒
其他重构方法:
提取变量:提取变量也许后来会被删除,但由于重构是逐步优化的,所以如果提取变量使代码更漂亮,这么做也值得。
修改函数签名:修改时不能做大幅度的修改,这时通常是增加一个default值为null的参数,再确保原来的功能不受影响的情况下,一步步地用新的参数替代原来的参数。
迪米特法则(一个点法则):
方法内部调用其他方法,为了避免连带调用,尽量使调用的方法是如下四种方法类型之一:
类方法;
方法参数的方法
创建出来类的方法
类成员变量的方法
本次分享还谈到了浮现式设计的话题,重点是介绍了SOLID原则。
S:单一原则,认为对象只有单一的功能
O: 开闭原则,认为“对于扩展是开放的,对于修改是封闭的”
L: 里氏原则,认为“程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的”
I: 认为“多个特定客户端接口要好于一个宽泛用途的接口”
D: 认为一个方法应该遵从“依赖于抽象而不是一个实例”