Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んで、オブジェクト指向の原則について学びがあったので、Rubyのコード例と共に内容を整理してみました。
Clean Architecture 達人に学ぶソフトウェアの構造と設計
- 作者: Robert C.Martin,角征典,高木正弘
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
- この商品を含むブログを見る
※私の学びのメモなので理解が間違ってる可能性があります、間違ってたらすいません🙇♂️
インターフェイス分離の原則(Interface segregation principle)とは?
汎用的な目的のインターフェイスが1つだけあるよりも、特定のクライアント向けのインターフェイスが多数あった方がよりよい。 https://ja.wikipedia.org/wiki/SOLID
この原則は依存性を分割し、使用しない処理に依存しないようにするというものです。
インターフェイス分離の原則の例とコード
インターフェイス分離の原則を意識できていないコードと例
例えば下記のようなXMLやJSONやCSVといった様々なファイル形式用にパースする処理を実装した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を使ってなんかしらのファイルへの変換処理を実装しようとするとXMLやJSON、CSV等のファイル形式に関わらず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 達人に学ぶソフトウェアの構造と設計
- 作者: Robert C.Martin,角征典,高木正弘
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/07/27
- メディア: 単行本
- この商品を含むブログを見る