欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java进阶之路【代码篇】——《CleanCode》编程规则精编(2)函数

程序员文章站 2024-03-21 20:12:22
...

函数

命名

使用描述性的名称。
函数又称为方法,其目的是要完成一项功能。命名应该能够描述出这件事。

大小

要短小。肉眼可见的量化标准是:
- 不长于一屏
- 缩进层级不高于2层

功能

  • 要符合单一职责原则。面向对象SOLID原则之一。一个函数只做一件事情,没有副作用。
  • 分隔指令与询问。要么询问一件事,要么命令一件事。也是单一职责的一种体现
  • 每个函数中的内容保持在同一抽象层级

    错误的抽象层级:

public void printBill() {
    System.out.println("This is a header");
    System.out.println("================");
    printDetails();
}

private void printDetails() {
    // print details info
}

这里printBill中的抽象层级就是错误的,混合了两个层级的抽象。应改为:

public void printBill() {
    printHeader();
    printDetails();
}

private void priintHeader() {
    System.out.println("This is a header");
    System.out.println("================");
}

private void printDetails() {
    // print details info
}

保持同一抽象层级的好处是,阅读程序时思维更加连贯。符合人类的思维逻辑。

参数

  • 不应过多。个人理解:除特殊清楚,不超过4个。如果数量过多,或者参数关联性较强,则可封装为参数对象。如一个方法需要传两个点的坐标用来绘制一个线段,构造一个point对象远比把两个点的XY坐标当做参数传递进去要好得多。
    good:‘drawALine(point start,point end)
    ugly:‘drawALine(int x1, int y1, int x2, int y2)
  • 不使用代码类型的参数。鬼知道那是什么意思?
  • 对于需要发生转换的参数,使用返回值,而不是把参数直接传递进去。

错误的处理方式:

pubic void main(String[] args) {
    StringBuffer sBuffer = new StringBuffer();
    initBuffer(sBuffer);
}

public void initBuffer(StringBuffer buffer){
    buffer.append("something");
}

正确的处理方式:

pubic void main(String[] args) {
    StringBuffer sBuffer = new StringBuffer();
    sBuffer = initBuffer();
}

public StringBuffer initBuffer(){
    StringBuffer buffer = new StringBuffer();
    buffer.append("something");
    return buffer;
}

避免了不易被人发觉的参数改动,增加程序易读性。同时也便于调试。

错误处理

  • 使用异常,而不是错误代码。不要指望注释能够解释你的错误代码,下一个修改错误代码的人未必会去维护相应的注释,不要使用错误代码就好了。
  • 错误处理就是一件事情。不要在错误处理里面做错误处理以外的事情。除了合理的关闭资源,日志记录,发出提醒,没有其他事情有什么正当的里有需要在错误处理里完成。
  • 错误信息不要骗人。相信我,说不定你会骗了自己人。
  • 另外如果还有强迫症的话。试着把需要try catch的部分单独拿到另外的函数中。它对整洁的代码真的是噩梦一样的存在。

其他

  • 尽可能少的使用swtich,那太不面向对象了。