在写代码和维护项目的时候,如果没有一个很好的代码编写习惯,很容易会写出各种诡异bug,维护也异常困难。
本篇博客总结了我自己在写代码的心得,关键是通过设计和测试大幅度降低bug。
持续更新中。。。
设计篇
原则1 单一职责
这应该是最重要的原则了,不管是方法还是类,只做尽可能少的事情,比如:
@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class Person {
@NonNull private String name;
private int age;
}
public class SinglePrinciple {
public static void main(String[] args) {
Person person1 = new Person("Jock", 21);
Person person2 = new Person("Mack", 25);
Person person3 = new Person("Jock", 18);
// 使用java11版本创建不可变的List
List<Person> people = List.of(person1, person2, person3);
List<Person> selectedPeople = checkNameAndAge(people, "Jock", 20);
System.out.println(selectedPeople);
}
private static List<Person> checkNameAndAge(List<Person> people, String name, int age) {
return people.stream().filter(p -> p.getName().startsWith(name) && p.getAge() > age)
.collect(Collectors.toList());
}
}
这里面就可以看出,checkNameAndAge这个方法做了两件事情,不符合单一职责。这会给后来的维护和开发带来隐患。
我们可以把代码逻辑拆分,改的好一点。
public class SinglePrinciple {
public static void main(String[] args) {
Person person1 = new Person("Jock", 21);
Person person2 = new Person("Mack", 25);
Person person3 = new Person("Jock", 18);
List<Person> people = List.of(person1, person2, person3);
List<Person> selectedPeople = people.stream().filter(p -> checkAge(p, 20))
.filter(p -> checkName(p, "Jock")).collect(Collectors.toList());
System.out.println(selectedPeople);
}
private static boolean checkName(Person p, String name) {
return p.getName().trim().startsWith(name);
}
private static boolean checkAge(Person p, int age) {
return p.getAge() > age;
}
}
得出的结果都是一样的,当然代码还有很多改善的空间。