提炼函数法
●问题
你有一段可以被整理到一起的代码。
●解决方案
将这一段代码移动到一个新的函数或方法中,然后以这个方法的调用来代替旧的代码。
Java --重构前代码
void printOwing() {
printBanner();
// Print details.
System.out.println("name: " + name);
System.out.println("amount: " + getOutstanding());
}
Java --重构前代后
void printOwing() {
printBanner();
printDetails(getOutstanding());
}
void printDetails(double outstanding) {
System.out.println("name: " + name);
System.out.println("amount: " + outstanding);
}
}
python --重构前代码
def printOwing(self):
self.printBanner()
# print details
print("name:", self.name)
print("amount:", self.getOutstanding())
python --重构前代后
def printOwing(self):
self.printBanner()
self.printDetails(self.getOutstanding())
def printDetails(self, outstanding):
print("name:", self.name)
print("amount:", outstanding)
●为何要去重构
一个方法中的行数越多,你就越难知道这个函数是做什么的。这就是如此重构的主要原因。
除了消除代码中的这些瑕疵之外,提炼函数法也是其它重构方法之中重要的一个步骤。
●好处
代码更具可读性!一定要给新方法一个描述这个方法目的的名字,比如createOrder(),renderCustomerInfor()等。
减少代码重复。通常一个方法中的代码可以被程序中的其它地方复用。因此你可以通过调用新的方法来代替代码中的重复部分。
隔离代码的独立部分,这使得错误更不容易发生(例如当错误的变量被修改)。
●如何重构
1. 新建一个方法,给它取一个能够清晰描述方法目的的名字。
2. 将相关的代码片段拷贝到你的新函数中,将它从原来的位置删除并使用对这个新函数的调用来取代它。
找到在这个代码片段中的所有使用的变量。如果它们是在代码段中声明的,并且没有在代码段外部使用到,那么就将它们保持不变–它们就会变成这个新的方法中的局部变量。
3. 如果这些变量在你要提取的片段之前就已经被声明了,你就需要将这些变量传递给你的新的函数的参数来使用者前之前就存在的变量。有时候,通过以查询来代替临时变量法可以消除这些变量。
4. 如果你注意到一个局部变量以某种方式在提起的代码段中变化,那么这可能以为着这个变化的值在你的主函数中可能之后会被用到。仔细检查一下!如果确实是这种情况,那么就将这个变量的值通过函数返回给主函数来保证功能的正确性。