重构-改善既有代码的设计读书笔记(十)

简化函数调用

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);

}

异常只应该被用于异常的、罕见的行为,也就是那些意料之外的错误行为,而不应该成为条件检查的替代品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点_点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值