java命名总结

摘要:
例如骆驼命名、括号位置等。正确命名具有互斥含义的标识符。使用正确的反义词组来命名具有互斥含义的标识符。例如,add/removebegin/endcreate/destyinsert/deletefirst/lastget/releaseincrease/decisionput/getadd/deletelock/unlock/closemin/maxold/newstart/stoptext/previoussource/targetshow/hidden/rereceivesource/destinationcut/pasteup/down有助于理解成对变量/函数的含义。在名称中尽量避免使用数字,例如value1、value2等,除非逻辑上需要数字。然而,在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
insert / delete       first / last         get / release
increment / decrement                 put / get
add / delete         lock / unlock      open / close
min / max          old / new         start / stop
next / previous      source / target     show / hide
send / receive       source / destination
cut / paste          up / down

这些有助于理解成对的变量/函数的意义.

尽量避免名字中出现数字编号尽量避免名字中出现数字编号,如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.分类单词表

返回真伪值的方法

場所
单词
意义
Prefixis对象是否是所期待的状态isChecked
Prefixcan对象能否执行所期待的动作canRemove
Prefixshould调用方执行某个命令好还是不好shouldMigrate
Prefixhas对象是否持有所期待的数据和属性hasObservers
Prefixneeds调用方是否需要执行某个命令needsMigrate

按需求才执行的方法

場所
单词
意义
SuffixIfNeeded需要的时候执行,不需要的时候什么都不做drawIfNeeded
Prefixmight同上mightCreate
Prefixtry尝试执行,失败时抛出异常或是返回errorcodetryCreate
SuffixOrDefault尝试执行,失败时返回默认值getOrDefault
SuffixOrElse尝试执行、失败时返回实际参数中指定的值getOrElse
Prefixforce强制尝试执行。error抛出异常或是返回值forceCreate, forceStop

异步相关方法

場所
单词
意义
Prefixblocking线程阻塞方法blockingGetUser
SuffixInBackground执行在后台的线程doInBackground
SuffixAsync异步方法sendAsync
SuffixSync对应已有异步方法的同步方法sendSync
Prefix or StemscheduleJob和Task放入队列schedule, scheduleJob
Prefix or Stempost同上postJob
Prefix or Stemexecute执行异步方法(注:我一般拿这个做同步方法名)execute, executeTask
Prefix or Stemstart同上start, startJob
Prefix or Stemcancel停止异步方法cancel, cancelJob
Prefix or Stemstop同上stop, stopJob

回调方法

場所
单词
意义
Prefixon事件发生时执行onCompleted
Prefixbefore事件发生前执行beforeUpdate
Prefixpre同上preUpdate
Prefixwill同上willUpdate
Prefixafter事件发生后执行afterUpdate
Prefixpost同上postUpdate
Prefixdid同上didUpdate
Prefixshould确认事件是否可以发生时执行shouldUpdate

与集合操作相关的方法

单词
意义
contains是否持有与指定对象相同的对象contains
add添加addJob
append添加appendJob
insert插入到下标ninsertJob
put添加与key对应的元素putJob
remove移除元素removeJob
enqueue添加到队列的最末位enqueueJob
dequeue从队列中头部取出并移除dequeueJob
push添加到栈头pushJob
pop从栈头取出并移除popJob
peek从栈头取出但不移除peekJob
find寻找符合条件的某物findById

与状态相关的方法

单词
意义
ensure检查是否为期待的状态,不是则抛出异常或返回error codeensureCapacity
validate检查是否为正确的状态,不是则抛出异常或返回error codevalidateInputs

操作对象生命周期的方法

单词
意义
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命名总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell 常用毕业设计:文献参考(5)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java并发机制和底层实现原理

  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行。Java中的并发机制依赖于JVM的实现和CPU的指令。      Java语言规范第三版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量...

spark教程(14)-共享变量

spark 使用的架构是无共享的,数据分布在不同节点,每个节点有独立的 CPU、内存,不存在全局的内存使得变量能够共享,驱动程序和任务之间通过消息共享数据 举例来说,如果一个 RDD 操作使用了驱动程序中的变量,spark 会将这个变量的副本和 task 一起发送给 executor 中的执行者,对该变量的更新只存在于 task 的内部,并不会回传给驱动程...

final修饰静态成员变量。

目标:final修饰静态成员变量。   final修饰变量的总规则,有且仅能被赋值一次。   final修饰静态成员变量,变量变成了常量。   常量:有public static final 修饰,名称字母全部大写,多个单词用下划线连接。  拓展:   final修饰静态成员变量可以在哪些地方赋值一次。   1,定义的时候赋值一次。   2,可以在静态代码...

R语言用向量自回归(VAR)进行经济数据脉冲响应研究分析

原文链接:http://tecdat.cn/?p=9368 自从Sims(1980)发表开创性的论文以来,向量自回归模型已经成为宏观经济研究中的关键工具。这篇文章介绍了VAR分析的基本概念,并指导了简单模型的估算过程。 单变量自回归 VAR代表向量自回归。为了理解这意味着什么,让我们首先来看一个简单的单变量(即仅一个因变量或内生变量)自回归(AR)模...

函数的调用过程与出入栈

函数调用的过程 线程执行的基本行为是函数调用,每次函数调用的数据都是通过Java栈传递的。Java栈与数据结构上的栈有类似的含义,它是一块先进后出的数据结构,只支持入栈和出栈两种操作。Java栈的主要内容是栈帧。每次函数调用都会有一个对应的栈帧被压入Java栈,每次函数调用结束(无论是正常返回或者抛出异常),都会有一个栈帧被弹出Java栈。 如图所示,函数...

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ) 1.Linux shell 截取字符变量的前8位 实现方法有如下几种: expr substr “$a” 1 8 echo $a|awk ‘{print substr(,1,8)}’ echo $a|cut -c1-8 echo $ expr $a : ‘(....