(1) 有效的命名,言简意赅,可读性高;
(2) 在同一个类中,命名方式要保持一致;
a. 使用驼峰就全用驼峰;URL使用下划线,那所有的URL就都用下划线;
b. 比如HttpServletResponse用response名称,其他HttpServletResponse也用response名称;
2. 方法
(1) 一个方法尽量不超过一屏的行数;尽量30行以下;
(2) 方法的缩进层次应该不多于一层或两层;
(3) 方法应该只做一件事,如何确定只做一件事()是否能再拆出一个函数);
(4) 巧用工厂设计模式;
(5) 函数参数个数,最好0个,最多应该不超过3个参数;
(6) 参数类型不要传boolean。如果要用boolean,可以考虑用两个方法(不太赞同);
(7) 多个参数,参数类型尽量统一在同一个层次上,int -> int ;
(8) 参数多用dto对象;
(9) 函数应该修改某对象的状态,或返回该对象的有关信息,不要两样同时做;
(10) 先写try-catch, 然后将try-catch中的业务代码单独封装成一个方法;如 try{delete();}
(11) 缩小exception的范围,传递足够多的信息给catch块,catch中尽量不要涉及逻辑;
(12) 如果exception太多,定义一个类专门处理(多用于第三方包);
(13) 方法处理是一件事,异常处理就是一件事;(14) 避免重复代码,将重复代码提取出来做成公共方法;
(15) 尽量不要返回null;比如,List返回空列表,可以用Collections.emptyList();
public static <T> List<T> getList() {
return Collections.emptyList();
}
(16) 将初始化与使用分开;(17) 写方法时,考虑参数为null和空字符串的场景;
(18) 在一些有可能会出现并发的情况下,使用concurrentHashMap替代HashMap;3. 注释
(1) 注释不要太多,少用html注释,html注释应该是工具而非程序员来加的;
4. 日志
(1) 方法入口:[日志级别][业务功能][参数];
(2) 异常处理(仅限需要自行处理的异常):[日志级别][业务功能][参数][异常描述];
(3) 外部接口调用开始: [日志级别][业务功能][调用接口名称][参数];
(4) 外部接口调用结束:[日志级别][业务功能][调用接口名称][调用结果][返回值];
(5) 内部接口调用:不建议打印日志;(6) 方法出口: [日志级别][业务功能][返回值];
(7) 循环中:不建议打印日志;(8) 敏感数据:用户账号、密码、个人信息等敏感数据不允许打印日志。
名词解释:
(1) 参数:打印传入参数,实体类建议实现toString方法;
(2) 调用结果:成功,失败,不确定;
logger.info("[getUserInfo]用户查询参数:", inputData);
5. 单元测试
(1) 整体应分为三个环节:
a. make 构造测试数据;
b. submit 操作测试数据;c. assert 检验是否得到期望的结果;
(2) 单元测试中单个测试的断言数量应最小化,一个最好,即每个方法只测试一个概念;(3) 测试原则:
a. 测试应该有布尔值输出,来确定测试有没有通过;b. 测试应该独立,可以单独运行一个测试不应成为下一个测试的条件;
c. 测试边界条件,测试空值;
d. 是否覆盖完整;
(4) TDD,先测试代码,再编写程序;6. 类相关
(1) 类设计时,考虑单一原则;
(2) 从整体想问题,方法是否正确,是否是最优解;
(3) 有没有自己没有考虑到的情况,每种边界,每种极端,每个异常;(4) 可维护:代码不能写死,代码容易修改,预测可能发生的变化;如果某天要修改的话,使修改的东西很少;
(5) 尽量避免废弃代码的出现,即永远不会被调用到的,if,catch,util包,switch,case等中出现的;
(6) 使用一些代码覆盖工具,查看有没有一直没有被调用的方法;
(7) 移除没用的构造器,变量,注释,引用,函数等;(8) 用多态代替if/else,switch/case;
(9) 多使用枚举,使用枚举代替常量;
(10) 在代码中做决定时,确认自己足够准确,如调用可能返回null的函数,确认自己检查了null值;如果有可能有并发更新,确认你实现了某种锁定机制;
(11) 应该把解释了条件意图的函数抽离出来,如使用if(should(timer))代替if(timer.hasExpired() && timer.isRight());
(12) 封装边界条件,把边界有关的条件封装到一起,形成一个方法;7. 文档:
(1) 编写对应的接口文档,详细设计文档;
8. git提交的一些规范
(1) 每完成了一个独立的功能或解决了一个bug才push;
(2) 每次push确保本地测试完全通过;(3) 如果本地提交记录较多,比较乱,建议 push 之前,本地先 git rebase -i, 可以合并多个提交,修改提交顺序,以及更改 commit message;
(4) 涉及多分支开发合并的,尽量rebase后,再merge,确保commit history清晰;(5) 多push,避免本地代码丢失,前功尽弃;
参考:《代码整洁之道》
参考:git提交