美文网首页
《Clean Code代码整洁之道》第三章 函数(上)

《Clean Code代码整洁之道》第三章 函数(上)

作者: gg大宇 | 来源:发表于2017-12-14 14:10 被阅读0次
    短小

    第一规则:短小
    if语句、else语句、while语句等,其中的代码块应该只有一行,该行大抵应该是一个函数调用语句,这样既能保持函数短小,而且,因为块内调用的函数拥有较具说明性的名称,从而增加了文档上的价值。所以函数的缩进层级不该多于一层或两层,这样的函数易于阅读和理解
    第二条:函数应该做一件事。做好这件事,只做这一件事。
    如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是只做了一件事,编写函数毕竟是为了把大一些的概念(换言之,函数的名称)拆分为另一抽象层上的一系列步骤。注意函数中的区段,只做一件事的函数无法被合理地切分为多个区段。
    第三条:每个函数一个抽象层级
    要却道函数只做了一件事,函数中的语句都要在同一抽象层级上。

    自顶向下读代码:向下规则

    我们想要这样读程序,程序就像是一系列TO起头的段落,每一段都描述当前抽象层级,并引用位于下一抽象层级的后续TO起头段落
    例如:要容纳设置和分拆步骤,就先容纳设置步骤,然后纳入测试页面内容,在纳入分析步骤。
    要容纳设置步骤,如果是套件,就纳入套件设置步骤,然后在纳入普通设置步骤。
    要容纳套件设置步骤,先搜索“SuiteSetUp”页面的上级继承关系,在添加一个包括该页面路径的语句。

    Switch语句

    写出短小的switch语句很难。写出只做一件事的switch也很难,switch天生要做N件事,不幸的是我们总无法避开switch语句。
    例如下面这个Payroll.java文件
    public Money calculatePay(Employee e)
    throws InvalidEmployeeType{
    switch (e.type){
    case COMMISSIONED:
    return calculateCommissionedPay(e);
    case HOURLY:
    return calculateHourlypay(e);
    case SALARIED:
    return calculateSalariedpay(e);
    default:
    throw new InvalidEmployeeType(e.type);
    }
    }
    这个函数的问题:
    1.太长,如果出现新的类型的话,还会更长
    2.它做了不止一件事
    3.它违反了单一权责原则,因为有好几个修改它的理由
    4.它违反了开放闭合原则,每当添加新类型时,就必须修改
    解决方案:将switch语句埋到抽象工厂底下,不让任何人看到。
    对于switch语句,如果只出现一次,用于创建多态对象,而且隐藏在某个继承关系中,在系统其他部分看不到,就还能容忍。

    函数——使用描述性名称

    我们可以把名称从testableHtml改为SetupTeardownIncluder.render,因为它较好的描述了函数做的事情。

    • 不要害怕长名称,长而具有描述性的名称,要比短而令人费解的名称好
    • 不要害怕花时间取名字
    • 选择描述性的名称能理清你关于模块的设计思路,并帮你改进。
    • 命名方式要保持一致。
      -55

    相关文章

      网友评论

          本文标题:《Clean Code代码整洁之道》第三章 函数(上)

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