【CleanArchitecture】 読書メモ5

2023/02/14に公開

コンポーネントの関連を扱う3つの原則

第14章 コンポーネントの結合

非循環依存関係の原則(ADP)

コンポーネントの依存グラフに循環依存があってはいけない
自分の変更でなくても他の人の変更で、昨日まで動いていたコードが動かなくなる「二日酔い症候群」を解決するソリューションが二つある。一つは「週次ビルド」、もう一つは「非循環依存の原則(ADP)」

週次ビルド

4日は他の人の変更を気にせずに開発する。5日目に統合作業を行う。しかしこの方法はプロジェクトが大きくなると1日かけても終わらなくなってしまう。

循環依存の除去

この問題を解決するには開発環境をリリース可能なコンポーネントに分割すればいい。こうすればコンポーネントが作業単位になり、コンポーネントごとに担当の開発者(あるいは開発者チーム)を割り当てられる。
このプロセスをきちんと機能させるにはコンポーネントの依存関係を管理しておく必要がある。循環依存があってはならない。
依存関係が明確であれば、比較的手間をかけずにテストを実行できるできるし、考慮すべき変動要素も少なくて済む。

コンポーネントの依存グラフにおける循環依存の影響

新たな要件追加で、Entitiesに含まれるクラスが、Authorizerにあるクラスを使わざるを得なくなったとする。これによって循環依存が発生してしまう。AuthorizerはさらにInteractorsにも依存している。ユニットテストを一つしたいだけなのに、他の多くのライブラリやほいかの開発者のコードが必要になったりする。

依存関係の解消

どのような状況でもどのような状況でもコンポーネントの循環依存を排除して、有向非循環グラフに戻すことが可能。その方法としては以下の二つがよく使われる

  1. 依存性逆転の原則(DIP)を適用する
  2. EntitiesとAuthorizerの2つが依存する新たなコンポーネントを作る

トップダウンの設計

  • コンポーネントの設計をトップダウンで行うことは不可能。
  • コンポーネントの依存関係の図はビルド可能性保守性を見るための地図のようなもの
  • 依存関係の中で最優先に対処すべき問題は変動性の分離。例えばGUIの見た目をちょっと変えるだけで、ビジネスルールに影響を及ぼすようなことはあってはいけない。
  • アプリケーションが成長するにつれて、構成要素の再利用性を考えるようになる。この段階になると、全再利用の原則(CRP)がコンポーネントの構成に影響し始める。もし循環依存が発生すれば、非循環依存の原則を適用する。そして依存グラフは変化しながら成長していく
  • コンポーネントの依存関係をクラス設計の前に決めようとすると大変。共通の閉鎖性は見つかってないし、再利用可能な要素にも気づいていない。間違いなく循環依存を作ってしまう。コンポーネントの依存構造はシステムの論理設計に合わせて育てていくもの。

安全依存の原則(SDP)

安全度の高い方向に依存すること
設計を完全に確定させるのは不可能だけど、閉鎖性共通の原則(CCP)特定の変更以外には影響を受けないコンポーネントを作ることができる。このようなコンポーネントは、変動を見越した設計をしている。変わりうるもんであることを想定している。
変更しやるい設計で作ったモジュールであっても、他のコンポーネントから依存されると、あっという間に変更しづらくなる。安全依存の原則を満たしていれば、手軽に変更できるように作ったモジュールが変更しづらいモジュールから依存されていないことを保証できる。

安全度

安全度とは、変化の頻度とは関係ないということ。
また、辞典によると、安定している、とは簡単には動かせないこと、だそうだ。
これをソフトウェアに当てはめると、コンポーネントを変更しづらくするには、多数のコンポーネントから依存されるようにすればいい。少し変更するだけでも、他のさまざまなコンポーネトとの調整が必要になるから。
xは他のコンポーネントに依存していない、独立コンポーネントと呼ぶ。
xは三つのコンポーネントに対する責務を負っているという。

yは従属コンポーネントと呼ぶ。

  • ファン・イン:依存入力数。この指標はコンポーネントないのクラスに依存している外部のコンポーネント数を表す。
  • ファン・アウト:依存出力数。この指標はコンポーネント内にある、外部のコンポーネントに依存しているクラス数を表す。
  • I(Instability):不安定さ。I = ファン・アウト÷(ファン・イン+ファン・アウト)
    • この指標は、0以上1以下の値になる。 I=0がもっとも安定しているコンポーネントを表し、I=1がもっとも不安定なコンポーネントを表す。
      ファン・インファン・アウトを算出する際には、対象のコンポーネントに含まれるクラスと依存関係にある外部コンポーネントのクラス数を調べる。
      コンポーネントの依存性の方向の順番を辿ると、Iの値は減少していくべきだということになる。

全てのコンポーネントに高い安定度を求める必要はない

全てのコンポーネントが最大限に安定した状態になっているとしたら、そんシステムには手を加えることができない。コンポーネント構造を設計する時には、安定度の高いコンポーネントもあれば、安定度の低いコンポーネントもあるようにしておきたい。

Discussion