Cada componente de software deve ter apenas uma responsabilidade
O componente de software pode ser classe, método ou módulo
Exemplo, um canivete suíço é uma ferramenta multifuncional que viola o princípio de responsabilidade única do desenvolvimento de software; em vez disso, um canivete é um bom exemplo que segue a responsabilidade única (já que só pode ser usado para cortar, ao contrário do canivete suíço que pode ser usado para cortar, abrir latas, como chave mestra, tesoura, etc)
Como a mudança é constante, seja no mundo real ou no desenvolvimento de software, a definição do Princípio da Responsabilidade Única também muda de acordo
Cada componente de software deve ter um e apenas um motivo para mudar
Existem três razões pelas quais a mudança pode ocorrer na classe abaixo Funcionário
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; } }
Como o SRP (Princípio da Responsabilidade Única) recomenda apenas um motivo para mudança na classe, teremos que fazer algumas modificações na classe Employee
Alterações por SRP
Agora, há apenas um motivo pelo qual a mudança pode ocorrer na classe Employee
Motivo da alteração: Alteração no atributo do funcionário
/** * 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; } }
Além disso, há apenas um motivo pelo qual a mudança pode ocorrer na classe EmployeeRepository
Motivo da mudança: Mudança no banco de dados
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(); } } }
Finalmente, há apenas um motivo pelo qual a mudança pode ocorrer na classe TaxCalculator
Motivo da alteração: Alteração no cálculo do imposto
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 } } }
Nota: Todas as 3 classes agora seguem o Princípio da Responsabilidade Única, seguindo assim ambas as definições
Ao criar classes ou qualquer componente de software, tenha em mente: Busque alta coesão e baixo acoplamento
Cada componente de software deve ter apenas uma responsabilidade e
Cada componente de software deve ter um e apenas um motivo para mudar
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3