开发规范手册

开发规范手册


一、命名规范:

1.类名使用 UpperCamelCase 风格,必须遵从驼峰形式。

正确:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 

错误:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

2.方法名、参数名、成员变量、局部变量,统一使用 lowerCamelCase 风格,必须遵从驼峰形式。
正确: localValue / getHttpMessage() / inputUserId 

 

3.常量命名全部大写,单词间用下划线隔开,语义表达完整清楚,不要嫌名字长。

正确:MAX_STOCK_COUNT
错误:MAX_COUNT

4.文件名统一使用单数形式,如果类名如果有复数含义,类名可以使用复数形式。

正确: 应用工具文件名为MessageUtil、类名为MessageUtils。一个文件只包含一个类。


5. 杜绝完全不规范的缩写,避免望文不知义。

错误:AbstractClass“缩写命名成 AbsClass; condition“缩写命名成 condi,此类随意缩写严重降低了代码的可阅读性。 


6. 为了达到代码自解释的目标,自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。

正确:从远程仓库拉取代码的类命名为 PullCodeFromRemoteRepository

错误:变量 int a; 的随意命名方式。 


7. 如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。 将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。 

正确:public class OrderFactory; 

public class LoginProxy; public class ResourceObserver; 


8.接口和实现类的命名规则:

对于 Service DAO 类,基于 SOA 的理念,暴露出来的服务一定是接口,内部的实现类用 Impl 的后缀与接口区别。 


  1. 获取单个对象的方法用get做前缀。
  2. 获取多个对象的方法用list做前缀。 
  3. 获取统计值的方法用count做前缀。
  4. 插入的方法用save/insert做前缀。
  5. 删除的方法用remove/delete做前缀。 
  6. 修改的方法用update做前缀。
  7. …… 



二、 代码格式 

使用ESLint ESLint是一个语法规则和代码风格的检查工具,可以用来保证写出语法正确、风格统一的代码。

三、注释规范

类、类属性、类方法的注释必须使用/**内容*/格式,不得使用 // xxx方式。

如果是接口的方法,必须注明入参、正确返回、异常返回、以及报错的情况。

参考使用APIdoc生成接口文档。http://www.bjhee.com/apidoc.html

 

四、日志规约


1. 日志文件推荐至少保存 15 天,因为有些异常具备以为频次发生的特点。 


2.对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过日志对系统进行及时监控。 


3.可以使用 warn 日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从。注意日志输出的级别,error 级别只记录系统逻辑出错、异常等重要的错误信息。如非必要,不要在其它场景打出error 级别。


3.谨慎地记录日志。生产环境禁止输出 debug 日志;有选择地输出 info 日志;

如果使用 warn 来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志。 说明:大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处


一些关键点必须输出日志,比如:重要参数、代码分支处、抛错、重要的代码块、调用第三方服务。


五、单元测试规范


1.对于单元测试,要保证测试粒度足够小,有助于精确定位问题。单元测试粒度至多是类级别,一般是方法级别。 说明:只有测试粒度小才能在出错时尽快定位到出错位置。单元测试不负责检查跨类或者跨系统的交互逻辑,那是集成测试的领域。 


2.单元测试的基本目标:语句覆盖率达到 70%;核心模块的语句覆盖率和分支覆盖率都 要达到 100% 。(推荐使用 nyc 测试代码覆盖率)

说明:在应用分层中提到的 DAO 层,Manager 层,可重用度高的 Service,都应该进行单元测试。 


3.编写单元测试代码遵守 BCDE 原则,以保证被测试模块的交付质量。 

  • B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
  • C:Correct,正确的输入,并得到预期的结果。
  • D:Design,与设计文档相结合,来编写单元测试。 
  • E:Error,强制错误信息输入(:非法数据、异常流程、非业务允许输入等),并得 到预期的结果。 


4.对于数据库相关的查询,更新,删除等操作,不能假设数据库里的数据是存在的, 或者直接操作数据库把数据插入进去,请使用程序插入或者导入数据的方式来准备数据。 和数据库相关的单元测试,可以设定自动回滚机制,不给数据库造成脏数据。


错误:删除某一行数据的单元测试,在数据库中,先直接手动增加一行作为删除目标,但是这 一行新增数据并不符合业务插入规则,导致测试结果异常。 


建议:单独开一个测试环境数据库,用来跑测试。


5. 在设计评审阶段,开发人员需要和测试人员一起确定单元测试范围,单元测试最好 覆盖所有测试用例(UC) 


6. 单元测试作为一种质量保障手段,不建议项目发布后补充单元测试用例,建议在项 目提测前完成单元测试。 



7.不要对单元测试存在如下误解

  1. 那是测试同学干的事情。
  2. 单元测试代码是多余的。汽车的整体功能与各单元部件的测试正常与否是强相关的。 
  3. 单元测试代码不需要维护。一年半载后,那么单元测试几乎处于废弃状态。
  4. 单元测试与线上故障没有辩证关系。好的单元测试能够最大限度地规避线上故障。 


六、数据库设计相关


1.表名不使用复数名词。 说明:表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于 DO 类名也是单数形式,符合表达习惯。

2.表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。

3.表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint ( 1表示是,0表示否)。说明:任何字段如果为非负数,必须是 unsigned。正确:表达逻辑删除的字段名 is_deleted1 表示删除,0 表示未删除。

4.主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
说明:pk_ primary key;uk_ unique key;idx_ index 的简称。

5.表的命名最好是加上业务名称_表的作用 正确:alipay_task / force_project / trade_config 


6.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,不要在创建表时就分库分表。 


7.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。 说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生(这个看不懂) 


8.超过三个表禁止 join。需要 join 的字段,数据类型必须绝对一致;多表关联查询时, 保证被关联的字段需要有索引。说明:即使双表 join 也要注意表索引、SQL 性能。

9.SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。 


说明:
consts
单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。 

ref 指的是使用普通的索引(normal index)

range 对索引进行范围检索。 


错误:explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个 index 级别比较 range 还低,与全表扫描是小巫见大巫。 


[MySQL]--
查询性能分析工具-explain关键字

https://blog.csdn.net/u010853261/article/details/58585468


10.不要使用 count(列名) count(常量)来替代 count(*)count(*) SQL92 定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。


常见问题预防

1.异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。

2. try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。 


3.捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

4.方法的返回值可以为 null,不强制返回空集合,或者空对象等,必须添加注释充分 说明什么情况下会返回 null 值。调用方需要进行 null 判断防止 NPE 问题。

5.防止 NPE NPE 产生的场景举例:

  • 数据库的查询结果可能为null 
  • 集合里的元素即使isNotEmpty,取出的数据元素也可能为null 
  • 远程调用返回对象时,要求进行空指针判断,防止NPE
  • 对于Session中获取的数据,建议NPE检查,避免空指针。


6.对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳 定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。



内部规范:


1.统一使用es6letconstasync/await等。


2.router层代码调用service层,不要在router层直接操作数据库。


3.不要直接对外报500错误,统一500错误处理


4.不为空判断:

统一使用lodashisEmpty函数。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值