美文网首页
简化函数调用

简化函数调用

作者: 司鑫 | 来源:发表于2017-08-07 13:50 被阅读17次
    一 Rename Method(修改函数名字)

    怎么说

    修改函数的名字,让函数名来揭示函数的用途

    为什么

    我们应该极力遵从的一种编程风格就是把复杂的处理过程分成小函数,以此来提高代码的可读性。拆成小函数也是为了方便命名,因为给一个复杂的函数(干的事不止一件)起一个合适的名字是非常困难的。所以我们应该给一个函数起一个合适的名字,为了起一个合适的名字我们就会去遵守一个函数只干一件事。

    二 Add Parameter(添加参数)

    怎么说

    为函数添加一个对象参数,让该对象带进函数所需信息。

    为什么

    在使用此重构方法前,我们应先尽可能的选择其它的重构方法来实现需求,因为我们遵从的应该是零参数,过长的参数列表是一种坏味道, 程序员很难记住每个参数的意义。

    三 Remove parameter(移除参数)

    怎么说

    将函数本体不再需要的参数移除掉

    为什么

    多余的参数只会带来不必要的阅读理解代码的成本,所以当有机会移除不必要的参数时,那么就应该立即行动。

    四 Separate Query from Modifier(将查询函数和修改函数分离)

    怎么说

    当某个函数既有返回对象,又对对象状态进行了修改,那么我们就该建立两个函数,一个查询,一个修改。

    为什么

    一个函数只干一件事

    怎么做

    举个《重构》中的栗子:现有这样一个函数,一旦有人入侵安全系统,它会告诉我们入侵者的名字,并发送一个警报,如果入侵者不止一个,也只发送一个警报。

     void checkSecurity(String[] people) {
            String found = foundMiscreant(people);
            someLaterCode(found);
        }
    
        String foundMiscreant(String[] people) {
            for (String name : people) {
                if ("Don".equals(name)) {
                    sendAlert();
                    return name;
                }
                if ("John".equals(name)) {
                    sendAlert();
                    return name;
                }
            }
            return "";
        }
    

    第一步,我们可以先将查询函数抽离出来

    String foundMiscreant(String[] people) {
            for (String name : people) {
                if ("Don".equals(name)) {
                    sendAlert();
                    return foundPeople(people);
                }
                if ("John".equals(name)) {
                    sendAlert();
                    return foundPeople(people);
                }
            }
            return "";
        }
    
        String foundPeople(String[] people) {
            for (String name : people) {
                if ("Don".equals(name)) {
                    return name;
                }
                if ("John".equals(name)) {
                    return name;
                }
            }
            return "";
        }
    

    第二步,我们将查询和修改分离开来

     void checkSecurity(String[] people) {
            foundMiscreant(people);
            foundPeople(people);
            someLaterCode(found);
        }
    
        void foundMiscreant(String[] people) {
            for (String name : people) {
                if (!"".equals(name)) {
                    sendAlert();
                }
            }
        }
    
        String foundPeople(String[] people) {
            for (String name : people) {
                if ("Don".equals(name)) {
                    return name;
                }
                if ("John".equals(name)) {
                    return name;
                }
            }
            return "";
        }
    
    五 Preserve Whole Object(保持完整对象)

    怎么说

    如果我们从某个对象中取出若干个值作为一次函数调用的参数时,我们就应把这一整个对象都传入。

    为什么

    • 避免未来会用到该对象的其它数据
    • 提高代码的可读性(简洁的参数列表)
    六 Replace Parameter with Method(使用函数替代参数)

    怎么说

    对象调用某个函数得到返回结果,并作为参数传递给另外一个函数,而另外一个函数也可以调用前一个函数并得到相同的结果。那么我们就应该移除该参数,并直接调用前一个函数。

    为什么

    • 提高代码的可读性(简洁的参数列表)
    七 Encapsulate Downcast (封装向下转型)

    怎么说

    将向下转型动作移到函数中。

    为什么

    • 对于任何一个函数来说,提供一个准确的返回值类型和起一个好的函数同样重要。

    怎么做

    Object lastReading(){
        return readings.lastElement();
    }
    

    重构为

    Reading lastReading(){
        return (Reading)readings.lastElement();
    }
    

    相关文章

      网友评论

          本文标题:简化函数调用

          本文链接:https://www.haomeiwen.com/subject/mwnolxtx.html