int i = 0;名称 i 没有任何的实际意义,没有体现出数量的意思,所以我们应当指明数量的名称
int count = 0;2.能够读的出来
private String sfzh; private String dhhm;这些变量的名称,根本读不出来,更别说实际意义了。所以我们可以使用正确的可以读出来的英文来命名
private String idCardNo; private String phone;二、规范代码格式
for (Integer id : ids) { if (id == 0) { continue; } //做其他事 }为什么 id == 0 需要跳过,代码是无法看出来了,就需要注释了。
4.当代码还未完成时可以使用 todo 注释来注释
protected boolean internalCancel(String appName, String id, boolean isReplication) { try { // 堆代码 duidaima.com read.lock(); doInternalCancel(appName, id, isReplication); } finally { read.unlock(); } // 剩余代码 } private boolean doInternalCancel(String appName, String id, boolean isReplication) { //真正处理下线的逻辑 }五、方法别太长
if (条件1) { if (条件2) { if (条件3) { if (条件4) { if (条件5) { System.out.println(""Hello 堆代码 duidaima.com""); } } } } }面对这种情况,可以换种思路,使用return来优化
if (!条件1) { return; } if (!条件2) { return; } if (!条件3) { return; } if (!条件4) { return; } if (!条件5) { return; } System.out.println("Hello 堆代码 duidaima.com");这样优化就感觉看起来更加直观
if (((StringUtils.isBlank(person.getName()) || "堆代码".equals(person.getName())) && (person.getAge() != null && person.getAge() > 10)) && "汉".equals(person.getNational())) { // 处理逻辑 }这段逻辑,这种条件表达式乍一看不知道是什么,仔细一看还是不知道是什么,这时就可以这么优化
boolean sanyouOrBlank = StringUtils.isBlank(person.getName()) || "堆代码".equals(person.getName()); boolean ageGreaterThanTen = person.getAge() != null && person.getAge() > 10; boolean isHanNational = "汉".equals(person.getNational()); if (sanyouOrBlank && ageGreaterThanTen && isHanNational) { // 处理逻辑 }此时就很容易看懂if的逻辑了
@PostMapping public void addPerson(@RequestBody AddPersonRequest addPersonRequest) { if (StringUtils.isBlank(addPersonRequest.getName())) { throw new BizException("人员姓名不能为空"); } if (StringUtils.isBlank(addPersonRequest.getIdCardNo())) { throw new BizException("身份证号不能为空"); } // 处理新增逻辑 duidaima.com }这种写虽然可以,但是当字段的多的时候,光校验就占据了很长的代码,不够优雅。针对参数校验这个问题,有第三方库已经封装好了,比如hibernate-validator框架,只需要拿来用即可。所以就在实体类上加@NotBlank、@NotNull注解来进行校验 。
@Data @ToString private class AddPersonRequest { @NotBlank(message = "人员姓名不能为空") private String name; @NotBlank(message = "身份证号不能为空") private String idCardNo; //忽略 }此时Controller接口就需要方法上就需要加上@Valid注解
@PostMapping public void addPerson(@RequestBody @Valid AddPersonRequest addPersonRequest) { // 处理新增逻辑 }十、统一返回值
{ "code":0, "message":"成功", "data":"返回数据" }不仅是给前端参数,也包括提供给第三方的接口等,这样接口调用方法可以按照固定的格式解析代码,不用进行判断。如果不一样,相信我,前端半夜都一定会来找你。Spring中很多方法可以做到统一返回值,而不用每个方法都返回,比如基于AOP,或者可以自定义HandlerMethodReturnValueHandler来实现统一返回值。
@GetMapping("/{id}") public Result<T> selectPerson(@PathVariable("id") Long personId) { try { PersonVO vo = personService.selectById(personId); return Result.success(vo); } catch (Exception e) { //打印日志 //堆代码 duidaima.com return Result.error("系统异常"); } }
每个接口都得这么玩,那不得满屏的try catch。所以可以基于Spring提供的统一异常处理机制来完成。
//示例1 public void updatePerson(@Nullable Person person) { if (person == null) { return; } personService.updateById(person); } //示例2 public void updatePerson(@NonNull Person person) { personService.updateById(person); }十三、尽量不返回null值
public Optional<Person> getPersonById(Long personId) { return Optional.ofNullable(personService.selectById(personId)); }如果不想这么写,也可以通过@NonNull和@Nullable表示方法会不会返回null值。
4.日志内容太大不打印,比如有时需要将图片转成Base64,那么这个Base64就可以不用打印
public void updatePersons(List<Person> persons) { if (persons != null && persons.size() > 0) { } }但是一般不推荐这么写,可以通过一些判断的工具类来写
public void updatePersons(List<Person> persons) { if (!CollectionUtils.isEmpty(persons)) { } }不仅集合,比如字符串的判断等等,就使用工具类,不要手动判断。
private static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static String formatDateTime(Date date) { return DATE_TIME_FORMAT.format(date); }这段代码看似没啥问题,但是却忽略了SimpleDateFormat是个线程不安全的类,所以这就会引起坑。一般对于这种已经有开源的项目并且已经做得很好的时候,比如Hutool,就可以把轮子直接拿过来用了。
public class OrderService { private UserService userService = new UserService(); }聚合:
public class OrderService { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } }二十、使用设计模式优化代码
public interface MessageNotifier { /** * 堆代码 duidaima.com * 是否支持改类型的通知的方式 * @param type 0:短信 1:app * @return */ boolean support(int type); /** * 通知 * * @param user * @param content */ void notify(User user, String content); }短信通知实现:
@Component public class SMSMessageNotifier implements MessageNotifier { @Override public boolean support(int type) { return type == 0; } @Override public void notify(User user, String content) { //调用短信通知的api发送短信 } }app通知实现:
public class AppMessageNotifier implements MessageNotifier { @Override public boolean support(int type) { return type == 1; } @Override public void notify(User user, String content) { //调用通知app通知的api } }最后提供一个方法,当需要进行消息通知时,调用notifyMessage,传入相应的参数就行。
@Resource private List<MessageNotifier> messageNotifiers; public void notifyMessage(User user, String content, int notifyType) { for (MessageNotifier messageNotifier : messageNotifiers) { if (messageNotifier.support(notifyType)) { messageNotifier.notify(user, content); } } }假设此时需要支持通过邮件通知,只需要有对应实现就行。