一 意义
最大的意义:通过代码检视,发现问题,解决问题,并且能够有效地提升自己,最终达到写出优质代码,提高代码质量,成功做好项目。
二 基本要求
(一) 逻辑一定要正确,逻辑错误非常容易引起BUG
(二) 避免一些没必要的代码,能用一句解决的就不要用一句以上的代码解决,冗余代码不仅占用内存,而且影响可读性。
(三)
三 代码检视
四 提升内容
(一) 有意义命名变量、函数、参数、类、和封包(package)等等,命名的时候一定要使得名字有意义,并且一定要写好注释。
1 增强可读性
2 使维护变得容易
(二) 简单规则
1 名副其实:变量、函数、或类的名称基本上可以看出这代表着什么,为什么会存在,做什么事,应该怎么用。如果名称需要注释来补充的话,就不太算名副其实了。
eg:
int d; // 消逝的时间,以天计
大家看看这么写,好不好?
这完全没有那种时间消逝的感觉,不看注释根本不知道这个拿来做什么,有什么用。
以下写法:
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
我们不需要看注释就能够,明白这代表着什么,对吧?
再来一段代码:
public List<int[]> getThem()
{
List<int[]> list1 = new ArrayList<int[]>(0);
for(int[] x : theList)
if( x[0] == 4)
list1.add(x);
return list1;
}
我们都能看懂这段代码,但是我们不知道这段代码究竟他要做什么,搞不懂,也说不明白,看着难受,又有点香菇,大骂这是写的啥?
这并不复杂的一段代码,有很多问题:
(1)函数命名:getThem() 其实瞬间就蒙了,“获取他们” 这个翻译准确不,“他们”是啥?表示不懂;
(2)变量命名:list1 这个是啥?里面装的什么,搞不懂,也是不明白;
(3)x[0]代表什么?4又是什么东东?这些我们都不明白;
(4)这段代码没有一点注释:真心是不懂的;
(5)虽然我们知道 for 循环下面一句是他的执行语句,if 控制语句的下一句就是他的执行语句,但是最好还是加上“{}”,增强可读性;
(6)这段代码我们不知道,怎么使用,返回的结果做何用的我们也不知道
以上这六点,基本上判断这段代码写得不好,可以改进的地方很多。
以下两种改进方法:
(1)
public List<int[]> getFlaggedCells()
{
List<int[]> flaggedCells = new ArrayList<int[]>(0);
for(int[] cell : gameBoard)
{
if( cell[STATUS_VALUE] == FLAGGED)
{
flaggedCells .add(cell);
}
}
return flaggedCells ;
}
(2)
public List<Cell> getFlaggedCells()
{
List<Cell> flaggedCells = new ArrayList<Cell>(0);
for(Cell cell : gameBoard)
{
if( cell.isFlagged())
{
flaggedCells .add(cell);
}
}
return flaggedCells ;
}
很明显,这两种改进都比刚才那种好,但是最好的还是改进方法的第二种,我是这么认为的。2 避免误导
acounntList来指一组账号,这样怎么样?
List对于程序猿来说,是有特殊意义的:除非他真的是个List。用accounts都比这个好。
提防使用不同之处很小的名称:
看的人容易眩晕,或许就是一两个字母的差别,在时间比较紧的情况下,很容易出BUG,即便这个很微小,也是值得注意的,
这就要注意命名命得差异较明显一点
3 做有意义的区分
public static void copyChars(char a1[], char a2[]) ×
public static void copyChars(char source[], char destination[]) √
下面当一个service接口中有以下几个方法的时候:
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
这三个方法我们会想,到底调用哪一个,才能得到活动账户的信息,所以就需要有效区分。方便系统维护,版本升级,代码重用。
4 使用读得出来的名称
比较
class DtaRcrd102
{
private Date genymdhms;
private Date modymshms;
private final String pszqint = "102";
......
}
和
class Customer
{
private Date generationTimestamp;
private Date modificationTimestamp;
private final String recordId= "102";
......
}
5 使用可搜索的名称
6 类名应当时名称或者名词短语,比如Customer,Account;
7 方法名应当是动词或者动词短语,如deleteAccount
属性访问器:get
属性修改器:set
断言: is
........................
还有一些我就不列举了,尽量做到,见名知意,规范命名。