Каждый программный компонент должен иметь только одну и одну ответственность
Программный компонент может быть классом, методом или модулем
Например, швейцарский армейский нож — это многоцелевой инструмент, который нарушает принцип единой ответственности при разработке программного обеспечения. Вместо этого нож является хорошим примером, который следует единой ответственности (поскольку его можно использовать только для резки, в отличие от швейцарского армейского ножа). который можно использовать для резки, открытия консервных банок, в качестве отмычки, ножниц и т. д.)
Поскольку изменения происходят постоянно, будь то в реальном мире или при разработке программного обеспечения, определение принципа единой ответственности также меняется соответствующим образом
Каждый программный компонент должен иметь одну и только одну причину для изменения
Существует три причины, по которым могут произойти изменения в приведенном ниже классе «Сотрудник»
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; /** * Employee class has details of employee * This class is responsible for saving employee details, getting tax of * employee and getting * details of employee like name, id, address, contact, etc. */ public class Employee { private String employeeId; private String employeeName; private String employeeAddress; private String contactNumber; private String employeeType; public void save() { String insert = MyUtil.serializeIntoString(this); Connection connection = null; Statement statement = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc://mysql://localhost:8080/MyDb", "root", "password"); statement = connection.createStatement(); statement.execute("insert into employee values (" insert ")"); } catch (Exception e) { e.printStackTrace(); } } public void calculateTax() { if (this.getEmployeeType().equals("fulltime")) { // tax calculation for full time employee } else if (this.getEmployeeType().equals("contract")) { // tax calculation for contract type employee } } public String getEmployeeId() { return employeeId; } public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public String getEmployeeAddress() { return employeeAddress; } public void setEmployeeAddress(String employeeAddress) { this.employeeAddress = employeeAddress; } public String getContactNumber() { return contactNumber; } public void setContactNumber(String contactNumber) { this.contactNumber = contactNumber; } public String getEmployeeType() { return employeeType; } public void setEmployeeType(String employeeType) { this.employeeType = employeeType; } }
Поскольку SRP (принцип единой ответственности) рекомендует только одну причину для изменения в классе, нам придется внести некоторые изменения в класс «Сотрудник»
Изменения по рекомендованной розничной цене
Теперь есть только одна причина, по которой могут произойти изменения в классе сотрудников
Причина изменения: Изменение атрибута «Сотрудник»
/** * Employee class has details of employee */ public class Employee { private String employeeId; private String employeeName; private String employeeAddress; private String contactNumber; private String employeeType; public void save() { new EmployeeRepository().save(this); } public void calculateTax() { new TaxCalculator().calculateTax(this); } public String getEmployeeId() { return employeeId; } public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } public String getEmployeeName() { return employeeName; } public void setEmployeeName(String employeeName) { this.employeeName = employeeName; } public String getEmployeeAddress() { return employeeAddress; } public void setEmployeeAddress(String employeeAddress) { this.employeeAddress = employeeAddress; } public String getContactNumber() { return contactNumber; } public void setContactNumber(String contactNumber) { this.contactNumber = contactNumber; } public String getEmployeeType() { return employeeType; } public void setEmployeeType(String employeeType) { this.employeeType = employeeType; } }
Кроме того, существует только одна причина, по которой могут произойти изменения в классе WorkerRepository
Причина изменения: Изменение базы данных
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class EmployeeRepository { public void save(Employee employee) { String insert = MyUtil.serializeIntoString(employee); Connection connection = null; Statement statement = null; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc://mysql://localhost:8080/MyDb", "root", "password"); statement = connection.createStatement(); statement.execute("insert into employee values (" insert ")"); } catch (Exception e) { e.printStackTrace(); } } }
Наконец, есть только одна причина, по которой могут произойти изменения в классе TaxCalculator
Причина изменения: Изменение расчета налога
public class TaxCalculator { public void calculateTax(Employee employee) { if (employee.getEmployeeType().equals("fulltime")) { // tax calculation for full time employee } else if (employee.getEmployeeType().equals("contract")) { // tax calculation for contract type employee } } }
Примечание: все три класса теперь следуют принципу единой ответственности, то есть соответствуют обоим определениям
При создании классов или любого программного компонента имейте в виду: Стремитесь к высокой связности и слабой связи
Каждый программный компонент должен иметь только одну и одну ответственность и
Каждый программный компонент должен иметь одну и только одну причину для изменения
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3