代码整洁之道 -- 有意义的命名
在日常编程中,命名是随处可见的,比如变量名、函数名、参数名、类名、包名,在这几年的编程过程中,看过很多类型的命名,开源的和同事的,风格各异。一个好的命名可以让人有一个很好的代码阅读感受,减少别人阅读的困难,提升阅读代码的效率。这次讲讲我遇到过的一些不好的命名以及如何更好地命名。
一、用合适的命名代替注释
有一次,看到一个同事的代码写的是
int t; // timestamp for recording data
这里的t后面加了注释-记录数据的时间戳,在下面的代码中我也大概能记得这个t的含义,但是当我过几天去看这段代码的时候,我就忘记这个t的含义了,我要找回这个定义处的注释,才得知这个变量的含义,十分的麻烦,因为t可能指的是一段时间time,也有可能是指timestamp时间戳,也有可能是业务里某个以t开头的单词。如果不是自己写的,真的很难看一眼就知道含义,那为什么不使用一个更合适的命名呢?这样不仅不需要在后面写注释,更可以让后面用到该变量的时候一眼就可以看的出来。
在我以前的后端编程中,时长我经常用duration这个变量来表示,但是存在一个问题,就是这个单位总是和前端的两个同事(安卓开发和iOS开发)搞混,一个觉得是以秒为单位,一个是以为以分钟为单位,经常容易出现问题,后面我把时长改成了durationInMin或者durationInSec,这样我们前后台联调的效率就高了很多,不会因为单位的问题调试半天。因此在编程中一定要使用合适的命名。
二、做有意义的区分
之前我在同事的代码里面看到一段关于字符串处理的函数,把字符数组赋值给另外一个字符数组,他是这样写的:
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++ ){
a2[i] = a1[i];
}
}
这一段代码看着特别的简单,把a1的所有元素通过for循环依次赋值给a2,但是这样的命名在代码中多了,就会显得特别的乱,在代码中我们还是尽量避免这样的命名,把a1改成source,把a2改成destination,这样函数看起来就会更有意义。
还是就是,假如有一个Product类,如果还有一个名为ProductInfo或者ProductData的类,这样显然是没有太大的意义,表达的意思都是同一个。另外我还发现,有些同事喜欢写xxxStr,这个变量还一定是字符串变量,比如nameStr,这就让我很疑惑了,难道name还能是数值类型的?nameInt?显然这样的命名也是没有意义的,直接写一个name不是更香吗?
对于函数来说,比如我有3个函数分别是:
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
当我需要获取活跃用户的账户时,我该调用哪个函数呢?是不是会一脸懵逼?所以当我们在命名的时候,一定要注意命名要有意义,这样使用起来才会更加方便。
三、命名风格要统一
我在以前一个大项目中,由于参与的开发同事特别多,所以在代码里,我既可以看到xxxController,也可以看到xxxManager,还有一些地方看到xxxDriver,但仔细看他们的代码,都是类似的逻辑实现部分,相当于MVC里面的C。当一个项目中含有这三种命名的时候,人的第一感觉是不同类型的名字,所以特别的不好,一个项目应该使用统一的命名,要不就统一使用xxxController,要不就统一使用xxxManager,或者统一使用xxxDriver。
同样的,由于有些方法是添加一个元素到数组中,有些人用的是insert,有些人用的是add,有些人用的是append,这样在做全局搜索的时候特别麻烦,搜索insert的时候,add和append无法搜索的到。因此,在写这些有多种表达的变量名的时候,我们需要更多地去阅读之前的代码,和其他的风格保持一致,尽量让其他人不会看得出代码是由不同的人写出来的。