java中的codereview
关于codereview,在平时的开发中,经常忽略的环节,参照目前介绍写好代码的几本书和之前掉进的坑,做了一个总结,分享出来。
为什么要做
- 通过review规避一些代码层面的问题
- 提升可读性,方便后续扩展和维护
- double check 确保代码质量
检查列表
注释
- 写有意义的注释
- DO属性上,名字无法识别业务含义的,加注释
- service接口和manager接口,注明方法的说明
- 代码块中的复杂逻辑,添加注释
风格
- 域名不要写死
- 不同环境下差异的,注意使用配置项
日志
- 合理分配日志级别,warn和error要分开
- 日志中,异常信息要记录,第一个参数简短说明,第二个异常信息
- 日志异常注意把相关的参数信息记录下来,例如userId等
- 异常抛日志的情况下,主要不要引入二次异常
- 配置参数
线程安全
- 需要被多个线程访问的对象是否线程安全,检查有无通过同步方法保护
- 在保证线程安全的同时,要注意避免过度使用同步,导致性能降低
- 不用使用Java原生的线程处理方法,推荐使用JUC框架中的类
- 根据场景选择不用的线程池来实现,会用简化版Executors,理解处理过程
异常处理
- 不要直接e.printStackTrace,用Logger记录下来
- 异常捕获之后,要做响应的处理,返回错误提示或者记录日志,切忌啥都不做
- 当前程序中能够处理的异常,捕获即可,无法处理的,抛出
- 异常只为异常服务,不要掺杂业务逻辑到异常中
性能
- 避免多重的RPC或者网络IO的循环,尽量批处理
- 避免无穷循环,要有终止条件判断
- 不要主动进行垃圾回收,代码中不要有System.gc()
- String的split方法不要用,用开源包中的StringUtil工具类
- 字符串的拼接,使用StringBuilder和StringBuffer
代码逻辑
- 不要在finally中return(try中的返回值,屏蔽异常)
- volatile不具有原子性,划分好synchronized的粒度问题
- 推荐使用Guava作为工具处理类
- 推荐joda来处理时间,然后SimpleDateFormat是非线程安全的
- 单个方法超过50行,要做抽取,否则无法保证可读性
- 方法入参超过5个,抽取到QueryTO中进行处理
- for或if的层级嵌套,不要超过4层
- if的逻辑判断中,多个||和&&的组合,注意拆分处理
- case语句后面,需要加break
- if后面,记得写大括号
- 文件资源,访问后,记得close掉
- 排序优先使用Comparator,一个类的扩展排序工具
- 使用addAll、retainAll、removeAll优雅实现并集、交集、差集
- List的remove,使用迭代器来进行删除
事务处理
- 多表同时更新操作,需要事务包裹,并验证过
- 批量插入,使用iBatis的batchInsert特性,需要在事务下才生效,可以通过wireshark查看网络情况
- 分布式场景下,可以使用消息中间件来保证最终一致性
- 声明式事务注解标签,尽量在manager层搞掉,不要搞到service层或者web层
- 一些可能出现重复处理的方法,记得做幂等操作
重复代码
- don’t repeat yourself
- 同样的业务逻辑处理,不要有两份代码
安全问题
XSS
- cookie设置httponly属性
- jsonp输入输出检查
CSRF
- 服务端增加CSRF校验,增加token
- 必要的验证码
水平权限
- 不用用户之间的不能相互操作
标准
- 代码整洁
- 可读性好
- 可维护性高
- 性能优
本文转自:http://iamzhongyong.iteye.com/blog/2149463
java中的codereview的更多相关文章
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- Java中常用集合操作
一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 关于Java中进程和线程的详解
一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- Java中的进程与线程(总结篇)
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
随机推荐
- 【bzoj1455】【罗马游戏】左偏树+并查集(模板)
Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...
- 【欧拉函数表】POJ2478-Farey Sequence
[题目大意] 求∑φ(i)(1<=i<=N). [思路] 欧拉函数具有如下的重要推论: 当b是素数时 性质①若b|a,有φ(ab)=φ(a)*b: 性质②若b不|a,有φ(ab)=φ(a) ...
- (转)unity web 缓存解决方案
unity web 缓存解决方案 官方发布 web版限制五十M缓存,根据自己的经验绕了过去,解决了缓存的问题.带工程,带源代码.由于本人的水平也有限,是用JS来解决的,如果你还是没有头绪,可以购买来试 ...
- [读书笔记] 你早该这么玩Excel
<你早该这么玩Excel>只教你做两件事:如何设计一张“天下第一表”,你会恍然大悟,以前遇到的种种麻烦是因为做错了表格:如何一分钟“变”出N张表,你会明白表格是“变”出来的,不是“做”出来 ...
- 130804组队练习赛ZOJ校赛
A.Ribbon Gymnastics 题目要求四个点作圆,且圆与圆之间不能相交的半径之和的最大值.我当时想法很简单,只要两圆相切,它们的半径之和一定最大,但是要保证不能相交的话就只能取两两个点间距离 ...
- Visio插入竖直省略号
不去想省略号,想效果,插入文本框,输入点号,换行,三次就ok.
- [转载]DIY树莓派之随身工具箱
摆弄树莓派有一年多了,在这里把经验分享给大家,少走弯路. 先放图两张. 搭建目的: wifi信号中转站\网站服务器\IC卡渗透测试\中间人\otr… 基于树莓派3 系统为Kali Linux 2017 ...
- 淘宝Diamond架构分析
转载:http://blog.csdn.net/szwandcj/article/details/51165954 早期的应用都是单体的,配置修改后,只要通过预留的管理界面刷新reload即可.后来, ...
- 爪哇国新游记之二十九----访问URL获取输入流
代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...
- 倍福TwinCAT(贝福Beckhoff)应用教程13.2 TwinCAT控制松下伺服 NC自定义直线插补
对于MOVEJ的关节运动来说,我们只关心每个电机的角度(只需要考虑多个电机协同开始运动和结束运动,关键是对每个电机加速度均一化,从而一起跑一起停,这部分内容可以参考机器人学导论以获取更加详细的说明), ...