不好的代码要引以为戒,才能写出更好的代码
2022-11-10 本文已影响0人
余很多之很多code
不好的代码要引以为戒,才能写出更好的代码
吃掉异常
try {
//...
}
catch (Throwable t) {
return;
}
catch的地方直接吃掉异常,这样导致排除问题变困难。
变量名无意义,神奇魔法数
public static final String ZERO = "0";//Constants.java
wrapper.lambda().eq(UserEntity::getIsDelete, Constants.ZERO);
定义的变量名只是0的英文,根本无法理解表达的是已经删除还是未删除状态
循环里依次查询数据库
for(Test test:tests) {
test.setName(userService.getNameById(test.getUserId()));
}
应该汇总userId,一次性查询tests列表里对应的,而不是循环不断查询
System.out.println()打印
System.out.println("users:"+users);
生产上应该用log日志去打印,而不是System.out.println,
System.out.println代码跟踪进去,会有synchronized 同步锁,对性能影响很大。
printStackTrace也是。
参数传递userId
//接口请求,传递userId,直接用前端给的userId查询数据
//user/getUserById?userId=11
存在安全风险,应该从当前用户session或者token中得到userId(经验的原因,新手老是会犯)
大量的ifelse
if ("1".equals(type)) {
...
} else if ("2".equals(type)) {
...
} else if ("3".equals(type)) {
....
} else if ("4".equals(type)) {
....
}
通过map优化,更复杂考虑采用责任链模式。
controller调用mapper
@RestController("user")
public class UserController {
Autowired
private UserMapper userMapper;
@RequestMapping("/getUser")
public String getUser() {
Long userId = ...;
return userDao.getUserById(userId);
}
}
controller直接调用mapper,而不是service,层级混乱
未在finally中close
try {
//...
x.close();
}
catch (Throwable t) {
return;
}
很多api涉及到资源释放,都会提供close方法,
但是close()方法应该写在finally中确保被调用。
log日志打印用占位符而不是用字符串拼接
log.info("users:"+users);
正确应该是log.info("users:{}",users);
synchronized范围太大
public void deal() {
synchronized (obj) {
// 查询list当数据判断
// 处理业务
}
}
synchronized应该锁粒度尽量小,本身查询list没有影响的情况下,应该在synchronized前面执行,而不是方法里面,影响了整体性能。