这几天学习java写了一些东西,代码有问题,就拿去问老师,把代码发给老师后,老师批评说我写的代码不规范,即使代码可以实现相应的功能,但是企业依旧不会使用你的代码,你拥有的仅仅是编程基础,老师不止一次告诉我,让我去学习编程规范,我觉得也是时候学习一波了,不知道各位读者有没有这种体验啊,比如一个QQ群,有萌新问你这个代码有什么问题,很多人想去帮忙,却不知道写的什么,才会一点一点问,这个方法是干什么的,那个变量是干啥,确实作为萌新的我们都将我们自己定义为中心,我们没有为别人考虑,当我们自己写代码的时候,我们当时是知道这个变量是干什么的,哪怕是一个a,一个b,因为那是你写的,你不可能那么快忘记,但是换另一个人来读你的代码,就需要从头重新刷你的代码,曾几何时,我的变量也是a,b,c,最狼狈的时候是我尽然找不到26个字母中可以用来命名的字母了,因为我太随意了,想到什么就写什么,a简单就写a,但是,当我第二年再次打开我写的这些,我当初自认为很好的代码来说,我也不知道我写的是什么,我只能从定义它的地方一步一步回忆。 写代码的过程就好像我们写作文,虽然我语文课从来不好好听哈,但是对于写作文呢,语文老师说过一句话:要先写自己,再写集体,然后顺势扩展到国家,社会等等,反正呢,就是一步一步往大阔。我相信各位读者的语文老师也说过这句话,写的代码我认为可以比作是个人,集体,国家几个阶段,刚开始初级阶段,我们写的代码可以乱,可以随意,只要能实现我们所需要的功能即可,这便是作文中的个人,中级阶段,我们写的代码需要同别人交流,总不能我说汉语,你说英语,你与大多数人不同,那你一定是不受待见的那一个,这便是作文中的集体,再往后就不举例子了,当你通过百度读到这篇文章的时候,我觉得你应该和正在写这篇文章的我一样,已经意识到了集体的意义,而不再是一个人的单打独斗,你可以自己学习代码,但你终究是要出去找工作的。离开了集体,我们什么都不是!想说的话就到这里,下面进入正题吧。
反例:_name / __name / name/name/name / name__
说明:
正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。
正例:alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3
正例:
MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
正例:
localValue / getHttpMessage() / inputUserId
正例:
MAX_STOCK_COUNT
反例:MAX_COUNT
正例:
定义整形数组 int[] arrayDemo;
反例:在 main 参数中,使用 String args[]来定义。
反例:
定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),RPC框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
正例:
应用工具类包名为 com.alibaba.ai.util、类名为 MessageUtils(此规则参考 spring 的框架结构)
反例:
AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随 意缩写严重降低了代码的可阅读性。
正例:
在 JDK 中,表达原子更新的类名为:AtomicReferenceFieldUpdater。
反例:变量 int a 的随意命名方式。
说明:
将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
正例:public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
正例:
接口方法签名 void commit(); 接口基础常量 String COMPANY = "alibaba";
反例:接口方法定义 public abstract void f();
说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。
1)【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用 Impl 的后缀与接口区别。
正例:
CacheServiceImpl 实现 CacheService 接口。
2)【推荐】 如果是形容能力的接口名称,取对应的形容词为接口名(通常是–able 的形式)。
正例:
AbstractTranslator 实现 Translatable 接口。
说明:
枚举其实就是特殊的类,域成员均为常量,且构造方法被默认强制是私有。
正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKNOWN_REASON。
A) Service/DAO 层方法命名规约
1)
获取单个对象的方法用 get 做前缀。
2)获取多个对象的方法用 list 做前缀,复数形式结尾如:listObjects。
3)获取统计值的方法用 count 做前缀。
4)插入的方法用 save/insert 做前缀。
5)删除的方法用 remove/delete 做前缀。
6)修改的方法用 update 做前缀。
B) 领域模型命名规约
1) 数据对象:
xxxDO,xxx 即为数据表名。
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称。
3) 展示对象:xxxVO,xxx 一般为网页名称。
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
<font color=#cc0000 size=4 face="STCAIYUN">【强制】</font>
<font color=#009933 size=4 face="STCAIYUN">【推荐】</font>
<font color=#6699ff size=4 face="STCAIYUN">【参考】</font>
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有