重构的目的,以及重构时的“测试先行”——to:Schlemiel(维特根斯坦的扇子)
你在给“iamwls(-----魔高一尺,道高一丈-----):”的回贴里的两个问题值得讨论:
1. 重构的目标是否一定是一个模式。我认为不是。不错,模式常常会指明重构的方向,在某些情况下模式也确实是重构的目标,但这却不是必然。重构的目的是改进程序的质量、驱除程序中的smell。具体说就是要高内聚、低耦合,并提高程序的可读性。Fowler在他书中举出的smell of code都是对高内聚、低耦合这一原则的违反,或是降低程序的可读行,而重构的方法都是在内聚、耦合、可读性这几方面做文章的。
模式是实践中形成的解决常见问题的通常解法。但不是唯一解法,也不是任何情况下的最优解。因此软件中也不是要处处用模式,更何况某些情况下Pattern会成为AntiPattern。模式也就更不会总是成为重构的目标了。
而且某些重构的粒度是非常小的,是不可能以某个模式为目标的,比如extractMethod,moveMethod等。
2. 如果要对一个没有任何单元测试代码的软件进行重构,此时能不能做到“测试先行”,如何做到“测试先行”。我觉得在一定条件下还是可以的。因为每一个重构的步骤是很小的。所以是可以针对这一小步骤写单元测试代码的。然后随着重构范围的扩大,在逐渐扩大测试覆盖的范围。因此也不能就说是Mission Impossible。不过前提是能把要重构的部分与软件其它部分隔离开来。如果软件设计的实在太差,代码件的依赖关系是在太复杂,这时到真有可能成为Mission Impossible。如果一定要对这样的软件进行重构,而非重写,我也不知道该怎么做最好。希望能听到高见。