当我们自己写代码的时候,都知道这一行行的代码是什么意思,如何工作,如何实现业务需求的,当然,这些仅仅是「当我们自己在写」的时候。而真实的情况是:当时确实如此,但明天,下周,明年,事实可能是南辕北辙的差别。还有其他人了解我的编码风格吗?对于必须维护我的代码的新团队成员来说,代码是否便于阅读?是否会花几个小时解释一些显而易见的事情,或者纠正其他人由于他们不理解明显「如此明显」的代码而犯的错误?
任何人都不喜欢希望这种情况发生,但谁也无法避免确实会发生。这就是为什么「干净」代码如此重要的原因。使代码尽可能干净将提高其质量,以便其他人可以直观地理解它,从而减少出错的可能性并提高维护的质量。
在本文中,将只讨论干净代码,变量的一个方面。每一个主题标题下的简短的说明性文字。
变量名称应显示程序员的意图。程序员打算使用该变量的意图应该很明显而且易于理解的。不要引用使用变量名t
为老师
的对象,最好使用全程teacher
。同样,当引用诸如整数之类的值时,请使用意图显示名称,例如,使用int maximumScore
代替int i
。
调用一种方法来查找对象属性,而不是使用定义的变量查询,这更统一和直观。
例如,使用connection.isAlive()
代替connections.STATUS
,其中connection
是表示连接的对象,它使用方法isAlive()
来返回连接状态,而connections.STATUS
是一个连接状态的属性。
写代码要讲良心,要善待那些将维护自己的代码的后来人,永远不要在变量名称中使用变量类型的人。如果studentsList
是一个list
,则不要在变量名称中使用单词list
。可能引起混淆,因为变量类型可能从列表更改为其他类型的对象。
可以说名称很长,类似于其他变量或同义词。staff
和employee
之间容易混淆。使用哪个变量?两个单词含义相同。message
和aMessage
或cashAmount
和liquidAmount
之间有什么区别?避免使用相似的名称。最好在写代码之前统一制定相应的用词规范。
大多数开发人员使用自动完成的IDE
工具,因此将根据其名称选择变量或方法。
clazz
一词,因为class是保留关键字。a1
和a2
。String
、Data
、List
、Object
、Table
、Variable
。它们不会在名称的值中添加任何有意义的信息,并且如果名称StringTable
既不是String
也不是Table
,则可能会造成混淆。每个人都知道许多常见的缩写,但并非所有人都知道。避免使用任何缩写,例如,最好使用SchoolUserBirthday
而不是SUB
。想象一下,在和不熟悉您的代码功能的人的会议中谈论代码中的业务实现的时候,当说出要引用该变量时,说SchoolUserBirthday
要比SUB
更容易理解。
有时需要使用IDE
的搜索工具来查找变量。如果假定变量具有与其功能相关的名称,则查找起来会容易得多。因此,这意味着确保正确拼写,避免使用单个字母变量并合理命名对象。
但是用于循环的变量应使用单个字母(例如i
、j
和k
)来命名。
如果类对象名称为Person
,则实现将为PersonImp
的接口。
使用名词命名对象是有意义的。对象旨在代表我们要建模的事物。通常,事物以物理形式存在。因此,将类Account
、Person
、Company
、ShoppingBasket
或Wiki
标记为逻辑意义。另外,正确的命名可以使对象和类更容易搜索和理解。
方法会执行操作,因此使用动词命名它们是合乎逻辑的。诸如save()
、sendMessage()
、convert()
和newPage()
之类的名称方法将使代码更直观。遵循Java Bean
约定,在mutator/accessor
方法前添加get
、set
和is
。
如果使用get
,则不要使用fetch
、retrieve
或obtain
,除非要命名一个语义与另一个概念相关的方法。在给不同类中的方法指定的名称中也要保持一致,如果命名一个电子邮件的类为email
,则不要使用mail
、eMail
、electronicMail
来命名其他类的对象、方法和属性。
虽然提倡每个概念使用一个词表示,不要仅仅为了保持一致性而使用相同的词。例如,在将两个值加在一起时使用add
,但在向数据库添加新记录时不使用它,使用insert
分隔概念,并在连接String
时使用串联。在不同的场景中使用不同的名称将概念分开。
尽量使用专业名称。代码将由程序员而不是非专业人员阅读,因此请继续使用诸如listener
、visitor
、view
、model
、controller
等之类的词。
变量名称只是使代码干净的一小部分,在确保维护代码的人员理解的道路上,还有很长的路要走。