php网站后台建设/防疫优化措施
A class should have only one reason to change.
单一职责就是说,不要所有的东西都堆到一起,按照他们的职责边界拆分到不同的模块/类中。将所有东西堆放在一起容易“牵一发而动全身”,修改一处需要回归测试全部的功能。
违背单一职责原则的示例
import java.util.Random;class Employee {public String firstName, lastName, empId;public double experienceInYears;public Employee(String firstName, String lastName, double experience) {this.firstName = firstName;this.lastName = lastName;this.experienceInYears = experience;}// 打印基础信息public void displayEmpDetail(){System.out.println("The employee name: " + lastName+","+firstName);System.out.println("This employee has " + experienceInYears +" years of experience.");}// 检查是否老员工public String checkSeniority(double experienceInYears){return experienceInYears > 5 ?"senior":"junior";}// 生成员工号public String generateEmpId(String empFirstName){int random = new Random().nextInt(1000);empId = empFirstName.substring(0,1)+random;return empId;}
}
class Client {public static void main(String[] args) {System.out.println("*** A demo without SRP.***");Employee robin = new Employee("Robin", "Smith", 7.5);showEmpDetail(robin);System.out.println("\n*******\n");Employee kevin = new Employee("Kevin", "Proctor", 3.2);showEmpDetail(kevin);}private static void showEmpDetail(Employee emp) {emp.displayEmpDetail();System.out.println("The employee id: "+ emp.generateEmpId(emp.firstName));System.out.println("This employee is a " + emp.checkSeniority(emp.experienceInYears)+ " employee.");}}
我们发现,在Employee类中,既声明了常规的属性,又提供了三个方法。其实打印基础信息这个方法还好,放置在Employee类中还算合理。但是对于生成员工号、判断是否老员工的方法放置在Employee类中就不是特别合理了:
1. 生成员工号的算法可能存在着迭代的需求。
2. 判断是否老员工的规则可能随时会发生变化。
单一职责化拆解
class Employee {public String firstName, lastName, empId;public double experienceInYears;public Employee(String firstName, String lastName, double experience) {this.firstName = firstName;this.lastName = lastName;this.experienceInYears = experience;}// 打印基础信息public void displayEmpDetail(){System.out.println("The employee name: "+lastName+","+firstName);System.out.println("This employee has "+ experienceInYears+" years of experience.");}}
import java.util.Random;class EmployeeIdGenerator {String empId;// 员工号生成public String generateEmpId(String empFirstName) {int random = new Random().nextInt(1000);empId = empFirstName.substring(0, 1) + random;return empId;}
}
class SeniorityChecker {// 检查是否老员工public String checkSeniority(double experienceInYears){return experienceInYears > 5 ?"senior":"junior";}}
class Client {public static void main(String[] args) {System.out.println("*** A demo that follows the SRP.***");Employee robin = new Employee("Robin", "Smith", 7.5);showEmpDetail(robin);System.out.println("\n*******\n");Employee kevin = new Employee("Kevin", "Proctor", 3.2);showEmpDetail(kevin);}private static void showEmpDetail(Employee emp) {// Display employee detailemp.displayEmpDetail();// Generate the IDEmployeeIdGenerator idGenerator = new EmployeeIdGenerator();String empId = idGenerator.generateEmpId(emp.firstName);System.out.println("The employee id: " + empId);// Check the seniority levelSeniorityChecker seniorityChecker = new SeniorityChecker();System.out.println("This employee is a " + seniorityChecker.checkSeniority(emp.experienceInYears) + " employee.");}
}
在Employee类中,声明了常规的属性,提供了打印基础信息的方法。提出生成员工号、判断是否老员工的方法到不同的职责类中。这样,在后续的迭代中,即便是修改老员工的判断规则,或者生成员工号的算法,也不会对Employee类造成太大的影响。