跳到主要内容

inBuilder低代码平台开发者分享课丨变量命名要义

引言

各位同学,大家好。
或许你现在在使用inBuilder低代码平台进行开发,又或者是传统的开发方式。

但不论你使用哪种开发方式和开发语言,从事什么样的业务,我们每天都面临着对大量的变量进行命名的场景。 同时,软件工程是一个复杂度极高的工程,软件开发需要多人协作并长期维护。 在这个大背景下,我们要写出优秀的代码,要求很强的逻辑性、很高的可读性和扩展能力,需要我们重视命名这项工作。
此处的命名包含变量命名类命名包命名文件命名路由命名等。

很多同学写代码,或因经验不足、或因项目急,或因词汇量不够,在变量命名时大脑一片空白,好一点的会用些词不达意的简单单词,实在想不出来就用拼音代替。可谓八仙过海,各显神通。

这篇文章,旨在帮助同学更好更快地命名变量。
主要讲下什么是一个好的变量命名,优秀的变量命名是如何想出来的,以及列出命名变量时常用的单词词汇。

最佳的变量名

在命名变量时,最重要的考虑因素是,变量名要完整且准确地描述变量所代表的实体。
换句话说,通常情况下,对于变量实体的描述就是对该变量最好的命名。
例如
complexcityOfPasswordunSavedRecordshealthIndicatortasksToExecuteteamNumCount

变量命名的几种常见类型

数据

可以用XXXListXXXMapXXXSet来表示,例如menuListfieldListreferenceMap

也可以用集合表示的事物的复数形式,XXXsXXXes,例如:rowscolsusersdetailsitems

特殊状态

开发中经常遇到需要处理的数据,比方需要进行过滤挑选的数据、选中的数据、未保存的数据、当前数据,这类变量必须在前面加上修饰词、限定词。例如:filteredDetailsselectedRowsunSavedRecordscurrentIndextotalCountdefaultPasswordcommonTargetexpiredKeys

标志性变量

这类变量通常是布尔变量,只有truefalse。表示是否可以用isXXXflag例如:isLoginisLast;表示开关可以用enableswitchOn、;表示成功失败,可以用succeedfound。尽量不要使用否定形式,例如:notXXXdisablefailed,否定形式容易让人难以理解。

带层级关系变量

这种变量在处理嵌套数据的时候最常见,可以使用表示层级关系的形容词修饰。

例如:outerContainernestedExceptioninnerPagewrapedDataincludedFilescoveredDetailparentObjenclosedArea

特定范围

范围类的形容词包含时间、地点、位置等几大类。

时间有现在、过去、未来,例如:lastestOperation

地点有国内、国外、当地、远程,例如:localMachineremoteClient

位置有上下左右前后,例如:currentItemleftSidetopPanel

对象属性

对于对象的属性名,最好加上对象本身的名字,用xxxProperty表示,例如:userInfoobjIdtabNamerequestDatasysOptiontokenTime

另一种表示形式是把属性名放在对象名之前,用xxxOfXxx,例如lengthOfSubstrcomplexcityOfPasswordfieldsOfObj

交互型变量

系统间交互、方法间调用都可以用下面这种形式来体现交互性。例如:responseForPostasksToExecute

角色型变量

这种变量最能体现面向对象编程。面向对象编程,通俗来讲就是各司其职,每个对象都有自己的专属工作。

这种变量形如事物+动作的执行者。

例如:eventHandlerdataConverterloadBalancermessageGeneratorrequestDispatcherhealthIndicatorConfigurationImportSelectorcacheLoader

描述型变量

这种变量后面通常会添加一个体现该变量作用的类名。(这种方式在给类起名字时最常用、Java类名首字母要大写)

例如:userEntityserviceInstanceorgQueryServiceredisConfignetConstant

临时变量

有些临时变量,不必大费周章。当你在小的for循环中、嵌套的for循环中需要给对象的属性命名时,不要给它加上限定词。例如下面的代码,for循环的 i 不需要currentIndex这种,写了反而看着很累。 在Java等很多语言中,i、j、k都约定为index。

        let objs = [];
for (let i = 0; i < idList.length; i++) {
let item = that.vm.getObjById(idList[i]);
objs.push(item);
}
return objs;

变量命名的约定/习俗(Convention)

各行各业,都有自己行业内约定成俗的做法,软件工程也不例外。 同时,软件工程是基于电子计算机、互联网等大背景下,也要考虑大背景下的约定。 另外,软件工程可以应用到传统的各行各业,也必须要遵守各行业的约定。 在这里,我们引出一个概念,叫做领域(Domain)。一切编码一定要遵守领域内的约定。

领域

互联网是一个领域,在此领域下,有像DNSIPHTTP等这样常见的名称,因此你不能将这些符号来尝试用在你自己创造的实体上。
inBuilder也是一个领域,在此领域下,有像MSUCAFBizContext等名称,你也不能用它来表示其他含义。
权限控制,也是一个领域,在此领域下,有用户角色权限等概念,你最好也不要使用其他词汇来表示这三者,独树一帜,要使用项目上约定成俗的词汇。
特别是算法一类的领域,比如加密算法,在此领域下有各种私钥公钥偏移量等概念,不要试图让很多约定成俗的简写,变成非专业人士就能看懂的词汇,这样的做法,破坏了领域内的共同认知。
领域其实也可以分成业务领域和技术领域
尽量避免把技术词语用在具体业务中,把技术领域专业的词放到业务领域,会很不协调。反之亦然。 例如,classLoadereventHandler等基础架构层的东西放到财务模块,就显得很不协调。而正确的做法应该是封装,对外暴露接口,屏蔽掉具体细节。这种不协调的做法在实际开发中还是蛮常见的,需要多多注意。

Java编码的约定

  1. i,j通常为索引变量。

  2. 常量要大写,使用下划线来分割。

  3. 类和接口名称要首字母大写,采用驼峰命名。

  4. 变量和方法名要字母小写,采用驼峰命名。

  5. get和set前缀用在访问变量的方法名上。

约定的好处

约定的最大好处就是减少开发成本。 体现在以下几点:

  1. 通过项目来传递知识。接手陌生的项目时,一个单词在项目中频繁出现,这个单词一定是非常重要且基础的概念,你可以快速了解到这些概念之间的联系,从而构建新的知识网络。

  2. 快速开发。阅读源码,你可以得到约定成俗的一套词汇表,在你继续开发的过程中,你可以大胆放心地使用这些词汇,而不会担心会有别人不理解你的代码。也不需要绞尽脑汁,浪费时间地去想一些相关的单词。

  3. 消除歧义。同一个概念,很容易被翻译成两三个单词,这就造成了巨大的学习成本。看了半天源码,发现两个单词代表的是同一类实体。

命名时的检查列表

在命名时,可以通过检查一下几个问题来确定,自己的命名是否是一个好的命名。

  1. 能不能准确且完整的表意

  2. 能否更加精简或使用简写

  3. 是否具有误导性、有歧义

  4. 是否使用了数字(建议不要使用数字)

  5. 是否容易拼错、是否生僻字

  6. 是否易读

  7. 能够使用布尔变量替代,布尔变量能够清晰的表达是或否

  8. 有没有遵守约定、是否参照了项目中的其他命名

百度翻译-200种语言互译、沟通全世界!

变量单词词汇

下面列出了我整理的部分常见变量单词词汇的截图,想要查看更多,点击图片下方的词汇表地址。

词汇表地址

神器:变量命名网站 CODELF

给大家介绍一款自动生成变量名的神奇网站CODELF,只要输入相关词语,就能生成大量的相关变量名,试试吧。 CODELF

附录

类命名

类的命名与变量命名的区别很大,我们都知道,类是面向对象语言才有的概念。

也正是因为如此,类的命名要比变量命名要正式的多。

第一要义就是面向对象,适度抽象

所谓面向对象,就是要确定此类的指责,负责的内容是什么。因此,我们可以给它命名为:HibernateResourceResolverSerializerFactoryZipHelper。让人一看,就知道这个类是来干什么的,可能包含有哪些API。

若想了解更多关于inBuilder的更多相关内容,可点击下述地址下载安装inBuilder低代码平台社区版

https://ibc.inspures.com/