习艺之道有二:知和行。你应当习得有关原则、模式和实践的知识,穷尽应知之事,并且要对其了如指掌,通过刻苦实践掌握它。
一、变量
命名看着很简单,但是选择一个好名字要花时间。但是随意命名,看似节省了时间,但后续自己或别人阅读代码的时候需要花费更多的时间。好的命名应该可以让人一眼就能知道它为什么会存在,它做什么事,它该怎么用。利己由利于他人。
糟糕的命名示例:
int d;//消失的时间,以日为单位计算
// 存在问题:
// d什么也没有说明,在其他地方使用的时候我们并不能一眼就能知道d是干啥用的,更不会引起时间消逝的感觉
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的0下标条目的意义是什么
// 3、值4的意义是什么
// 4、我该怎么使用返回的列表
规范的命名:
int elapsedTimeInDays;//消失的时间,以日为单位计算
public List<int[]>getFlaggedCells() {
List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard) {
if (cell[STATUS_VALUE] == FLAGGED) {
flaggedCells.add(cell);
}
}
return flaggedCells;
}
变量命名原则:
1、避免使用误导性名称
如:1和l、o和0
2、做有意义的区分,不做无意义的命名
// 无意义的命名
public static void copyChars(char[]a1,char[]a2) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
// 见名知意
public static void copyChars(char[]source,char[]destination) {
for (int i = 0; i < source.length; i++) {
destination[i] = source[i];
}
}
3、不要自己造词
// 糟糕的命名
private Date genymdhms;
private Date modymdhms;
// 规范的命名
private Date generationTimestamp;
private Date modificationTimestamp;
4、使用命名的常量代替直接使用值
// 尽量不要直接在程序中使用5,而是用常量代替,便于全局搜索
private static final int WORK_DAYS_PER_WEEK = 5;
5、尽量使用驼峰命名法,无需前缀
6、类和对象名称应为名词而不是动词。方法名应为动词或动词短语
二、函数
函数的原则:
1、避免使用长函数、函数要尽量要短小
2、别担心命名过长
3、避免参数过多,一般小于三个,除非不得已
4、避免向函数传入boolean值,坚持函数只做一件事原则
5、尽量做到函数复用,不要代码冗余
6、适当添加注释,学会使用TODO注释
7、不要保留注释掉的无用的代码,防止以后再次阅读时困扰
8、一个类或函数功能编写完成后,及时进行缩进,方便阅读