単一責任の原則

WBOY
リリース: 2024-08-25 20:32:03
オリジナル
401 人が閲覧しました

Single Responsibility Principle

すべてのソフトウェア コンポーネントは 1 つの責任のみを持つ必要があります

ソフトウェア コンポーネントはクラス、メソッド、またはモジュールです

例、スイスアーミーナイフはソフトウェア開発の単一責任原則に違反する多目的ツールですが、代わりにナイフは単一責任に従う良い例です(スイスアーミーナイフとは異なり切断にしか使用できないため)切る、缶を開ける、マスターキー、ハサミなどとして使用できます)

現実世界でもソフトウェア開発でも変化は絶え間なく続くため、単一責任原則の定義もそれに応じて変化します

すべてのソフトウェア コンポーネントには、変更する理由が 1 つだけあるはずです


以下のクラスの従業員に変化が起こる理由は 3 つあります

  1. 従業員属性の変更
  2. データベースの変更
  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 サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!