阿里编程规范

阿里编码规范

阿里编码规范

命名风格

  1. 代码命名不能以下划线或者美元符号开头或者结尾
  2. 代码命名不能以中文拼音或者中文拼音与英文混合方式
  3. 类名使用UpperCamCamelCase风格,但DO、PO、DTO、VO、BO等除外
  4. 方法名、参数名、变量名必须遵守驼峰命名
  5. 常量名全部大写,单词间用下划线隔开
  6. 抽象类必须以Abstract或者Base开头,异常类必须以Exception结尾,测试 类以测试的类的名称开头Test结尾
  7. 类型与中括号紧挨相连标示数组
  8. POJO类中布尔类型变量不要加is前缀
  9. 包名统一小写,点分隔符有且有一个自然语义单词
  10. 避免在父子类和不同代码块中采用相同变量名
  11. 避免不规范的缩写命名
  12. 在对元素命名时用完整单词组合表达其意
  13. 常量和变量命名时,表示类型放在词尾,如:idList、TERMINATED_TREAD_COUNT
  14. 接口、类、方法、模块使用设计模式,命名时要体现具体模式
  15. 接口类中的方法和属性不要加任何修饰符,并加上有效的javadoc。
  16. 接口和实现类的命名规则:
    1、对于service和dao类,实现类必须用Impl结尾;
    2、如果是形容能力的接口名称,取对应的形容词为接口名 AbstractTranslator实现 Translatable接口
  17. 枚举类名加Enum后缀,枚举成员名称全大写,单词间用下划线隔开
  18. 各层命名规范:
    A) Service/DAO层命名规约
    1.获取单个对象的方法用get做前缀
    2.获取多个对象的方法用list做前缀,如:listObjects
    3.获取统计值的方法用count做前缀
    4.插入方法用save/insert做前缀
    5.删除方法用delete/remove做前缀
    6.修改方法用update做前缀
    B)领域模型命名规范
    1.数据对象:xxxDO, xxx为数据库表名
    2.数据传输对象:xxxDTO,xxx为业务模型相关名称
    3.展示对象:xxxVO,xxx一般为网页名称
    4.POJO是对DO、DTO、VO、BO的统称,禁止xxxPOJO

代码格式

  1. 如果大括号代码为空直接’{}’,大括号内有代码则:左大括号左侧不换行,右侧换行;右大括号右侧换行,左侧如果不跟else等代码换行,否则不换行
  2. 小括号和字符之间不能有空格,括号内字符和运算符之间有空格 如:if (a == b)
  3. if、for、while、do、switch与括号之间必须有空格
  4. 任何二目、三目运算符前后必须有空格
  5. 采用4个空格,禁止使用tab
  6. 注释的双斜线和内容要有空格
  7. 强制类型转换时,右括号与强制转换值之间不用空格
  8. 单行字符不超过120个,超过要换行
  9. 方法在定义和传参时,必须要加空格
  10. IDE的text file encoding 设置为UTF-8;IDE中 文件的换行符使用Unix格式
  11. 单个方法尽量不超过80行
  12. 不同逻辑、不同语义、不同业务之间的代码插入一个空行分隔符

安全规约

【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。
说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容、修改他人的订单。
【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
说明:查看个人手机号码会显示成:158****9119,隐藏中间 4 位,防止隐私泄露。
【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 访问数据库。
【强制】用户请求传入的任何参数必须做有效性验证。说明:忽略参数校验可能导致:
 page size 过大导致内存溢出
 恶意 order by 导致数据库慢查询
 任意重定向
 SQL 注入
 反序列化注入
 正则输入源串拒绝服务 ReDoS
说明:Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题, 但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。
【强制】禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
【强制】表单、AJAX 提交必须执行 CSRF 安全过滤。
说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户一访问,后台便在用户不知情情况下对数据库中用户参数进行相应修改。
【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制, 如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
说明:如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。
【推荐】发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。

建表规约

  1. 表达是与否概念的字段,必须使用is_xxx的方式命名,数据类型是unsigned tinyint(1表示是,0表示否)
  2. 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑
  3. 表名不使用复数名词
  4. 禁用保留字,如desc、range、match、delayed等,请参考MySQL官方保留字
  5. 主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名
  6. 小数类型为decimal,禁止使用float和double
  7. 如果存储的字符串长度几乎相等,使用char定长字符串类型
  8. varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其它字段索引效率
  9. 表必备三字段:id, create_time, update_time
  10. 表的命名最好是遵循“业务名称_表的作用”
  11. 库名与应用名称尽量一致
  12. 字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循: 1) 不是频繁修改的字段。 2) 不是varchar超长字段,更不能是text字段。3) 不是唯一索引的字段。
  13. 如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释
  14. 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表
  15. 合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度

SQL语句

  1. 不要使用count(列名)或count(常量)来替代count(),count()是SQL92定义的标准统计行数的语法,跟数据库无关,跟NULL和非NULL无关
  2. count(distinct col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1, col2) 如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0
  3. 当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果为NULL,因此使用sum()时需注意NPE问题
  4. 使用ISNULL()来判断是否为NULL值
  5. 代码中写分页查询逻辑时,若count为0应直接返回,避免执行后面的分页语句
  6. 不得使用外键与级联,一切外键概念必须在应用层解决
  7. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
  8. 数据订正(特别是删除、修改记录操作)时,要先select,避免出现误删除,确认无误才能执行更新语句
  9. in操作能避免则避免,若实在避免不了,需要仔细评估in后边的集合元素数量,控制在1000个之内
  10. 如果有国际化需要,所有的字符存储与表示,均以utf-8编码,注意字符统计函数的区别
  11. TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但TRUNCATE无事务且不触发trigger,有可能造成事故,故不建议在开发代码中使用此语句
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值