すべてのソフトウェア コンポーネントは 1 つの責任のみを持つ必要があります
ソフトウェア コンポーネントはクラス、メソッド、またはモジュールです
例、スイスアーミーナイフはソフトウェア開発の単一責任原則に違反する多目的ツールですが、代わりにナイフは単一責任に従う良い例です(スイスアーミーナイフとは異なり切断にしか使用できないため)切る、缶を開ける、マスターキー、ハサミなどとして使用できます)
現実世界でもソフトウェア開発でも変化は絶え間なく続くため、単一責任原則の定義もそれに応じて変化します
すべてのソフトウェア コンポーネントには、変更する理由が 1 つだけあるはずです
以下のクラスの従業員に変化が起こる理由は 3 つあります
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 (単一責任原則) では、クラス内での変更理由は 1 つだけとすることが推奨されているため、Employee クラスでいくつかの変更を行う必要があります
希望小売価格による変更
従業員クラスで変化が起こる理由は 1 つだけです
変更理由: 従業員属性の変更
/** * 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; } }
また、EmployeeRepository クラスで変更が発生する理由は 1 つだけです
変更の理由: データベースの変更
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 クラスで変更が発生する理由は 1 つだけです
変更理由: 税金計算の変更
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 } } }
注: 3 つのクラスはすべて単一責任原則に従い、両方の定義に従います
クラスまたはソフトウェア コンポーネントを作成するときは、次の点に留意してください: 高い凝集性と疎結合を目指す
すべてのソフトウェア コンポーネントは 1 つの責任のみを持つ必要があります と
すべてのソフトウェア コンポーネントには、変更する理由が 1 つだけあるはずです
以上が単一責任の原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。