如何提高代码的可阅读行
如何提高代码的可阅读行
好的代码书写规范会让你在阅读的时候很清晰明了的知道业务的逻辑和处理流程。当你阅读高质量的代码时候,可以让你心旷神怡。哇还可以这么写,这样写简洁又大方,命名规范又容易理解.....
软件系统生命周期80%的时间都是阅读和维护代码,可读性好的代码会让我们在维护的时候事半功倍,提高工作效率,更快的梳理出需要改动的地方。可能当开始做的时候不习惯,觉得麻烦,但是当我们坚持一段时间,效果就会显而易见。
下面我总结几方面的在提高代码可读性方面我们能做到或者加以改进的地方。
1.变量,方法类的命名要表达清晰明了
在方便变量命名的时候我们使用的单词不要过于简单,用一些有表达力的单词。示例如下
单词 | 可替代单词 |
---|---|
send | dispatch deliver distribute |
find | search locate extract |
start | launch create begin |
make | add new generate create build set up |
在做循环迭代器的时候,避免使用i,j,k等过于简单的变量命名,userIndex、memberIndex这种名字会更有表达力。因为循环层次越多,代码越难理解,有表达力的迭代器名字可读性会更高。
为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是:作用域越大,名字越长。因此只有在短作用域才能使用一些简单名字。
2.重视代码规范
在定义类的成员变量的时候,通过加前缀来区分不同作用域的代码。
例如
- 加s表示静态成员变量
- 加m表示私有成员变量
- 静态常量大写,单词之间用_区分
- 命名遵循大小驼峰原则
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
3.名字不能有歧义
起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。
布尔相关的命名加上 is、can、should、has 等前缀,可以方便的看到判断结果。
4.代码格式规范
-
代码缩进可以增强代码的可阅读性,代码缩进一般为4个空格。
-
如果句子过长需要换行,或者我们在使用RxJava等框架的链式调用的时候,建议使用 以下规范。
第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。
运算符与下文一起换行。
方法调用的点符号与下文一起换行。
方法调用时,多个参数,需要换行时,在逗号后进行。
client.newCall(new Request.Builder()
.url(address)
.build())
.enqueue(new Callback() {
@Override
ublic void onFailure(Call call, IOException e) {
}
5.注释
注释本应作为代码不可分割一部分,因为它是对代码最直观最详细的说明,你可以把设计思路、用法和注意事项都写在注释里面,这样无论是对你自己还是对别人都是有好处的,它让你能在很久没有接触代码的时候快速回忆起当初的想法,能让阅读源码的人更快理解你的思路,让使用的人更清楚用法。
复杂逻辑写清楚实现的步骤
方法注释清楚方法的作用
6. 使用 Builder 代替构造方法
当某个类的构造方法有很多个参数或者有很多个重载版本时,我们应该考虑为这个类写一个 Builder,通过这个 Builder 创建配置并创建该类的实例。
假设我们有个类用来代表一个矩形,它的名字叫做 Rectangle,它的代码如下所示:
public class Rectangle {
private int mId;
private int mWidth;
private int mHeight;
private int mStroke;// 边框宽度
public Rectangle(int id) { ... }
public Rectangle(int id, int width, int height) { ... }
public Rectangle(int id, int width, int height, int stroke) { ... }
}
于是我们就可能看见这样的代码 new Rectangle(1, 1, 1, 1),这样的代码可读性是很差的,因为我们无法一眼就看出这个矩形设置了哪些信息,还需要去查阅下相关的 API 文档。此外,当我们需要创建一个只需指定 id 和 stroke 的矩形的时候,我们就必须再写一个新的构造方法,当一个对象的属性较多的时候,构造方法的重载版本就可能变得非常的多,维护成本也随之提高。如果我们为 Rectangle 创建一个 Builder,通过 Builder 创建矩形实例的过程就会变得灵活而清晰很多:
public class Rectangle {
private int mId;
private int mWidth;
private int mHeight;
private int mStroke;// 边框宽度
private Rectangle(Builder builder) {
mId = builder.id;
mWidth = builder.width;
mHeight = builder.height;
mStroke = builder.stroke;
}
public static class Builder {
private int id;
private int width;
private int height;
private int stroke;// 边框宽度
public Builder(int id) {
this.id = id;
}
public Rectangle build() {
return new Rectangle(this);
}
public Builder width(int width) {
this.width = width;
return this;
}
public Builder height(int height) {
this.height = height;
return this;
}
public Builder stroke(int stroke) {
this.stroke = stroke;
return this;
}
}
}
现在,我们创建 Rectangle 实例的过程就会变成下面的样子,它不仅让我们一眼就看出矩形设置了哪些属性,而且我们还可以自由组合这些属性,达到重载构造方法想要的结果:
Rectangle.Builder builder1 = new Rectangle.Builder(1);
Rectangle rect1 = builder1.width(1).height(1).stroke(1).build();
Rectangle.Builder builder2 = new Rectangle.Builder(2);
Rectangle rect2 = builder2.width(1).height(1).build();
Rectangle.Builder builder3 = new Rectangle.Builder(3);
Rectangle rect3 = builder3.stroke(1).build();
这个涉及到设计模式里面的建造者模式,后续可以了解一下。
7.函数设计尽量功能单一
自己以前为了方便,在开发的时候经常将函数写成一大片,在后期的维护和二次优化上面需要花很多时间。当然很多不是一蹴而就的,我们需要不断的花时间去思考,这样自己才能不断进步。