単一責任の原則

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

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート