一份整洁的代码对于一个系统是多么重要。如果代码写的乱七八糟,最后的结果就是无法对这些代码进行有效的管控。很有可能会毁掉这个系统。
什么才是整洁的代码?
Biarne Stroustrup -【C 语言发明者,C Programming Language(中译版《C 程序设计语言》)一书作者】,我喜欢优雅和高效的代码。代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。
有意义的命名
见名知意
命名要名副其实,虽然起个好名字要花时间,但省下来的时间比花掉的时间多。
变量、函数或类的名称需要表达出:它为什么会存在,它做什么事,应该怎么用。如果这个名称还需要注释来补充,那就不算名不副实。
代码语言:javascript复制int d; //消逝的时间,以日计 ...1
int daysSinceCreation; //2
如上代码,变量d什么也没有说明。和后面的注释八竿子打不着,第二行的代码就清晰多了。
代码语言:javascript复制public List <int[]> getThem() {
List < int[] > list1 = new ArrayList < int[] > ();
for (int[] x: theList) {
if (x[0] == 4) {
list1.add(x);
}
}
return list1;
}
上面的代码你或许有疑问:
- (1) theList中是什么类型的东西?
- (2) theList零下标条目的意义是什么?
- (3)值4的意义是什么?
- (4)我怎么使用返回的列表?
可能当时人知道意思,但接手开发肯定会一脸懵逼的。
如果对命名有困惑的,可以看看这个网站:https://unbug.github.io/codelf/
输入想要翻译的中文,下面会列举出「Github」上面使用过的相关命名。
避免误导
比如你想定义一组账号,不要用accountList,这样会误认为这是个List类型,除非真的是List类型的。可以使用accountGroup。
再来看下面代码:
代码语言:javascript复制int a=l;
if(O==D)
a=O1;
else
l=o1;
上面这串代码整的傻傻分不清O和0
,l和1
。简直亮瞎我的眼。
有意义的区分
代码语言:javascript复制public static void copyChars(char a1[],char a2[]) {
....
}
参数过于混乱,改成
代码语言:javascript复制public static void copyChars(char source[],char destination[]) {
....
}
看着舒服多了。
可搜索的名称
代码语言:javascript复制for(int j = 0;j < 34;j ) {
s = (t[j] * 4) / 5;
}
如图:魔法值太多。可以给魔法值命名。
代码语言:javascript复制private static final int WORK_DAYS_PRE_WEEEK = 5 ;
private static final int NUMBER_OF_TASKS = 34 ;
private static final int REAL_USE_DAYS = 4 ;
privat int sum = 0;
for(int j = sum;j < NUMBER_OF_TASKS;j ) {
s = (t[j] * REAL_USE_DAYS) / WORK_DAYS_PRE_WEEEK;
}
向上面这样,至少可以搜索得到。
类名与方法名
类名应该是名词短语。如:Student、Person、Account
。
方法名应该是动词短语。如:getStudent、listPerson、save
规范的方法
短小精悍
有些开发写的方法内容上千行,这样的方法估计连自己看着都累,为何不将内容作适当抽取呢。
方法要短小。一般一个方法20行就足够了。
阿里巴巴要求一个方法总行数不能超过80行。
只做一件事
就是说每个方法只应该有一个功能,如果你要写的方法功能较多,建议抽取,然后再组合。
代码语言:javascript复制public void drawLottery() {
listUser(); //1.查询用户
drawHandler(); //2.抽奖算法
resultHandler();//3.抽奖结果处理
}
如上面代码,将多个方法组合起来成一个方法清晰明了。如果把这3个功能全写在drawLottery()
。后面的开发来看,估计头都要看秃。