Open1

オブジェクト指向

meshidennmeshidenn

オブジェクト指向の原則がわからなかった

クリーンアーキテクチャにはオブジェクト指向の設計原則以下が記載されている。

  • 単一責任の原則(SRP) : モジュール (クラス) を変更する理由はたった一つだけである
  • オープンクローズドの原則(OCP) : ソフトウェアの構成要素は拡張に対して開いていて、修正に対して閉じていなければならない
  • リスコフの置換原則(LSP) : 派生型はその基本型と置換可能でなければならない
  • インターフェイス分離原則(ISP) :クライアントに、クライアントが使用しないメソッドへの依存を強制してはならない。
  • 依存関係逆転の法則(DIP) :上位のモジュールは下位のモジュールに依存してはならない。どちらのモジュールも「抽象」に依存すべきである。また、「抽象」は実装の詳細に依存してはならない。実装の詳細が「抽象」に依存すべきである。

これらが分からなかった。が、アーキテクトの教科書 を読むことで少しわかった。総じていえば、Howと適用タイミングがわかっていなかった。

なにが分かったのか

  • 全体としては、依存関係を独立に保ち、影響範囲を限定的にするための原則。つまりシンプルにする。
  • SRPとISPは使用目的の違いによる変更理由の違いと影響に関わる原則
  • OCPとDIPはコードの独立性を上げて、不安定な箇所を分離するための原則
  • LSPは抽象に書いてある通りに使えるようにするための原則

何がわかっていなかったのか

依存・使用・向かうの関係がわかっていなかった

「AがBに依存する」、「AがBを使用する」、「AからBに矢印が向かう」が同値であるということがわかっていなかった。これは、LLMさんに効くのとクリーンアーキテクチャを読み直して分かった。

動的型付け言語を触っていてイメージがわかっていなかった。

動的型付け言語を使っていて、インターフェイスを使うシーンが少なかったため、ISPなどはイメージができなかった。職場でインターフェイスを使っているコードをみてイメージがわいたので、少しわかった。インターフェイスを分ければ、影響を分離できるよね!

インタフェースがないと依存性が逆転できないことがわかっていなかった

インタフェースがあると、型付言語ではインタフェースを通じて使用することができるので、依存性を逆転できる。

モジュールの話クラスの話なのか混乱していた

クリーンアーキテクチャでは、特にどちらも分けていないのだと思う。が、アーキテクトの教科書はクラスの話とモジュールの話を分けていた。また、クラスの話には、サンプルコードがありイメージがわいた。

違反している状態がわからなっていなかった

クリーンアーキテクチャにはOCPとDIPについて違反状態が記載されておらず、わからなかった

原則の立ち位置がわかっていなかった

今の会社でXPに触れ始めて、原則の立ち位置が少しわかった。XPでは、原則は価値とプラクティスをつなぐ粒度のものということ。この原則もそれぐらいの抽象度のものなのだなという心づもりができた

原則を端的にまとめた文がクリーンアーキテクチャに記載されていない

表題の通りなのだが、原則が何であるかを表現した文がISPとDIPに記載されていない。端的に言われると、頭に残るよね!

自分は独自解釈をしないとわかった気にならない。

本に書いてあることに加えて、新しい整理方法で整理するなどしないと、自分がわかった気にならない。