Skip to content

Clean Architecture オープン・クローズドの原則

  • ソフトウェアの構成要素は拡張に対しては開いていて、修正に対して閉じていなければならない。

 言い換えれば、ソフトウェアの振る舞いは、既存の成果物を変更せずに拡張できるようにすべきである、ということ。

コンポーネントの関係は単方向

 コンポーネントAがコンポーネントBの変更から保護されるべきならば、コンポーネントBからコンポーネントA併存すべきである。

 ここでは、Presenterを変更した時に、Controllerを変更する必要をなくしたい。Viewsを変更した時に、Presenterを変更する必要をなくしたい。他のすべてを変更したときに、Interactorを変更する必要をなくしたい。

 オープン・クローズドの原則(OCP)に最も適しているのは、Interactorである。DatabaseControllerPresenterViewを変更しても、Interactorには何の影響も及ぶさない。

Interactorが特権的な位置づけになるのは、ビジネスルールを含んでいるからである。Interactorは、アプリケーションの最上位レベルの方針を含んでいる。その他のコンポーネントは、周辺にある関心事を処理。Interactorは、その中心となる関心事を処理。

Controllerは、Interactorの周辺にある関心事だが、その一方でPresenterViewに対しては中心点な位置づけになる。Presenterも、Controllerに対しては周辺的だが、Viewに対しては中心的な位置づけになる。

Interactorは最上位レベルの概念なので、最も保護される。Viewは最下位レベルの概念なので、保護レベルは最も低くなる。Presenterは、Viewよりも上位にあるが、ControllerInteractorよりも下位レベルにある概念。

 これが、アーキテクチャレベルにおけるオープン・クローズドの原則(OCP)。アーキテクトは、いつどのような理由でどのように変更するかを考えて機能を分割する。そして、分割した機能をコンポーネントの階層構造にまとめる。上位レベルにあるコンポーネントは、下位レベルのコンポーネントが変更されたとしても、変更する必要はない。

情報隠蔽

Controllerへの変更がInteractorに影響を及ぼさないようにすることが最優先だが、ControllerもまたInteractorの変更から保護しておきたいので、Interactorの内部を隠蔽している。

まとめ

 オープン・クローズドの原則(OCP)は、システムのアーキテクきゃの隠れた原動力。目的は、変更の影響を受けずにシステムを拡張しやすくすること。目的を達成するために、システムをコンポーネントに分割して、コンポーネントの依存関係を階層構造にする。そして、上位レベルのコンポーネントが下位レベルのコンポーネントの変更の影響を受けないようにする。