算机运行使用二进制机器语言,不管什么编程语言,最终都是要翻译成机器语言的。编程语言使用英语表达,是路径依赖的原因,命名一定要规范,杜绝拼音(多音字伤人啊拼音有时候有歧义),一定要用英文。注释和命名是一个程序员的逼格,不能偷懒。在多人项目中,建议偷偷学习一下同事的编码规范
好的命名能体现出代码的特征,含义或者是用途,让阅读者可以根据名称的含义快速厘清程序的脉络。不同语言中采用的命名形式大相径庭。
一、Java中常用到的命名形式共有三种
既首字母大写的UpperCamelCase,首字母小写的lowerCamelCase以及全部大写的并用下划线分割单词的UPPERCAMELUNSER_SCORE。
通常约定,类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用。
类型(名) | 约束 | 例 |
---|---|---|
项目 | 全部小写多个单词用中划线分隔‘-’ | spring-cloud |
包 | 全部小写 | com.alibaba.fastjson |
类 | 单词首字母大写 | Feature,FieldDeserializer |
变量 | 首字母小写多个单词组成时,除首个单词其他单词首字母都要大写 | password, userName |
常量 | 全部大写,多个单词,用'_'分隔 | CACHEEXPIREDTIME |
方法 | 同变量 | read(), getById(Long id) |
二,包命名
包名统一使用小写,点分隔符之间有且仅有一个自然语义的英文单词或者多个单词自然连接到一块(如 springframework,deepspace不需要使用任何分割)。包名统一使用单数形式,如果类命有复数含义,则可以使用复数形式。
包名的构成可以分为以下几四部分【前缀】 【发起者名】【项目名】【模块名】。常见的前缀可以分为以下几种:
前缀 | 例 | 含义 |
---|---|---|
indi或onem | indi.发起者名.项目名.模块名.…… | 个体项目个人发起,但非自己独自完成可公开或私有项目,copyright主要属于发起者。 |
pers | pers.个人名.项目名.模块名.…… | 个人项目指个人发起,独自完成,可分享的项目copyright主要属于个人 |
priv | priv.个人名.项目名.模块名.…… | 私有项目,指个人发起,独自完成非公开的私人使用的项目,copyright属于个人。 |
team | team.团队名.项目名.模块名.…… | 团队项目,指由团队发起并由该团队开发的项目copyright属于该团队所有 |
顶级域名 | com.公司名.项目名.模块名.…… | 公司项目copyright由项目发起的公司所有 |
三,类命名
类名使用大驼峰命名形式,类命通常时名词或名词短语,接口名除了用名词和名词短语以外,还可以使用形容词或形容词短语,如Cloneable,Callable等,表示实现该接口的类有某种功能或能力。对于测试类则以它要测试的类开头,以Test结尾,如HashMapTest。
对于一些特殊特有名词缩写也可以使用全大写命名,比如XMLHttpRequest,不过笔者认为缩写三个字母以内都大写,超过三个字母则按照要给单词算。这个没有标准如阿里巴巴中fastjson用JSONObject作为类命,而google则使用JsonObjectRequest命名,对于这种特殊的缩写,原则是统一就好。
属性(类) | 约束 | 例 |
---|---|---|
抽象 | Abstract 或Base 开头 | BaseUserService |
枚举 | Enum 作为后缀 | OSType |
工具 | Utils作为后缀 | StringUtils |
异常 | Exception结尾 | RuntimeException |
接口实现 | 接口名+ Impl | UserServiceImpl |
领域模型相 | /DO/DTO/VO/DAO | 正例:UserDAO反例:UserDao |
设计模式相关 | Builder,Factory等 | 当使用到设计模式时要使用对应的设计模式作为后缀如ThreadFactory |
处理特定功能 | Handler,PredicateValidator | 表示处理器,校验器,断言这些类工厂还有配套的方法名如handle,predicate,validate |
测试 | Test后缀 | UserServiceTest表示用来测试UserService类的 |
MVC分层 | Controller,ServiceServiceImpl,DAO后缀 | UserManageControllerUserManageDAO |
四,方法
方法命名采用小驼峰的形式,首字小写,往后的每个单词首字母都要大写。和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。
4.1 返回真伪值的方法
注:pre- prefix前缀,suf- suffix后缀,alo-alone 单独使用
位置 | 单词 | 意义 | 例 |
---|---|---|---|
pre | is | 对象是否符合期待的状态 | isValid |
pre | can | 对象能否执行所期待的动作 | canRemove |
pre | should | 调用方执行某个命令或方法是好还是不好应不应该,或者说推荐还是不推荐 | shouldMigrate |
pre | has | 对象是否持有所期待的数据和属性 | hasObservers |
pre | needs | 调用方是否需要执行某个命令或方法 | needsMigrate |
4.2 用来检查的方法
单词 | 意义 | 例 |
---|---|---|
ensure | 检查是否为期待的状态不是则抛出异常或返回error code | ensureCapacity |
validate | 检查是否为正确的状态不是则抛出异常或返回error code | validateInputs |
4.3 按需求才执行的方法
位置 | 单词 | 意义 | 例 |
---|---|---|---|
suf | IfNeeded | 需要的时候执行不需要则什么都不做 | drawIfNeeded |
pre | might | 同上 | mightCreate |
pre | try | 尝试执行失败时抛出异常或是返回errorcode | tryCreate |
suf | OrDefault | 尝试执行失败时返回默认值 | getOrDefault |
suf | OrElse | 尝试执行失败时返回实际参数中指定的值 | getOrElse |
pre | force | 强制尝试执行error抛出异常或是返回值 | forceCreate, forceStop |
4.4 异步相关方法
位置 | 单词 | 意义 | 例 |
---|---|---|---|
pre | blocking | 线程阻塞方法 | blockingGetUser |
suf | InBackground | 执行在后台线程 | doInBackground |
suf | Async | 异步方法 |