开门见山
发现:你想要把某个算法替换为另一个更清晰的算法。
解决:将函数本体替换为另一个算法。
//重构前
String foundPerson(String[] people){
for (int i = 0; i < people.length; i++) {
if(people[i].equals("Don")){
return "Don";
}
if(people[i].equals("John")){
return "John";
}
if(people[i].equals("Dave")){
return "Dave";
}
}
return "";
}
//重构后
String foundPerson(String[] people){
List<String> candidates = Arrays.asList(new String[]{"Don","John","Dave"});
for (int i = 0; i < people.length; i++) {
if(candidates.contains(people[i])){
return people[i];
}
}
return "";
}
动机
解决问题的方法往往会有很多种,但是其中总会有一些方法比另一些简单。算法也是如此。如果你发现做一件事可以有更加清晰的方式,就应该以清晰的方式取代复杂的方式。“重构”可以把一些复杂东西分解为较简单的小块,当有时候你就必须删除整个算法,待之以简单的算法。
随着对问题有了更多了解,你往往会发现,在原先的做法之外,有更简单的解决方案,此时,你就需要改变原先的算法,使之变得更加清晰、简洁。
在使用这项重构手法之前,你需要确定自己已经尽可能分解原先函数。替换一个巨大而复杂的算法是非常困难的,只有先将它分解为较简单的小型函数,然后你才能很有把握地进行算法替换工作。
做法
(1)准备好一个(替换用)的算法,让其通过编译。
(2)针对现有测试,执行上述新算法。如果结果和原本结果相同,重构结束。
(3)如果测试结果不同于原先,在测试和调试过程中,以旧的算法为参照标准。