この記事について
- Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んだ際の覚え書きです
覚え書き
コンポーネントとは、デプロイの単位のことである。
まとめ
- デプロイ単位を意識してコンポーネントを作成していきたい
- デプロイ単位は差し替え可能な単位であることに注意したい
ソースコードの依存関係が(具象ではなく)抽象だけを参照しているもの。それが、最も柔軟なシステムである。
このルールを絶対のものとして守り続けるのは明らかに現実的ではない。 ... 依存したくないのは、システム内の変化しやすい具象要素だ。
抽象コンポーネントにはすべての上位レベルのビジネスルールが含まれる。具象コンポーネントには、これらのビジネスルールが操作する実装の詳細が含まれる。
インターフェイス分離の原則(ISP)は言語の問題であり、アーキテクチャの問題ではないと考える人もいるかもしれない
必要としないモジュールに依存することは一般的に有害とされる。ソースコードの依存関係に置いては、再コンパイルや再デプロイを強制されるので明らかに有害であることがわかる。だがさらに上位のアーキテクチャレベルにおいても有害なのだ
アーキテクチャの観点からリスコフの置換原則(LSP)を理解するにはこの原則に違反した時にシステムのアーキテクチャに何が起こるのかを考えてみるのが一番だ。
RESTfulサービスのインターフェイスが置換可能になっていないせいで、アーキテクトは複雑な仕組みを追加することになってしまった。
今ではインターフェイスと実装に関するソフトウェア設計の原則になっている。
対象となるインターフェイスにはさまざまな形式がある。Java風のインターフェイスは、それを実装したクラスをいくつも作れる。Rubyであれば、同じメソッドシグネチャを共有するクラスをいくつも作れる。ウェブであれば、同じRESTインターフェイスに応答するサービスをいくつも作れる。
言い換えれば、ソフトウェアの振る舞いは、既存の成果物を変更せず拡張できるようにすべきである、ということだ。
アーキテクチャは、いつどのような理由でどのように変更するかを考えて機能を分割する。そして、分割した機能をコンポーネントの階層構造にまとめる。上位レベルにあるコンポーネントは、下位レベルのコンポーネントが変更されたとしても、変更する必要はない。
SOLID原則の単一責任の原則とは別ものである。
モジュールを変更する理由はたった一つだけであるべきである。
↓
モジュールはたったひとつのアクターに対して責務を負うべきである。
アクターの異なるコードは分割するべきという原則だ。
これらの問題にはさまざまな解決策がある。いずれも関数を別のクラスに移動するというものだ。
競合状態、デッドロック状態、並行更新の問題の原因が、すべて可変変数にあるからだ
不変性に関する最も一般的な妥協となるのは、アプリケーションまたはアプリケーションのサービスを「可変コンポーネント」と「不変コンポーネント」に分離することである