关于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的更多相关文章

  1. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. Java中常用集合操作

    一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...

  6. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

随机推荐

  1. httpclient4.3访问https

    1.创建一个访问https的工具类 package org.aaa.tool;import java.io.File; import java.io.IOException; import java. ...

  2. JAVA EE 学习笔记

    http://www.cnblogs.com/kuangdaoyizhimei/category/701794.html http://www.cnblogs.com/liunanjava/p/445 ...

  3. 【IntellJ IDEA】idea忽略隐藏文件、文件夹的设置操作

    左上角setting 如果要忽略文件夹,则直接填写文件夹名字即可,例如:要忽略target文件夹[建议:尽量不要把target忽略,因为可能编译出问题排查,还需要查看target文件夹中的编译结果] ...

  4. CSS3:绘制图形

    CSS画图形,基本上所有的实现都是对边框的角度的调整及组合. 以下不包含兼容浏览器的前缀,请使用时在border-radius前加-moz-.-webkit- .... 1.正常得不得了的矩形 .sq ...

  5. Mysql 的表级锁和行级锁

    表级锁 MySQL表级锁分为读锁和写锁. 读锁 用法:LOCK TABLE table_name [ AS alias_name ] READ 释放锁使用UNLOCK tables.可以为表使用别名, ...

  6. javascript常见的数组方法

    1:Array对象用于在单个变量中存储多个值typeof(arrArr) 'object'var arr1 = [];//创建一个空数组eg:数组是个引用类型var a = [1,2,3];var b ...

  7. MPFIT for python

    MPFIT本来用IDL语言写的,后面有人翻译成了C语言版本.再后面鉴于python语言的流行使用,又有人将其用Cython加了python接口,直接可以在python中调用,极大地方便了额们这些经常用 ...

  8. Centos系统信息及日志

    1.确认内核版本: #uname -r #uname -a 2.确认发行版本: #cat /etc/redhat-release 3.查看系统载入的模块: #lsmod | grep XXX 载入一个 ...

  9. lodash 工具库

    lodash是一套工具库,内部封装了很多字符串.数组.对象等常见数据类型的处理函数. 1.lodash的引用 import _ from 'lodash' 用一个数组遍历来说明为什么要使用lodash ...

  10. 通过 react-native-keyboard-aware-scroll-view 解决键盘遮盖输入框的问题

    1.安装 yarn add react-native-keyboard-aware-scroll-view 2.引入 import { KeyboardAwareScrollView } from ' ...