Madogiwa Blog

主に技術系の学習メモに使っていきます。

Rubyで学オブジェクト指向 SOLID原則「インターフェイス分離の原則(Interface segregation principle)」

Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Clean Architecture 達人に学ぶソフトウェアの構造と設計

※私の学びのメモなので理解が間違ってる可能性があります、間違ってたらすいません🙇‍♂️

インターフェイス分離の原則(Interface segregation principle)とは?

汎用的な目的のインターフェイスが1つだけあるよりも、特定のクライアント向けのインターフェイスが多数あった方がよりよい。 https://ja.wikipedia.org/wiki/SOLID

この原則は依存性を分割し、使用しない処理に依存しないようにするというものです。

インターフェイス分離の原則の例とコード

インターフェイス分離の原則を意識できていないコードと例

例えば下記のようなXMLJSONCSVといった様々なファイル形式用にパースする処理を実装したClassがあったとします。

class Record < Base
  def initialize(attribute)
    # JSONとXML用のインスタンス変数に代入
  end

  def to_xml
    # XML用の変換処理
  end

  def to_json
    # JSON用の変換処理
  end

  def to_csv
    # CSV用の変換処理
  end
end

上記Classを使ってなんかしらのファイルへの変換処理を実装しようとするとXMLJSONCSV等のファイル形式に関わらずRecordのオブジェクトを生成し、処理を行う必要があります。そのためなんかしらのファイル形式の処理の変更により、他のファイル形式への変換処理に影響が出る可能性や各ファイルの変更が1つのファイルに集中するため、どんどん肥大化していってしまいそうです。。。

インターフェイス分離の原則を意識してリファクタリングしてみる

インターフェース分離の原則に則って、不要な処理に依存しないように用途ごとにClassを分けてみます。下記のように変換するファイルごとにClassを分けてみます。

class Record < Base
  def initialize(attribute)
    # 共通のインスタンス変数
  end
end

class JsonRecord < Record
  def initialize(attribute)
    super
    # Json用のインスタンス変数を代入
  end

  def to_json
    # JSON用の変換処理
  end
end

class XmlRecord < Record
  def initialize(attribute)
    super
    # XML用のインスタンス変数を代入
  end

  def to_xml
    # XML用の変換処理
  end
end

class CsvRecord < Record
  def initialize(attribute)
    super
    # CSV用のインスタンス変数を代入
  end

  def to_csv
    # CSV用の変換処理
  end
end

これによって目的の変換先に合わせて使用するClassを使い分けることができ不要な処理への依存が必要なくなります。さらに依存が局所化し、他の処理の変更の影響は少なくなり、変更も各ファイルに分散され、肥大化も防げそうですね👍

おわりに

今回はオブジェクト指向のSLID原則「インターフェイス分離の原則(Interface segregation principle)」について自分の理解をRubyのコード例とともに説明してみました。

1つのクラスにインターフェースを複数持つのではなく、分離して1つのインターフェース、1つのクラスにするとクラスが肥大化せずに見通しの良いコードを保てそうですね🙌

次回は最後の「依存性逆転の原則(Dependency inversion principle)」について書いてみようかと思います 🙇‍♂️

参考

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Clean Architecture 達人に学ぶソフトウェアの構造と設計

github.com