コードで見るSOLID原則:単一責任の原則

目次:

単一責任原則(SRP)ってドユコト?

単一責任原則(SRP)とは、ソフトウェア設計の原則の一つで、すべてのモジュールやクラスは、変更する理由を一つだけにする、つまり責任を一つにするというものである。つまり、モジュールやクラスは単一の明確に定義されたタスクに集中すべきであり、複数の無関係なタスクに関わるべきでないということである。

ソフトウェアの複雑性によく効くの?

YES。

  • 複雑なシステムをより小さく、より焦点を絞ったコンポーネントに分解することを開発者に促すよ。
  • ので、ソフトウェアの複雑さは軽減される。
  • 各コンポーネントの責任は1つであり、理解しやすく保守しやすい。
  • さらに、各コンポーネントの責任が明確に定義されているため、
  • あるコンポーネントの変更がシステムの他の部分にどのような影響を与えるかがわか易いし、見つけやすいよ。特定しやすいよ。
  • 新しいバグが発生したり既存の機能が壊れたりするリスクが軽減されるよ。

テストのし易さによく効くの?

YES。

  • 各コンポーネントのテストを簡単に書くことができるよ。
  • テストの時は、対象のコンポーネントが期待通りに動作していることを確認するから、そのコンポーネントの1つの責任に焦点を当てて書くことができるよ。
  • 1つのコンポーネントの変更が他のシステムに影響を与える可能性が低いよ。
  • 既存のテストが壊れるリスクも低くなるよ。

ソフトウェアを変更しやすくなるの?

YES。

  • システムの修正や拡張が容易になるよ。変更のしやすさが向上するよ。
  • あるコンポーネントの変更が他のシステムに影響を与える可能性は低いよ。
  • 新しいバグが発生したり、既存の機能が壊れたりするリスクは低くなるよ。
  • 各コンポーネントの責任が明確に定義されていからどのような変更が必要なのかが簡単にわかるよ
  • その変更がシステムにどのような影響を与えるか分かりやすいってことだよ。

結論として、SRPはソフトウェアの複雑さを軽減し、テストの容易さを向上させ、変更の容易さを向上させるのに役立つ。SRPに従うことで、開発者は、理解、テスト、変更が容易な、より保守的で拡張性のあるソフトウェアを書くことができる。

コードはドウダ?

4つの言語で見てみようじゃないか。

コードの説明

それぞれ単一の責任を持っている(SRPのことだけ考えた)コードを挙げた。簡単すぎるかも。

  • Customerクラスが顧客情報の保存を担当するよ。
  • CustomerServiceクラスが顧客のデータベースへの追加を担当するよ。
  • CustomerRepositoryクラスは、実際に顧客をデータベースに保存を担当するよ。

単一責任原則(SRP)をJavaで書くと?

class Customer {
  private String name;
  private String address;
  private String email;
  private String phone;
  
  public String getName() { return name; }
  public void setName(String name) { this.name = name; }
  
  public String getAddress() { return address; }
  public void setAddress(String address) { this.address = address; }
  
  public String getEmail() { return email; }
  public void setEmail(String email) { this.email = email; }
  
  public String getPhone() { return phone; }
  public void setPhone(String phone) { this.phone = phone; }
}

class CustomerService {
  private CustomerRepository customerRepository;
  
  public CustomerService(CustomerRepository customerRepository) {
    this.customerRepository = customerRepository;
  }
  
  public void addCustomer(Customer customer) {
    customerRepository.save(customer);
  }
}

class CustomerRepository {
  public void save(Customer customer) {
    // Save the customer to the database
  }
}

単一責任原則(SRP)GOで書くと?

type Customer struct {
  Name string
  Address string
  Email string
  Phone string
}

func AddCustomer(customer Customer, customerRepository CustomerRepository) {
  customerRepository.Save(customer)
}

type CustomerRepository interface {
  Save(customer Customer)
}

type CustomerDB struct{}

func (c *CustomerDB) Save(customer Customer) {
  // Save the customer to the database
}

単一責任原則(SRP)Clojureで書くと?

(defrecord Customer [name address email phone])

(defrecord CustomerService [customer-repo])

(defn add-customer [customer-service customer]
  (let [repo (:customer-repo customer-service)]
    (save repo customer)))

(defrecord CustomerRepository [])

(defmethod save [repo customer]
  ; Save the customer to the database
)

単一責任原則(SRP)Pythonで書くと?

class FileReader:
    def read_data(self, file_name):
        # code to read data from file
        pass

class DataProcessor:
    def process_data(self, data):
        # code to process data
        pass

class FileWriter:
    def write_data(self, file_name, data):
        # code to write data to file
        pass

コメントする