最近写代码被人吐槽,风格命名以及文件位置都有不少问题,被人安利看一下代码规范。推荐的书就是这个《阿里巴巴Java开发手册》,类似于人家的内部总结,好像纸质版叫什么码出高效。说到看书想起来,第一份做偏维护的工作,那时候组长要求看一下《鸟哥的私房菜》大致看了电子版两遍,纸质版也大致看一遍,当然看的质量也就那样,但是还是很受益,计算机原理,网络,linux操作这些都有涉及,自己上学的知识也唤醒了一点。可能算是我那几年,少有的有收益的东西吧。
文章来源,大家可能网上资料一大堆,然后一到下载发现什么乱七八糟的网盘,CSDN直接就是要收积分,也是没谁了。我推荐的是guthub上的,好处是什么:一不是二手的,有很多鱼龙混杂东西冲进来博关注,这个最起码是人家官方的原版。二是更新,最新的也能看到,我看到一些老哥很热心把资料放出来但是几年过去了,人家已经更新的1.5版本了。
地址
[github上Java开发手册](https://github.com/alibaba/p3c)
你可能发现这个名字不是什么开发手册,其实这个p3c类似他们搞得一个插件什么的,就是保证你代码风格。这个文档在里面的第一级目录可放心食用。
开始读书学习了:
前言
大致扫了一下就是告诉你这本书就是以Java开发者为中心视角,编程规约,异常日志,单元测试,安全规约,MySQL数据库,工程结构,设计规约(其实发现这就是下面几章的标题,但还是挺全的。)
顺便安利一下他们的云效和阿里云插件。
他这里的“强制”,不是说必须要这么做,而是不这么做有风险或者风格不同意,可读性差,所以要求“强制”
编程规约
一 命名风格
强制
(1)代码中命名均不能以<font color="0000FF">下划线或者美元符号</font>来开始,也不能以下划线和美元符号结束。
反例:_ZpHandsome,\$ZpHandSome,ZpHandSome_,ZpHandsome$\
这些一下划线和美元符号\$为开头和结尾的都不行,原因可能是一是标准库里面经常会有用到下划线开头的,如果你注意看console的话,有时候经常会遇到什么\$XXX,_XXX的东西然而和你的代码无关都是加载的库的代码,所以为了不能搞混,就不要下划线和美元符号\$命名。
强制
(2)代码中命名禁止使用拼音与英文混合的方式,更不许用中文的方式命名
<font color="008000">正例</font>:alibaba,huawei,taobao,youku这些都是国际通用的名称视为英文
反例:getPingfenByName(评分)
看得出来就是让你尽可能用英文,确实你中英掺杂会有很多问题,我自己遇到一个命名图灵,拼音Tuling英文Turing看起来差不多实际差很多,你怎么知道他是拼音呢,拼音翻译过来可能对应好几个词,你确定是那个吗?除了一些品牌地名名人这些国际上也这么叫的都统一英文命名。你看马云都是Jacky Ma,都用英文来命名没毛病。
强制
(3)类名使用UpperCamelCase风格,但以下情形例外DO/BO/DTO/VO/AO/PO/UID等
<font color="008000">正例</font>
UserDO,XmlService,TupUdpDeal
<font color="FF0000">反例</font>
XMLService,TCPUDPDeal,javaScriptPlatform
首先这个是**类名**,要求用驼峰来命名,就是一些专有大写的名词也要按照*首字母大写驼峰*除非DO,VO这些。我是没想到这个,我就会很容易写出XMLService,CSVHandler这种命名,这规范要求类的命名必须驼峰不管你什么专有名词。
强制
(4)方法名,参数名,成员变量名,参数变量名统一使用lowerCamelCase
正例
getParams,localValue
和上面的类名不同采用首字母小写的驼峰命名
强制
(5)常量名全部大写,单词间下划线分隔,力求语义表达清晰,不要嫌弃名字长。
正例
MAX_STOCK_COUNT,CACHE_EXPIRE_TIME
反例
MAX_COUNT,EXPIRE_TIME
这里他举得例子还挺有意思的,常量大写大家都知道,下划线也大概都会用,但是例子突出的是一个“语义清晰”,什么最大值,是“存货最大值”(马上就联想到库存),“超时时间”,什么超时时间是“缓存超时时间”
强制
(6)抽象类命名使用Abstract或Base开头,异常类命名使用Exception结尾,测试类命名以他的类名做开头,Test做结尾
正例
UserOrderServiceTest
这里抽象类用Abstract或者Base命名,该有Exception都没说的,我主要是单元测试的测试类经常瞎写一通,这个规范还是有参照意义的。这里提到的不要怕名字长,我记得一本书上也是这么说的,要做到见词知意。
强制
(7)类型与中括号紧挨相连表示数组
正例
定义整形数组 int[] arrayDemo
反例
main参数里,使用String args[] 来定义
这个就是限制数组定义不要出现 int [] numArrs 这样不紧挨着类型中括号的代码了,看起来顺眼点。
强制
(8)POJO类中布尔类型变量都不要加is前缀否则部分框架会引发框架解析引起序列化错误
说明
在本文MySQL规约的建表约定第一条,表达式与否的命名方式采用的是is_XXX,所以在ResultMap中设置is_XXX与XXX的关系
反例
定义基本数据类型为Boolean的 “isDeleted”一个属性,他的方法也是isDeleted RPC框架反向解析的时候会以为这个属性是“Deleted”
难得解释了一下,说明is前缀命名布尔类型属性名有坑的
强制
(9)报名统一用小写,点分隔符之间有且只有一个自然语义的英语单词,包名统一用**单数**形式,类名有复数含义可以用复数来命名
正例>
com.alibaba.ai.util 里面的类名MessageUtils
这个解决了我的一个疑问就是包名怎么命名,我之前会这样“userOrder”看起来像是一个变量名,其实可以分开全部小写user.order来区分。
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)