为什么需要代码规范?
提高效率
提高质量
降低维护成本
让别人也遵守,形成良性的环境
代码规范参照Java开发手册,本文只列出一些常规约定和注意事项
常规约定:
【强制】类名使用UpperCamelCase风格,以下情形例外:DO / PO / DTO / BO / VO / UID 等。
【强制】常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
【推荐】使用Swagger框架为接口和字段添加注释,接口联调时,能保证Swagger文档中看到接口说明都是最新版。
【参考】枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
【强制】单行字符数限制不超过 120 个,超出需要换行,单个方法不超过80行。
【强制】Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
【推荐】慎用 Object 的 clone 方法来拷贝对象,对象clone方法默认是浅拷贝,若想实现深拷贝有以下几种方式:通过构造方法手动创建
复写clone方法
使用Java自带的流方式
使用第三方包Jackson实现,原理是先把对象转成json格式,再转成原类型的新对象。
【强制】不要在foreach循环里进行元素的remove/add操作。remove元素请使用iterator方式,如果并发操作,需要对iterator对象加锁。
【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
【强制】SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类,所有日期相关的扩展操作,要统一放到同一个扩展的工具类中。
【强制】必须回收自定义的ThreadLocal变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的ThreadLocal变量,可能会影响后续业务逻辑和造成内存泄露等问题。
【推荐】公开接口需要进行入参保护,尤其是批量操作的接口。要限制查询数据量以及敏感数据的脱敏处理。
【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
【强制】类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式,不得使用// xxx方式。
【强制】所有方法一定要有清晰的业务处理步骤及注释说明。
【推荐】在类中删除未使用的任何字段和方法、内部类;在方法中删除未使用的参数声明与内部变量。重复的代码块抽出成公共的方法。
【强制】前后端交互的API,需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。
【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。
【强制】服务端发生错误时,返回给前端的响应信息必须包含HTTP状态码,errorCode、errorMessage、用户提示信息四个部分。错误码需要统一格式。
【强制】对于需要使用超大整数的场景,服务端一律使用String字符串类型返回,禁止使用Long类型。否则会造成前端数据显示时损失精度。
【强制】对于外部系统接口的访问,必须加入防腐层,由防腐层统一处理接口范围的异常信息。
【强制】所有后端抛出的错误信息,都要做统一拦截,不可将晦涩的服务器错误直接抛给前端。
【推荐】应用中应输出必要的日志信息,日志信息不要复用,减少问题定位复杂度。
【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。防止出现垂直越权和水平越权。
【强制】用户输入的SQL参数严格使用参数绑定或者METADATA字段值限定,防止SQL注入,禁止字符串拼接SQL访问数据库。
【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。
【强制】对于文件上传功能,需要对于文件大小、类型进行严格检查和控制。
【强制】配置文件中的密码需要加密。
【强制】接口参数禁止使用枚举类型。
代码管理
【强制】控制master分支代码提交权限,只能通过提交Merge Request方式提交