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,那太不面向对象了。
上一篇: 使用二维数组打印一个 10 行杨辉三角