阿里巴巴开发规约之编程规约(1)
前言
碎碎念
遥记得当年刚参加实习的时候,被带我的师傅喷:“你这命名是个啥”、“代码为啥不格式化一下”、“你的异常捕获了么”等等。我总结出来一个字就是 你的代码真垃圾。
之后,我便看到了阿里巴巴开源的开发准则。在这里结合自己的工作经验和未来的技术大牛们一起分享一下。
规约简介
来历
阿里巴巴开发规约是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,公开到业界后,众多社区开发者踊跃参与,共同打磨完善,系统化地整理成册。
目录
规约主要分为七大块:编程规约、异常日志、单元测试、安全规约、MySql数据库、工程结构、设计规约。
下载
阿里巴巴技术团队将其开源在了github上,并且还开发了IDEA插件供各位码友使用。规约项目地址:https://github.com/alibaba/p3c
正文
计划
由于目前我也在学习和实践中,所以我打算不定期分批更新,和大家一起学习实践,同时会按照自己的理解解释下为什么规约中这么规定。先从第一部分开始–编程规约。所以喜欢的小伙伴也点个关注,让我们一起在这个寂寞的代码之路上一起前行。
编程规约
一、命名风格
命名应遵循:1、见名知意。 2、风格统一。开发中最重要的就是统一的标准,一定要和自己团队中的代码风格一致。例如和人交流的时大家都不喜欢中英文混杂的表达的形式(eat了么,我要think一下),让人理解起来不顺畅,代码也是也一样,风格统一才会减少维护代码的成本。
【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:_name /_name / $name / name_ / name$
说明:1、下划线一般是起连接作用的,放在开头和结尾会让人误解该命名没有结束。2、使用代码能编译通过,但是在spring项目中,代码能编译通过,但是在spring项目中,代码能编译通过,但是在spring项目中,符表示占位符。【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。
正例:ali / alibaba / taobao / cainiao/ aliyun/ youku / hangzhou 等国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / String fw[福娃] / int 某变量 = 3【强制】代码和注释中都要避免使用任何语言的种族歧视性词语。
正例:日本人 / 印度人 / blockList / allowList / secondary
反例:RIBENGUIZI / Asan / blackList / whiteList / slave【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion
说明:camelCase称之为驼峰命名法。百度百科的解释是”骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程式编写时的一套命名规则(惯例)“。一般是两个单词拼接在一起后一个单词首字母使用大写。UpperCamelCase(大驼峰命名法),一般用于类名、属性名等。对应的也有lowerCamelCase(小驼峰命名法),一般用于变量名。【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
正例: localValue / getHttpMessage() / inputUserId
说明:加上4。【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME 反例:MAX_COUNT / EXPIRED_TIME
说明:在项目开发中常量名一般如下声明
private static final MAX_COUNT = 1000;
使用static和final关键字进行修饰。【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾。
说明:见名知意。例如:测试类,如果不以Test结尾,团队其他人员可能会觉得这个类里面的方法可以使用,恰巧你的测试类里又有bug,造成了不必要的线上问题。【强制】类型与中括号紧挨相连来表示数组。
正例:定义整形数组 int[] arrayDemo。
反例:在 main 参数中,使用 String args[]来定义。
说明:虽然args[]也能编译通过和运行,但是开发惯性习惯看变量名前的类型,容易当做String类型。总的来说还是统一风格,减少出错的概率。【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列 化错误。
说明:在本文 MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要 在设置从 is_xxx 到 xxx 的映射关系。 反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。
举例
public class RuleDTO {Boolean isDelet;Boolean delet;String isName;//可以看出我声明了两个Boolean变量,但是只生成get方法只生成了一个,并省去了is。//而下方的String类型的is则仍在。public Boolean getDelet() {return isDelet;}public String getIsName() {return isName;}
}
10.【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例:应用工具类包名为 com.alibaba.ei.kunlun.aap.util、类名为 MessageUtils(此规则参考 spring 的 框架结构)
说明:alibaba 和kunlun是一个自然语义英语单词。限定名字的英文可以使用汉语拼音。例如:Beijing。
11.【强制】避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名, 使可理解性降低。
说明:子类、父类成员变量名相同,即使是 public 类型的变量也能够通过编译,另外,局部变量在同一方 法内的不同代码块中同名也是合法的,这些情况都要避免。对于非 setter/getter 的参数名称也要避免与成 员变量名称相同。
反例:
```
public class ConfusingName {public int stock;// 非 setter/getter 的参数名称,不允许与本类成员变量同名public void get(String alibaba) {if (condition) {final int money = 666;// ...}for (int i = 0; i < 10; i++) {// 在同一方法体中,不允许与其它代码块中的 money 命名相同final int money = 15978;// ...}}
}
class Son extends ConfusingName {// 不允许与父类的成员变量名称相同public int stock;
}
```
举例:
子类继承父类目的就是使用父类已经存在的方法。若子类的变量名和父类的相同,虽然能运行成功。但是重名的变量名只会在子类中生效。导致含义不清楚,也没有达到继承的目的。
```
public class RuleDTO {String name;String age;public static void main(String[] args) {RuleDTO ruleDTO = new RuleDTO();ruleDTO.setName("东海龙王");ruleDTO.setAge("2800");SonRuleDTO sonRuleDTO = new SonRuleDTO();sonRuleDTO.setName("敖丙");sonRuleDTO.setAge("18岁");System.out.println(sonRuleDTO.getName() + sonRuleDTO.getAge());}
}
class SonRuleDTO extends RuleDTO{String name;
}
```
12.【强制】杜绝完全不规范的缩写,避免望文不知义。
反例:AbstractClass“缩写”成 AbsClass;condition“缩写”成 condi;Function 缩写”成 Fu,此类 随意缩写严重降低了代码的可阅读性。
说明:这块没啥好解释的,就行你写个错别字了能怪阅卷老师给你打个大红叉么。
总结
带我的师傅最常说的一句话就是,代码开发中最忌讳发明创造,个性化。这倒不是打击人性,主要是为了减少沟通和理解成本。在团队合作中,建立一套标准是很有必要的,类似于手机充电机器都用上了TypeC的口子,这样无论什么品牌的手机都能兼容同一根充电线,减少没必要的内卷。
好啦,今天就到这里了。后续抽时间继续更新。新人求个关注,共同进步。
阿里巴巴开发规约之编程规约(1)相关推荐
- 阿里巴巴开发规约之编程规约(2)
前言 碎碎念 最近快过年了,无心工作,只想回家过年.听着外面的鸟叫,明明是冬天却感觉像是春天才会出现的鸟儿.看来是小鸟说回家过年,回家过年了.哈哈哈,废话不多说,咱么继续书接上回. 正文 上回分享了规 ...
- 阿里巴巴 Java 开发手册之编程规约(一)-------我的经验
阿里巴巴 Java 开发手册 一.编程规约 (一) 命名规约 1.[强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束.(代码规范,易读) 反例: _name / __na ...
- 白话阿里巴巴Java开发手册(编程规约)
本文欢迎转载,转载请注明原文链接,并附作者个人信息李艳鹏. 研发流程管理 最近,阿里巴巴发布了<阿里巴巴Java开发手册>,总结了阿里人多年一线实战中积累的研发流程规范,这些流程规范在一定 ...
- 阿里巴巴对Java编程【注释规约】的规约
转载自 阿里巴巴对Java编程[注释规约]的规约 注释规约 1. [强制]类.类属性.类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用// xxx 方式. 说明:在 ID ...
- 阿里巴巴对Java编程【控制语句】的规约
转载自 阿里巴巴对Java编程[控制语句]的规约 控制语句 1. [强制]在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一 ...
- 阿里巴巴对Java编程【并发处理】的规约
转载自 阿里巴巴对Java编程[并发处理]的规约 并发处理 1. [强制]获取单例对象需要保证线程安全,其中的方法也要保证线程安全. 说明:资源驱动类.工具类.单例工厂类都需要注意. 2. [强制]创 ...
- 阿里巴巴对Java编程【集合处理】的规约
转载自 阿里巴巴对Java编程[集合处理]的规约 集合处理 1. [强制]关于 hashCode 和 equals 的处理,遵循如下规则: 1) 只要重写 equals ,就必须重写 hashCode ...
- 阿里巴巴对Java编程【OOP规约】的规约
转载自 阿里巴巴对Java编程[OOP规约]的规约 OOP规约 1. [强制]避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可. 2. [强制]所有的 ...
- 阿里巴巴对Java编程【常量定义】的规约
转载自 阿里巴巴对Java编程[常量定义]的规约 常量定义 1. [强制]不允许任何魔法值 ( 即未经定义的常量 ) 直接出现在代码中. 反例: String key = " Id # t ...
- 阿里巴巴对Java编程【代码格式】的规约
转载自 阿里巴巴对Java编程[代码格式]的规约 代码格式 1. [强制]大括号的使用约定.如果是大括号内为空,则简洁地写成{}即可,不需要换行 : 如果是非空代码块则: 1 ) 左大括号前不换行. ...
最新文章
- 前端新手学习记录1 -使用vscode编辑html
- python正则表达式指南_Python正则表达式指南
- 爬取许嵩新歌《雨幕》弹幕,告诉你什么才是真正的创作!
- 别再传李笑来的录音了!这才是有关区块链最靠谱最简单易懂的科普
- bzoj千题计划290:bzoj3143: [Hnoi2013]游走
- Kubernetes详解(十六)——Pod容器探测
- php语言 电商网站,如何做多国家,多语言电商网站的设计
- 五分钟就能上手的Android APP开发入门教程!!!
- 查看Android应用签名信息
- 用火箭送快递?淘宝宣布联合蓝箭航天起启动“宝箭”计划
- 信息系统项目管理师 - 必考记忆口诀
- 数据结构实训——统计成绩
- Riverbed宣布收购SD-WAN供应商Ocedo
- nagios 总结_caci 与 nagios 一些总结 【一】
- 技术分享 | 大量 Opening tables 案例分析
- php获取微博热搜,爬取微博热搜top50(示例代码)
- HTML+CSS 简易搜索框
- 谁将成为中国版底特律?
- 北洋UAM-05LX(网口系列适用)ROS节点
- 黑龙江科学杂志黑龙江科学杂志社黑龙江科学编辑部2022年第24期目录
热门文章
- 《经营的本质》序“经营的逻辑”--读后感及读书笔记
- ZBrush中的法线贴图你知道吗?
- 远程主机强迫关闭了一个现有的连接
- 股票学习-量柱和k线-第一天
- 《我爱我的祖国》受捧 再现专线另类舌尖上中国
- LTM系统并联接入方式数据包交互分析
- 登录案例的演示 涉及request的转发
- Unity鼠标光标使用学习
- 学计算机的是不是都非常木讷,北大学神韦东奕​是正常人吗?内向木讷是缺点​,拿不出手?​...
- 面试时被问有没有别家offer,回答没有,面试总是挂!回答有,就说我是面试选手,欺骗公司!...