简化函数调用
10.1 Rename Method(函数改名)
这个就不用细说了,就讲一个给函数命名的好方法:首先考虑应该给这个函数加上一句怎样的注释,然后想办法将注释变成函数名称。
10.4 Separate Query from Modifier(将查询函数和修改函数分离)
某个函数既返回对象状态值,又修改对象状态。建立两个不同的函数,其中一个负责查询,另一个负责修改。
String foundMiscreant(String[] people) {
for(int i = 0;i < people.length();i++){
if(people[i].equals("Don")){
sendAlert();
return "Don";
}
if(people[i].equals("John")){
sendAlert();
return "John";
}
}
return "";
}
void checkSecurity(String[] people){
String found = foundMiscreant(people);
someLaterCode(found);
}
做法:
1、新建一个查询函数,令它返回的值与原函数相同。
String foundPerson(String[] people) {
for(int i = 0;i < people.length();i++){
if(people[i].equals("Don")){
sendAlert();
return "Don";
}
if(people[i].equals("John")){
sendAlert();
return "John";
}
}
return "";
}
2、修改原函数,令它调用查询函数,并返回获得的结果。
String foundMiscreant(String[] people) {
for(int i = 0;i < people.length();i++){
if(people[i].equals("Don")){
sendAlert();
return foundPerson(people);
}
if(people[i].equals("John")){
sendAlert();
return foundPerson(people);
}
}
return return foundPerson(people);
}
3、将调用原函数的代码改为调用查询函数。然后,在调用查询函数的那一行之前,加上对原函数的调用。
void checkSecurity(String[] people){
foundMiscreant(people);
String found = foundPerson(people);
someLaterCode(found);
}
4、将原函数的返回值改为void,并删掉其中所有的return语句。
//rename
void sendAlert(String[] people) {
for(int i = 0;i < people.length();i++){
if(people[i].equals("Don")){
sendAlert();
}
if(people[i].equals("John")){
sendAlert();
}
}
}
//消除重复代码
void sendAlert(String[] people){
if(!foundPerson(people).equals(""))
sendAlert();
}
10.6 Replace Parameter with Explicit Methods(以明确函数取代参数)
你有一个函数,其中完全取决于参数值而采取不同的行为。针对该参数的每一个可能值,建立一个独立函数。
动机:
如果某个参数有多个可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。
这个重构方法个人感觉很鸡肋,就不详细叙述了,有兴趣的朋友可以自己看看。
10.13 Encapsulate Downcast(封装向下转型)
某个函数返回的对象,需要有函数调用者执行向下转型。将向下转型动作移到函数中。
尽量向用户返回精确的类型。
Object lastReading(){
return reading.lastReading();
}
to
Reading lastReading(){
return (Reading)reading.lastReading();
}
10.15 Replace Exception with Test(以测试取代异常)
面对一个调用者可以预先检查的条件,你抛出了一个异常。修改调用者,使它在函数调用之前先做检查。
double getValueForPeriod(int periodNumber){
try{
return values(periodNumber);
}catch(ArrayIndexOutOfBoundsException e){
return 0;
}
}
to
double getValueForPeriod(int periodNumber){
if(periodNumber >= values.length) return 0;
return values(periodNumber);
}
异常只应该被用于异常的、罕见的行为,也就是那些意料之外的错误行为,而不应该成为条件检查的替代品。