代码整洁之函数

代码整洁之函数

1. 短小

函数就应该越短小越好。

2. 只做一件事

函数应该只做一件事情,做好这件事情,只做一件事的函数无法被合理的切分为多个区段。

3. 每个函数一个抽象层级

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

我们想要代码拥有自顶向下的阅读顺序。我们想要让每个函数后面都跟着位于下一抽象层级的函数,这样一来,在查看函数列表时,就能循抽象层级向下阅读了。这就是向下规则的概念。

换一种说法,我们想要这样读程序:程序就像是一系列TO起头的段落,每一段都描述当前层级,并引用位于下一抽象层级的后续TO起头段落。

4. switch语句

switch天生要做N件事,但我们并没有办法避免switch的使用,不过还是能够确保每个switch都埋藏在较低的抽象层级,而且永远不重复。

对于switch语句,我的规矩是如果只出现一次,用于创建多态对象,而且隐藏在某个继承关系中,在系统其它部分看不到,就还能容忍。

5. 使用描述性的名称

长而具有描述性的名称(描述性名称也不一定就是长的),要比短而令人费解的名称好。长而具有描述性的名称,要比描述性的长注释好。使用某种命名约定,让函数名称中的多个单词容易阅读,然后使用这些单词给函数取个能说清其功能的名称。

6. 函数参数

参数不易对付,它们带有太多概念性,所以我们在函数中传递的参数越少越好,最好不要超过三个。

一元函数的普遍形式:

  1. 函数操作该参数,将其转换成其它什么东西再输出。例如,InputStream fileOpen(“MyFile”),把String类型的文件名转换为InputStream类型的返回值。
  2. 有输入参数而无输出参数,程序将函数看作是一个事件,使用该参数修改系统状态,例如void passwordAttempFailedNtimes(int attemp)。应该让读者很清楚的了解它是个事件。
  3. 如果函数要对输入参数进行转换操作,转换结果就该体现为返回值。

建议:

  1. 不建议向函数传入布尔值。
  2. 二元函数或者三元函数,应该尽量利用一些机制将其转换为一元函数。
  3. 如果函数看来需要两个、三个或三个以上参数,就说明其中一些参数应该封装为类了。
  4. 给函数取个好名字。能较好的解释函数的意图,以及参数的顺序和意图。

补充知识:

  1. 向函数传入数量可变的参数,使用例子:
public String format(String format, Object... args);

7. 使用异常替代返回错误码

从指令式函数返回错误码轻微违反了指令与询问分隔的规则,如果使用异常替代返回错误码,它不会要求调用者立即处理错误,而且错误处理就能从主路径代码中分离出来。
代码示例:

try{
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
    logger.log(e.getMessage());
}

但是Try/catch代码块丑陋不堪,搞乱了代码结构,把错误处理与正常流程混为一谈,最好把Try/catch代码块的主体部分抽离出来,结果如下:

public void delete(Page page){
    try{
        deletePageAndAllReferences(page);
    }catch(Exception e){
        loggerErr(e);
    }
}

public void deletePageAndAllReferences(Page page) throws Exception{
    deletePage(page);
    registry.deleteReference(page.name);
    configKeys.deleteKey(page.name.makeKey());
}

public void loggerErr(Exception e){
    logger.log(e.getMessage());
}

在上面代码中,delete至于错误处理有关,很容易理解然后就忽略掉,deletePageAndAllReferences只与完全删除一个page有关,错误代码可以忽略掉。

猜你喜欢

转载自blog.csdn.net/qq_22314145/article/details/81176062