java命名总结
下文主要来源于网上,我做了一些编辑整理。
“如果你不知道一件事物叫什么,
你就不知道它是什么。
如果你不知道这是什么,
你就不可能坐下来写代码。”
----萨姆·加德纳(Sam Gardiner)
1.大原则:见名知意,名副其实
对于方法或变量命名,编写者应当做到:一个初次接触代码的阅读者仅通过其名字就能揣测其用途,而不需要通过仔细代码来分辨。
反之,如果阅读者需要认真审视上下文才能了解其含义,可以认为其命名是令人费解的;如果其真实含义和名字存在分歧,则可以认为其命名是不恰当的。
下面是一个对照的例子:
令人费解的命名
|
好的命名
|
---|---|
x = x -xx xxx = fido + salesTax( fido ); x = x + LateFee(x1, x) + xxx; x = x + Interert(X1, x); |
balance = balance - lastPayment; monthlyTotal = newPurchases + addSalesTax( newPurchases ); balance = balance + evaluateLateFee( customerID, balance ) + monthlyTotal; balance = balance + addInterest( CustomerID, balance); |
2.命名细则:
原则
|
解释
|
---|---|
同一性 | 在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。如骆驼命名法,大括号位置等。 |
标识符组成 | 标识符采用英文单词(必要或无歧义可以加入数字或下划线)或其组合,应当直观且可以拼读,可望文知意,用词应当准确。 |
最小化长度 && 最大化信息量原则 |
在足够描述用途的前提下,尽量以最小词汇量去描述事物,如staff就比 company_person_collection要简捷易记。 也可采用有广泛共识的缩写后缀,如msg,idx,cnt,btn,id ,flg等,如果缩写共识度不高,请在取得同事们共识后用注释说明其含义。 变量/函数长度控制在4~18个字符内,有助于对代码的理解。 过长的变量:howLongDoesItTakeToOpenTheDoor, howBigIsTheMaterial… 简捷的变量:timeToOpenTheDoor, materialSize. |
避免过于相似 | 不要出现仅靠大小写区分的相似的标识符,例如“i”与“I”,“function”与“Function”等等。 |
正确命名具有互斥意义的标识符 |
用正确的反义词组命名具有互斥意义的标识符 ,如 add / remove begin / end create / destroy 这些有助于理解成对的变量/函数的意义. |
尽量避免名字中出现数字编号 | 尽量避免名字中出现数字编号,如value1,value2等,除非逻辑上的确需要编号。 |
少使用类型前缀 | C/C++程序员喜欢这么做,那是因为环境特殊。但在Java中并不提倡,最好从名字上就能揣测出其类型。加后缀说明是可以的。 |
少单独使用含义广泛的词 | 如data,info,value等。 |
能用主动语态的词就不用被动语态的词 |
能用主动就绝不用被动语态的词,便于用户理解,同时也遵守标识符的语法规则。 被动语态:class PlanEvents 主动语态:class EventPlanner/class Scheduler |
避免过度使用get作为方法前缀 | 应该用更精确的动词描述动作,如“请求”request,“获取”acquire,“查找”search/lookfor/find,“查询”inquire,“构建”build 或“创建”create |
3.名词、动词和形容词在命名中的使用
对于变量,一般采用名词命名,如salary;如果其含义较复杂,建议采用形容词+名词的形式,如totalSalary;如果不会产生歧义,可以使用名词+名词的方式,如minerSalavry,flightNumber, carColor
对于方法,一般采用动词+名词的方式命名,如drawBullet,cleanScreen; 也可以采用省略动词的介词+名词的形式,如onMessage,onAbort,onExit.
如用于限制范围,可以在名词前加入介词,如要修饰名词,可以在名词前加入形容词,如sumZombieFansCnt。
4.多使用常见的有共识的词汇
生僻词汇容易造成困惑,常见词汇易于达成共识。
词性
|
常见词汇
|
---|---|
名词 |
comparison比较(结果) ,decrement递减量 , decrement递减量 , dest/destination目标 , expected value/expectation:期望值 , idx:index的简写 , height高 ,increment递增量 , msg:message的简写 , num数字 , price价钱价格 , priority优先级 , rate比率 , score成绩分数 , src/source 源 , sum累计值 , total总和总计的 , usr/user用户 , weight重量 |
动词 |
access存取 , add添加 , append添加到尾部 , apply(to)适用于 , cancel取消 , can能做什么 , change交换 , compare比较 , contains包含 , crash崩溃 , create创建 , decode解码 , delete删除 , display显示 , encode编码 , erase 抹去 , evaluate计算 , execute执行 , exist存在 , fetch取回 , flush清空缓存 , get获得 , has有什么 , insert插入 , invoke调用 , is是什么 , list列举 , manage管理 , minus减 , need需要什么 , provide提供 , query查询 , remove 搬离 , run运行 , save保存 , select选择 , should应当做什么 , sort排序 , store存储 , submit提交 , update更新 |
形容词 |
avg/average平均 , corresponding相应的对应的 , decisive决定性的 , final最终的 , legal合法的,illegal不合法的 , max最大 , min最小 , often used/frequently used:常用的 , partly:部分的 , periodically:定期的 , relevant:相关的 , seldom used:不常用的 , time-consuming:耗时的, unpredictable:不可预计的 , unrecongnized:未被认定的 |
5.分类单词表
返回真伪值的方法
場所
|
单词
|
意义
|
例
|
---|---|---|---|
Prefix | is | 对象是否是所期待的状态 | isChecked |
Prefix | can | 对象能否执行所期待的动作 | canRemove |
Prefix | should | 调用方执行某个命令好还是不好 | shouldMigrate |
Prefix | has | 对象是否持有所期待的数据和属性 | hasObservers |
Prefix | needs | 调用方是否需要执行某个命令 | needsMigrate |
按需求才执行的方法
場所
|
单词
|
意义
|
例
|
---|---|---|---|
Suffix | IfNeeded | 需要的时候执行,不需要的时候什么都不做 | drawIfNeeded |
Prefix | might | 同上 | mightCreate |
Prefix | try | 尝试执行,失败时抛出异常或是返回errorcode | tryCreate |
Suffix | OrDefault | 尝试执行,失败时返回默认值 | getOrDefault |
Suffix | OrElse | 尝试执行、失败时返回实际参数中指定的值 | getOrElse |
Prefix | force | 强制尝试执行。error抛出异常或是返回值 | forceCreate, forceStop |
异步相关方法
場所
|
单词
|
意义
|
例
|
---|---|---|---|
Prefix | blocking | 线程阻塞方法 | blockingGetUser |
Suffix | InBackground | 执行在后台的线程 | doInBackground |
Suffix | Async | 异步方法 | sendAsync |
Suffix | Sync | 对应已有异步方法的同步方法 | sendSync |
Prefix or Stem | schedule | Job和Task放入队列 | schedule, scheduleJob |
Prefix or Stem | post | 同上 | postJob |
Prefix or Stem | execute | 执行异步方法(注:我一般拿这个做同步方法名) | execute, executeTask |
Prefix or Stem | start | 同上 | start, startJob |
Prefix or Stem | cancel | 停止异步方法 | cancel, cancelJob |
Prefix or Stem | stop | 同上 | stop, stopJob |
回调方法
場所
|
单词
|
意义
|
例
|
---|---|---|---|
Prefix | on | 事件发生时执行 | onCompleted |
Prefix | before | 事件发生前执行 | beforeUpdate |
Prefix | pre | 同上 | preUpdate |
Prefix | will | 同上 | willUpdate |
Prefix | after | 事件发生后执行 | afterUpdate |
Prefix | post | 同上 | postUpdate |
Prefix | did | 同上 | didUpdate |
Prefix | should | 确认事件是否可以发生时执行 | shouldUpdate |
与集合操作相关的方法
单词
|
意义
|
例
|
---|---|---|
contains | 是否持有与指定对象相同的对象 | contains |
add | 添加 | addJob |
append | 添加 | appendJob |
insert | 插入到下标n | insertJob |
put | 添加与key对应的元素 | putJob |
remove | 移除元素 | removeJob |
enqueue | 添加到队列的最末位 | enqueueJob |
dequeue | 从队列中头部取出并移除 | dequeueJob |
push | 添加到栈头 | pushJob |
pop | 从栈头取出并移除 | popJob |
peek | 从栈头取出但不移除 | peekJob |
find | 寻找符合条件的某物 | findById |
与状态相关的方法
单词
|
意义
|
例
|
---|---|---|
ensure | 检查是否为期待的状态,不是则抛出异常或返回error code | ensureCapacity |
validate | 检查是否为正确的状态,不是则抛出异常或返回error code | validateInputs |
操作对象生命周期的方法
单词
|
意义
|
例
|
---|---|---|
initialize | 初始化。也可作为延迟初始化使用 | initialize |
abandon | 销毁的替代 | abandon |
destroy | 同上 | destroy |
dispose | 同上 | dispose |
与数据相关的方法
单词
|
意义
|
例
|
---|---|---|
create | 新创建 | createAccount |
new | 新创建 | newAccount |
from | 从既有的某物新建,或是从其他的数据新建 | fromConfig |
to | 转换 | toString |
update | 更新既有某物 | updateAccount |
load | 读取 | loadAccount |
fetch | 远程读取 | fetchAccount |
delete | 删除 | deleteAccount |
remove | 删除 | removeAccount |
save | 保存 | saveAccount |
store | 保存 | storeAccount |
commit | 保存 | commitChange |
apply | 保存或应用 | applyChange |
clear | 清除数据或是恢复到初始状态 | clearAll |
reset | 清除数据或是恢复到初始状态 | resetAll |
常见布尔变量:
单词
|
意义
|
---|---|
done | 完成 |
error | 错误 |
success/ok | 成功 |
available | 可用 |
found | 已找到 |
complete(d) | 完成 |
6.结语
对于非英语系程序员来说,变量的起名和函数的命名都是一件令人头疼的事情,主因是词汇量和对单词的认知程度先天有限.....但我们编码是为了让别人或未来的自己更好的去阅读,而不是“迷惑”别人或自己。
无论是想要有效的管理一个复杂程度稍高的代码体系,或是维护自己的代码库,能有一套统一的、清晰明了的命名原则是一件事半功倍的有效手段,利人利己,值得花不多的工夫把它掌握熟悉起来。
每个东西都有一个名称,每个名称只用于一件事。使用多个词来表示相同的事物,或者同一个词来表示不同的事物,会浪费认知的努力并且可能导致混淆。这不仅适用于代码,而且适用于我们工作环境中的所有内容。
java命名总结的更多相关文章
- Java命名规范
驼峰法则: 将所有字母都小写(包括缩写),然后将单词的第一个字母大写. 每个单词的第一个字母都大写,来得到大驼峰式命名. 除了第一个单词,每个单词的第一个字母都大写,来得到(小)驼峰式命名. 为避免歧 ...
- Java命名规范基础
一.java命名规范 1.类和接口:由多个单词组成时,所有单词的首字母大写,如TestJava 2.变量名和方法(函数):由多个单词组成时,所有第一个单词的首字母小写,之后每一个单词的首字母大写,如: ...
- java编程规范之java命名规范
想要成为一个优秀的程序员,首先要培养良好的编程习惯,为了提高代码的可读性,必须有好的命名规范. 这篇文章是小编结合网上的很多资料整理出来的,若有不当或错误的地方,欢迎大家指正 在文章开始前,为方便阅读 ...
- Java命名默认规范
学习java的时候,命名的大小写经常弄混,所以在此总结一下java命名规范 1.project(项目名) 说法不一,暂定小写,eg:arraytest 2.包名 小写,eg:package array ...
- [JAVA第二课] java命名规则
Java良好的命名规则以及代码风格可以看出来一个程序员的功底,好多公司也会注重这方面,他们招聘员工在有些时候往往就是根据一个人的代码风格来招人,所以下面就就我知道的代码风格作简要的说明一下.Java命 ...
- Java命名和目录接口——JNDI
JNDI即Java命名和目录接口(JavaNaming and Directory Interface),它属于J2EE规范范畴,是J2EE的核心技术之一,提供了一组接口.类和关于命名空间的概念.JD ...
- Java~命名规范
下面总结以点java命名规范 虽然感觉这些规范比起C#来说有点怪,但还是应该尊重它的命名! 命名规范 项目名全部小写 包名全部小写 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. ...
- Java 趣史-差点把 Java 命名成了 Silk(丝绸)
差点把 Java 命名成了 Silk(丝绸) Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆). ...
- Java Naming and Directory Interface (JNDI) Java 命名和目录接口
https://www.oracle.com/technetwork/java/jndi/index.html Lesson: Overview of JNDI (The Java™ Tutorial ...
- JNDI(Java Naming and Directory Interface,Java命名和目录接口)
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访 ...
随机推荐
- python 之 sys.stdout输出不换行
在处理程序打进度条时,希望不换行显示进度,可以使用sys.stdout相关函数来进行处理. 1.print 输出不换行 首先可以使用print函数来整体输入,利用,结尾就可以在同一行内显示: # py ...
- grub破解和bios加密
grub破解通过单用户模式,可以实现修改密码 grub加密以后,只能通过bios解除grub密码,方法如下 进入bios 修改启动方式,从CD启动 加载系统镜像,原系统默认挂载到/mnt/sysima ...
- MongoDB的集群模式--Sharding(分片)
分片是数据跨多台机器存储,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署. 具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量.例如,高查询率会耗尽服务器的CP ...
- 宝塔面板1G内存安装mysql5.7提示“至少需要XX兆内存”的解决办法
打开文件:/www/server/panel/class/panelPlugin.py 搜索关键词:“至少” (可能在134行) 然后把这行if语句注释掉,如下图:
- Docker 0x03:Install Docker
目录 Install Docker Centos yum 安装 运行docker-daemon并开机自启动 运行hello-world应用docker容器中 Ubn Install Docker do ...
- echarts地图 绘制部分上海市公交线路数据
源代码地址 https://github.com/a1115040996/MyHTML/blob/gh-pages/echarts/roadMap.html 预览地址 https://a1115040 ...
- 汇编 JMP 详解
汇编 JMP 详解 关键词说明 RVA: 相对虚拟地址(Relative Virtual Address),在内存中相对于PE文件装入地址的偏移位置,是一个相对地址. JMP 的 3 种类型 短跳转( ...
- centos7服务器部署django项目。
用到的工具,xftp(文件互传),xshell(远程连接) aliyun服务器防火墙开启的端口.80,22(ssh),3306(mysql),8000,9090 部署项目: 1,安装nginx 1&g ...
- 使用django的MTV开发模式返回一个网页
1.MTV开发模式介绍 M:Models 模型(数据) 与数据组织相关的功能.组织和存储数据的方法和模式,与数据模型相关的操作. T:Templates 模板(样式) 与表现相关的所有功能.页面展示风 ...
- Maven 学习(一)-Maven 使用入门
http://www.cnblogs.com/xdp-gacl/p/3498271.html http://www.cnblogs.com/xdp-gacl/p/4240930.html 一.Mave ...