提炼函数(Extract Method)
你有一段代码可以被组织在一起并独立出来,将代码放进一个独立函数中,并让函数名称解释该函数的用途。
void printOwing(double amount) {
printBanner();
System.out.println("name: " + name);
System.out.println("amount: " + amount);
}
转换为:
void printOwing(double amount) {
printBanner();
printDetails(amount);
}
void printDetails(double amount) {
System.out.println("name: " + name);
System.out.println("amount: " + amount);
}
当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就可以将这段代码放进一个独立的函数中。
如果每个函数的粒度都很小,那么函数被复用的机会就更大;
其次,这会使高层函数读起来就像一系列注释;
再次,如果函数都是细粒度,那么函数的覆写也会更容易些。
函数命名以它做什么来命名,而不是以它怎么做命名,关键在于函数名称和函数体之间的语义距离。
即使想要提炼的代码非常简单,例如只有一条消息或一个函数调用,只要新函数的名称能够以更好的方式昭示代码意图,也应该提炼它。
内联函数(Inline Method)
一个函数的本体与名称同样清楚 易懂,在函数调用点插入函数本体,然后移除该函数。
int getRating() {
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
boolean moreThanFiveDeliveries() {
return numberOfLateDeliveres > 5;
}
转换为:
int getRating() {
return (numberOfLateDeliveries > 5) ? 2 : 1;
}
试着使用内联函数,可以找出那些有用的间接层,同时将那些无用的间接层去掉。