1. 函数的首要规则是要短小,避免出现超过20行的函数,应该通过进一步抽象的方式,将长函数的内容拆解为对多个小函数的调用
    2. if、else、for、while等语句,其执行体越短越好,最好只有一行,是对一个操作函数的调用
    3. 函数要满足SRP(单一职责原则)。判断是否是单一职责的标注:该函数是否只做了该函数名下同一抽象层级上的操作,如果是,则认为该函数只做了一件事满足单一职责;反之,该函数体中存在了跨抽象层级的操作,即可以在合乎逻辑的情况下拆解出一个更小的子函数,那么该函数就不满足SRP原则。只做一件事的函数是没有办法被切分的。

    在理想状态下,我们期望一个函数极为精简长度短小,要么不包含对其他函数的调用;要么通过调用多个其他函数来在统一的、当前函数最高的抽象层级上完成分步骤的操作。如下所示

    1. //将大象放入冰箱的方法
    2. //调用的每一个函数,其命名都具备充足的信息,可以直接看出来是做了什么操作
    3. public void putElephantIntoRefrigerator(){
    4. openDoorOfRefrigerator();
    5. pushElephantIntoRefrigerator();
    6. closeDoorOfRefrigerator();
    7. }
    1. switch语句

    在使用switch语句的时候,要注意保证switch语句只做一件事(满足SRP原则)。
    同时,对于同一类对象的switch,应该只出现一次。下图所示的代码段的工作是为不同类型的员工计算其工资,这就是一个不好的switch用例,因为还可能会出现deliverPay()、calculateTax()等方法,他们也会出现对employee类型进行判断的switch(这就违反了开放闭合OCP原则)。
    image.png
    为了解决这一问题,我们使用 多态+抽象工厂模式 来进行解决。如下图所示。这就保证了对于employee进行判断的switch只出现一次,并与具体的业务逻辑解耦。
    image.png

    1. 给函数命名时,使用具有描述性的名称,可以长一点但是包含丰富的上下文信息,不能为了追求短而让阅读者无法理解
    2. 函数参数越少越好,多参数函数会给阅读者和使用者带来一定的理解和记忆成本。最好是0参函数(调用函数的对象就是函数的操作对象),1参函数也可以,参数再多就会变得不友好。
      • 单参数函数的两种表现形式:①isXXX(arg)类型的判断函数②doSomething(args)类型的操作函数
      • 尽量不适用bool类型的标识参数来控制函数的行为,应该将bool变量对应的两种情况拆解为两个函数来分别操作。
      • 减少参数的方法:①通过抽象的方式将多个参数封装成一个类;②通过抽象,构造新的类,将某些函数变成函数的调用方;③将某些参数变成函数所在类的成员变量。
    3. 避免使用输出型参数(例如,某函数以list为入参,在函数体中对list进行初始化,但是返回类型为void,该list即为输出型参数)。优化方式:fun(a) → a.fun()。
    4. 分割询问性函数与指令型函数。

    询问型函数即isXXX()类型的返回bool的函数,指令型函数即doSomethind()类型的进行实际的逻辑处理或者读写操作的函数。一个函数不能即做指令型操作又给出询问型返回,因为这会导致无法通过函数的签名来直接了解到这个函数的作用。可行的操作方法有:(1)修改函数名为doSomethindAndCheckIfXXX(),这个方法可以一定程度解决问题但是还不够优雅;(2)拆解为询问型和指令型两个函数(3)如果无法拆解的(例如数据库写入时判断是否成功),可以通过在指令型函数中添加抛出异常来解决
    另外,也不建议在指令型函数中返回错误码。一方面,这会使函数有较高的阅读成本,另一方面,错误码枚举类的使用,会导致出现“依赖磁铁”,一旦错误码枚举类出现变动,所有相关的代码都要做更新并且重新部署。应该通过抛出不同的异常来描述不同类型的异常结果。

    1. try/catch代码块

    try和catch的代码块中,最好都只写一行代码进行函数调用,这样会使得代码的逻辑结构更加的清晰。
    错误处理就是“一件事”:函数应该只做一件事,错误处理就是“一件事”,所以,我们期望try总是在某个函数的第一行出现,并且try/catch/finally后面也不再有其他的内容。

    1. 对于重复出现的操作,考虑将其抽象出了,称为util方法;或者使用aop来进行切入
    2. 避免使用goto语句
    3. 类应该是名词性短语,函数应该是动词性短语
    4. 避免副作用

    让函数只做它的签名承诺做的事情,不要做任何多余的、附加的操作。

    1. 如何写出优质的函数:先写丑陋的函数,同时设计测试用例来进行单词;再进行函数拆解、名称优化、重复消除等工作,同时在这个过程中保证可以通过单测