约定式变量名
2023年9月21日大约 3 分钟
如果我们能有约定式提交 Conventional Commits,那么我们也应该有约定式变量名。这并不是为了设计一种全新的命名规则来取代现有的;恰恰相反,约定式变量名希望能够在和尽可能多的现有命名规则不冲突的情况下,提高变量的可读性,也提升开发体验。
概述
我们希望变量命名能够提供较多的信息,同时保证语法上的简洁。并且赋予变量名统一的规则,方便开发人员记忆的同时,也提升自动补全的效率。因此我们约定变量名应当具有如下格式:
<类型> <描述> <修饰>
- 类型:我们所说的类型并不是各个语言的类型系统。实际上,得益于现代化的语言服务器协议和代码编辑器的支持,我们几乎不再需要通过变量名推断其类型。此处所说类型应当更多包含语义上的类型,如
size
num
factor
dim
len
type
flag
func
module
type
interface
等。我们并不禁止多个语义类型对应同一种程序类型,比如size
len
num
dim
均可以是int
类型;同样我们也不禁止一个语义类型对应多种程序类型,如func
可以为函数对象,也可以为一个代表函数名的str
。您也可以根据实际项目的需要增添或减少语义类型的名类,只要在程序中保持统一的分类标准即可。类型名称允许一定程度的缩写,如dimension
即可缩写为dim
,但不宜缩写为d
以避免和潜在的data
等类型混淆。 - 描述:对于变量名的描述,比如输入输出
input
output
,人员faculty
student
alumni
等。对于变量名的描述可以包含多个单词,同时应当以含义明确、不混淆为前提保持简洁。 - 修饰:如果该变量由另一变量衍伸而来,那么应当使用合适的修饰名进行说明,常见的如表示元素集合
list
seq
array
collection
等,或是表示相对状态frozen
history
new
last
prev
next
temp
。尽管不禁止叠加使用多个修饰词,但同样不鼓励这种使用方式,因为修饰词之间的顺序通常是未被定义的,叠用多个修饰符可能会导致无法正确自动补全,因此我们建议在这种情况下根据变量的实际含义进行进一步区分,通过使用不同的描述来避免叠加修饰词。
示例
- 学生数量
num_student
- 增长因子
factor_growth_rate
- 上一步骤输出的维度
dim_output_prev
例外
- 如果某变量仅为临时变量,作用范围较小,如循环语句中的临时变量,那么可以不遵守如上约定,但我们仍然鼓励使用尽可能贴切的单词(或缩写)来明确含义,如在二维循环遍历时使用
row
col
而非i
j
。 - 如果变量实际内容非基础类型,并且在程序中多次使用到该类型,那么可以忽略变量命名中的
<类型>
一项,如在深度学习程序中可以将data_input
或tensor_input
简化为input
。当然在这个例子中,我们其实也可以使用其他的类型名,如mat
vec
scalar
等来进一步明确内容形式。
说明
简单的想法和提议,欢迎讨论和补充。