您的位置:首页 > 编程语言

整洁的代码:有意义的命名

2016-03-10 14:20 393 查看

名副其实

简单描述

好的命名会体现它为什么会存在、做什么事、应该怎么用。如果名称需要注释来补充,就不算名副其实。

举例说明

private Integer num; //登陆次数

num给人的感觉是次数,但是不能表明”登陆”的意思。所以可以替换成

private Integer login_num;

这样即使不写注释,我们也能很清楚它的含义。

举例说明

再比如下面的判断:

if (status == 1) { … }

这里的数字1,无法看出它究竟代表什么意思,称为魔数。应该用有意义的名称代替。

if(status == USED) { … }

避免误导

简单描述

程序员必须避免留下掩藏代码本意的错误线索。应当避免使用与本意相悖的词。

举例说明

(1)private String nameList;用来表示一串名字,中间用逗号隔开。

这里应该避免使用list,除非它真的是List类型,List一词对程序员有着特殊的含义。如果并不是真的List,那么就会引起错误的判断。可以修改为private String names;更好一些。

(2)不要在同一“地点”使用在“外形”上难以区分的两个名称,如XYZControllerForEffcientHandlingOfStrings和XYZControllerForEfficientStorageOfStrings。

(3)慎用小写字母l、大写字母O作为变量名。它们与数字1和0太相似了

做有意义的区分

简单描述

如果程序员只是为满足编译器或者解释器的需要而写代码,就会造成麻烦。例如,因为同一作用范围内两样不同的东西不能重名。

举例说明

void copyChars(char a1[], char a2[]) {…}

void copyChars(char source[], char destination[]) {…}

显然source、destination比a1、a2像样多了,这就是有意义的区分。不要做无意义的区分,ProductInfo或ProductData里面的Info和Data就是意义含混的废话,还不如直接用Product。

废话都是冗余,要区分名称,就要以读者能鉴别出不同之处的方式来区分。

使用读得出来的名称

简单描述

使用常用的,能读得出来的单词,便于交流,沟通。不要取一些傻乎乎的名字,让别人觉得很糟糕,很搞笑。

举例说明

Date genymdhms;

genymdhms是什么意思?能读的出是“生成日期,年、月、日、时、分、秒”吗?读不出来的话,还是换成generationTimestamp(生成时间戳)更好点

类名和方法名

简单描述:

类名和对象名应该是名词或名词短语,如Customer、WikiPage、Account、AddressParser。类名不应该是动词。

方法名应该是动词或动词短语。如postPayment、deletePage、save。

属性访问器、修改器和断言应该根据其值命名,并加上get、set、is前缀。例如getName、setName、isPosted。

每一个概念对应一个词

简单描述

给每一个抽象概念选一个词,并且一直使用。不要混用fetch、retrieve、get这些意思相近的词。例如controller、manager,最好选择其中一个,并一直使用。

别用双关语

简单描述

避免将同一单词用于不同目的或者不同概念。例如add如果表示将通过增加或者连接两个现存值来获得新值,那么当表达将一个参数放到集群(collection)中这个意思时就不应该再用add,可以改用insert。

添加有意义的语境

简单描述

假设firstName、lastName、street、houseNumber、city、state这些变量放在一起,则很明确的构成了一个地址。但如果只看见孤零零的state呢?你会理所当然的推断它是某个地址的一部分吗?这时最好添加前缀(如addrState),以此提供语境。必要的时候应该将这些变量和其相应的方法封装到一个类里面以增强语境。

不要添加没意义的语境

简单描述

比如一个名为“Gas Station Deluxe(加油站豪华版)”的应用,给其中每个类都添加GSD前缀,例如GSDAccountAddress,这个GSD纯属多余,与当前语境毫无关联。

如果你在维护别人写的代码,或者自己旧代码,不妨试试上面这些规则,使用重构工具解决问题。效果会立竿见影,而且会持续下去。!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  整洁的代码