阿里巴巴java开发手册详解-编程规约(一)-命名风格

最近在学习阿里巴巴的java开发手册,我想,这个手册中每一条规定与建议都是存在其道理的 ,一个好的规范可以使得编程的可读性变好,使我们的工作更加简洁高效,一起来学习吧

首先纵观整个开发手册,目录如下:

一、编程规约

(一) 命名风格
(二) 常量定义
(三) 代码格式
(四) OOP 规约
(五) 集合处理
(六) 并发处理
(七) 控制语句
(八) 注释规约
九) 其它

二、异常日志

(一) 异常处理
(二) 日志规约

三、单元测试

四、安全规约

五、MySQL 数据库

(一) 建表规约
(二) 索引规约
(三) SQL 语句
(四) ORM 映射

六、工程结构

(一) 应用分层
(二) 二方库依赖
(三) 服务器

附 1:版本历史
附 2:本手册专有名词

今天先来讲编程规约(一) 命名风格
1、【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:_name / _name / $ Object / name / name$ / Object$
原因:阿里自研的fastjson对_和$开头的变量序列化bug太多

2、【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式 也要避免采用。
正例:alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3

3、【强制】类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

4、 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。
正例: localValue / getHttpMessage() / inputUserId

5、 【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT
反例:MAX_COUNT

6、【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾。

7、【强制】中括号是数组类型的一部分,数组定义如下:String[] args;
反例:使用 String args[]的方式来定义。

8、【强制】POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型 Boolean isDeleted的属性,它的方法也是 isDeleted(),RPC框架在反向解析的时候,以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

9、【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例: 应用工具类包名为 com.alibaba.open.util、类名为 MessageUtils(此规则参考 spring 的框架结构)

10、【强制】杜绝完全不规范的缩写,避免望文不知义。
反例:AbstractClass“缩写”命名成 AbsClass;condition“缩写”命名成 condi,此类随意缩写严重降低了代码的可阅读性。

11、【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。
正例:从远程仓库拉取代码的类命名为 PullCodeFromRemoteRepository。
反例:变量 int a 的随意命名方式。

12、【推荐】如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
正例:public class OrderFactory; public class LoginProxy; public class ResourceObserver;

13、【推荐】接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
正例:接口方法签名:void f(); 接口基础常量表示:String COMPANY = “alibaba”;
反例:接口方法定义:public abstract void f();
说明:JDK8 中接口允许有默认实现,那么这个 default 方法,是对所有实现类都有价值的默认实现。

14、接口和实现类的命名有两套规则:
1)【强制】对于 Service 和 DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用 Impl 的后缀与接口区别。
正例:CacheServiceImpl 实现 CacheService 接口。
2)【推荐】 如果是形容能力的接口名称,取对应的形容词做接口名(通常是–able 的形式)
正例:AbstractTranslator 实现 Translatable

15、【参考】枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。
正例:枚举名字为 ProcessStatusEnum 的成员名称:SUCCESS / UNKOWN_REASON。

16、【参考】各层命名规约:
A) Service/DAO 层方法命名规约
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
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。

下一篇:阿里巴巴java开发手册详解-编程规约(二)-常量定义

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里代码规范题目+答案50道题,不乱码不套路,便宜实惠。 多选 1.如何处理单元测试产生的数据,下列哪些说法是正确的?ABC A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码进行判断和识别。 多选 2.关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。 C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。 D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式) 多选 3.下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序清理出去,避免造成过多垃圾。 B .永久弃用的代码段注释掉即可,即不用加任何注释。 C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三 个斜杠(///)来说明注释掉代码的理由。 D .不要在视图模板加入任何复杂的逻辑。 多选 4.关于分页查询,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .分页查询,当统计的count为0时,应该直接返回,不要再执行分页查询语句。 B .iBATIS自带的queryForList(String statementName,int start,int size)分页接口有性能隐患,不允许使用。 C .定义明确的sql查询语句,通过传入参数start和size来实现分页逻辑。 D .可使用存储过程写分页逻辑,提高效率。 多选 5.根据《阿里巴巴Java开发手册》,以下功能必须进行水平权限控制校验的有:ABCD A .订单详情页面。 B .类目管理后台。 C .店铺装修后台。 D .订单付款页面。 多选 6.关于数据库NULL的描述,下列哪些说法符合《阿里巴巴Java开发手册》:BD A .NULL=NULL的返回结果为true。 B .NULL与任何值的比较结果都为NULL。 C .NULL<>1的返回结果为true。 D .当某一列的值全是NULL时,sum(col)的返回结果为NULL。 多选 7.关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .向公司外部提供的http/api接口,推荐使用“错误码”方式返回异常或者错误信息。 B .对于应用内部的方法调用,推荐使用“抛出异常”的方式处理异常或者错误信息。 C .跨应用的RPC调用,推荐使用将“错误码”和“错误简短信息”封装成Result的方式进行返回。 D .对外提供的接口,一定要保证逻辑健壮性:尽量避免空指针等技术类异常;对于业务类异常要做好错误码或者异常信息的封装。 单选 8.关于类的序列化,下列说法哪些是正确的:D A .类的序列化与serialVersionUID毫无关系。 B .如果完全不兼容升级,不需要修改serialVersionUID值。 C .POJO类的serialVersionUID不一致会编译出错。 D .POJO类的serialVersionUID不一致会抛出序列化运行时异常。 多选 9.关于Java的接口描述,下列哪些说法符合《阿里巴巴Java开发手册》:BCD A .在接口类方法和属性使用public修饰符。 B .对于Service类,内部的实现类加Impl的后缀与接口区别。例如:ProductServiceImpl实现ProductService接口。 C .对于Service类,基于SOA的理念,是以接口方式暴露服务。 D .尽量不在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,而且是整个应用的基础常量。 单选 10.集合在遍历过程,有时需要对符合一定条件的元素进行删除,下列哪些说法是正确的:B A .在 foreach 循环里进行元素的 remove操作。 B .使用Iterator方式,如果有并发,需要对Iterator对象加锁。 C .Iterator进行元素的删除操作,绝对是线程安全的。 D .Java无法实现在遍历时,进行删除元素操作。 多选 11.关于基本数据类型与包装数据类型的使用标准,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .所有的POJO类属性必须使用包装数据类型。 B .RPC方法的返回值和参数必须使用包装数据类型。 C .因为JAVA的自动装箱与拆箱机制,不需要根据场景来区分数据类型。 D .所有的局部变量推荐使用基本数据类型。 多选 12.关于索引的设计,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对varchar类型的字段建立索引,必须指定索引长度。 B .对varchar类型的字段建立索引,不需要指定索引长度,这样索引区分度最好。 C .业务上具有唯一特性的字段(含组合字段),必须指定唯一索引。 D .建复合索引时,一般选择区分度高的字段放在最左列。 多选 13.关于二方库版本号的命名方式,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .版本号命名格式:主版本号.次版本号.修订号。 B .主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级。 C .次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改。 D .修订号:保持完全兼容性,修复BUG、新增次要功能特性等。 多选 14.关于索引的使用,下列哪些说法是正确的:BCD A .查询语句 WHERE a+1 = 5 可以利用a索引。 B .查询语句WHERE date_format(gmt_create, '%Y-%m-%d') = '2016-11-11'无法利用gmt_create索引。 C .当 c 列类型为 char 时,查询语句 WHERE c = 5 无法利用c索引。 D .索引字段使用时不能进行函数运算。 多选 15.关于生产环境的日志文件,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .异常信息应该包括两类信息:案发现场信息和异常堆栈信息。 B .日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特点。 C .避免重复打印日志,浪费磁盘空间,务必在log4j.xml设置additivity=false。 D .错误日志和业务日志尽量分开存放。 多选 16.关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .特殊注释标记,请注明标记人与标记时间。 B .待办事宜(TODO):( [标记人,标记时间,[预计处理时间]) C .在注释用FIXME标记某代码虽然实现了功能,但是实现的方法有待商榷,希望将来能改进 D .在注释用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况 多选 17.关于MySQL性能优化的描述,下列哪些说法是正确的:ABCD A .主键查询优先于二级索引查询。 B .表连接有一定的代价,故表连接数量越少越好。 C .一般情况下,二级索引扫描优先于全表扫描。 D .可以使用通过索引避免排序代价。 多选 18.关于索引的设计和使用,下列哪些说法是正确的:AD A .若查询条件不包含索引的最左列,则无法使用索引。 B .对于范围查询,只能利用索引的最左列。 C .对于order by A或group by A语句,在A上建立索引,可以避免排序。 D .对于多列排序,需要所有所有列排序方向一致,才能利用索引。 多选 19.关于类命名,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .抽象类命名使用Abstract或Base开头。 B .异常类命名使用Exception结尾。 C .测试类命名以它要测试的类的名称开始,以Test结尾。 D .如果使用到了设计模式,建议在类名体现出具体模式。例如代理模式的类命名:LoginProxy;观察者模式命名:ResourceObserver。 多选 20.关于数据库模糊检索的描述,下列哪些说法符合《阿里巴巴Java开发手册》:ABD A .绝对禁止左模糊。 B .绝对禁止全模糊。 C .绝对禁止右模糊。 D .全模糊或左模糊查询需求,优先使用搜索引擎。 多选 21.关于代码注释,下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .所有的抽象方法(包括接口方法)必须要用javadoc注释。 B .所有的方法,包括私有方法,最好都增加注释,有总比没有强。 C .过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。 D .我的命名和代码结构非常好,可以减少注释的内容。 多选 22.关于checked/unchecked exception,下列哪些说法是正确的:BCD A .继承java.lang.Error的类属于checked exception。 B .checked异常继承java.lang.Exception类。 C .unchecked异常继承java.lang.RuntimeException类。 D .NullPointerException , IllegalArgumentException属于unchecked exception。 单选 23.关于Map类型集合的遍历方式,下列哪些说法是正确的:D A .Map类型的实现类都同时实现了Iterator接口。 B .使用foreach进行遍历。 C .推荐使用keySet进行遍历。 D .推荐使用entrySet进行遍历。 多选 24.关于变量、方法名、包的命名,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .POJO类的任何布尔类型的变量,都不要加is,因为部分框架解析时有可能会出现序列化错误。 B .包名统一使用单数形式,如:com.alibaba.mpp.util。 C .括号是数组类型的一部分,数组定义如下:String[] args; 不要误写为String args[]; D .Service/DAO层方法命名可以参考规约,例如:删除的方法推荐使用remove或delete做前缀。 多选 25.关于常量定义,下列哪些说法符合《阿里巴巴Java开发手册》:AC A .不允许出现任何魔法值(即未经预先定义的常量)直接出现在代码。 B .魔法值是指程序随意定义并赋值的变量值,如果代码编写者明白变量值意义是可以任意使用的,例如在代码写if(status == 3) return error;符合规范。 C .如果变量值仅在一个范围内变化推荐用Enum类。 D .在程序,一律禁止使用枚举类型。 多选 26.关于maven依赖、仲裁、规则,下列哪些说法是正确的:ACD A .<dependencies>的依赖会默认传递给子项目。 B .<dependencies>的依赖绝对不会传递给子项目。 C .在<dependencyManagement>指定版本号。 D .避免在不同的子项目,声明同一个二方库的不同版本号。 单选 27.关于二方库升级,下列哪些说法是正确的:B A .升级二

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值