对我来说,为某事找到好名字总是会回到将其视为必须证明其存在的理由的对象。问你自己:
- 类/方法/变量有什么作用,即它的主要用途是什么?
- 它需要传达什么特定的目的,即名称中必须包含什么基本部分?
大多数开发人员都会同意,在命名方面,可读性始终是最重要的。不要只是编写代码,以便在编写代码时就知道您的意思,而是编写代码,以便将来在某个时候第一次看代码的人无需过多思考就可以知道您的意思。您只需要编写一次代码,但是在其生命周期中,很可能必须对其进行多次编辑,甚至需要阅读多次。
代码应该是自我记录的,也就是说,您的命名应该使所做的事情显而易见。如果您需要解释代码行在注释中的作用,而重命名并不能对其进行足够的改进,则应认真考虑将该行重构为具有适当描述性名称的新方法,以便阅读原始方法,新方法调用描述了正在发生的事情。不要害怕拥有长名字;当然,您不应该用类/方法/变量名来写小说,但是我宁愿名称太长,描述性强也不要太短,我需要在幕后才能弄清楚它的作用。除了一些明显的例外(例如x / y坐标和常用的首字母缩写)外,请避免使用单字符名称和缩写。调用“ bkBtn”而不是“ backButton”
在您的语言允许的范围内,使您的代码看起来像英语句子。对象使用名词,方法使用动词。布尔方法通常以“ is”开头,但根据使用情况,还有许多其他选项可以更好地传达含义,例如“ can”,“ should”或“ does”。当然,并非所有语言都可以像Smalltalk一样出色,但是某些符号通常被理解为句子的一部分。我个人想尽可能多地采用其他语言的两种Smalltalk约定是,循环参数的名称以“ each”作为前缀,方法的参数以文章“ a”(或集合的“ an”或“ some”)作为前缀。 。这可能不是Java中的通用标准,欢迎任何人忽略此位,但是我发现这大大提高了代码的可读性。例如(Java中的示例):
public boolean shouldConsiderAbbreviating(List<String> someNames) {
for (String eachName : someNames) {
if (isTooLong(eachName)) {
return true;
}
}
return false;
}
对于只有一点点Java知识的人来说,这应该是可读的,例如:
要确定是否应考虑缩写一些名称(字符串)的列表,遍历一些名称,并为每个名称确定名称是否太长;如果是这样,返回true
;如果都不是太长,则返回false
。
将上面的代码与仅命名参数strings
和循环变量进行对比string
,尤其是在更复杂的方法中。您必须仔细查看才能看到区别,而不是一眼看出名称的用法就很明显。