クリーンアーキテクチャーのコンポーネント凝縮性を解説!

設計

コンポーネントとは?

まず、「コンポーネント」とは、ソフトウェアを構成する独立した部品のことを指します。
具体的には、1つまたは複数のクラスやモジュールのまとまりであり、再利用性や保守性を高めるために設計されています。

例として、以下のような機能を持つシステムを考えます

  • ユーザー認証
  • メール送信
  • データ分析

これらの機能をそれぞれ「コンポーネント」として分けることで、独立性を持たせ、システム全体をシンプルに管理できるようにします。

クリーンアーキテクチャーにおける「凝縮性」とは?

コンポーネントを設計する際、重要なのは「凝縮性(Cohesion)」です。凝縮性とは、コンポーネント内の要素(クラスやモジュール)がどれだけ強く関連し合っているかを指します。

凝縮性が高いコンポーネントは、以下のような特徴を持っています

  • 同じ目的を持つクラスやモジュールがまとまっている。
  • 変更の理由が共通している。

例:認証コンポーネント

  • ユーザー認証
  • パスワード検証
  • トークンの発行

これらは全て「認証」に関連しているため、1つのコンポーネントとして凝縮性が高い状態です。

コンポーネント凝縮性に関わる3つの原則

コンポーネント凝縮性には下記3原則が存在します。

再利用等価の原則(REP)

再利用されるコードは、独立してリリース可能であるべき」という原則です。

  • ポイント: 再利用するコードは、関連するクラスやモジュールだけを含むべきです。他の不要なコードを取り込まないようにします。
  • 例:認証コンポーネントがデータ分析機能を含んでしまうと、再利用が困難になります。
再利用等価の原則(REP)を簡単解説!
再利用等価の原則(REP)の基本を初心者向けに解説!背景、メリット、具体例、課題、実践的な対策をわかりやすく紹介します。

閉鎖性共通の原則(CCP)

同じ理由で変更されるコードは、1つのコンポーネントにまとめるべき」という原則です。

  • ポイント: 変更の理由が異なるコードを同じコンポーネントに含めると、1箇所を修正するたびに他の無関係な部分にも影響が出ます。
  • 例:メール送信機能が認証コンポーネントに含まれていると、認証ロジックを変更したときにメール送信部分にも影響が出る可能性があります。
CCPとは?閉鎖性共通の原則を解説!
閉鎖性共通の原則(CCP)を初心者向けに解説!考え方の背景、メリット、具体例、課題、SRPとの関係をわかりやすく説明します。

全再利用の原則(CRP)

コンポーネント内のクラスは、すべて一緒に再利用されるべき」という原則です。

  • ポイント: 同じコンポーネント内のクラスは、必ず一緒に使われるように設計します。再利用されないクラスを混ぜると、無駄な依存関係が増えてしまいます。
  • 例:認証機能に関係のないレポート生成クラスが含まれていると、そのモジュールを使うたびに不要な依存関係が増えます。
全再利用の原則(CRP)をわかりやすく解説
全再利用の原則(CRP)の基本を初心者向けに解説!背景、メリット、具体例、課題、ISPとの関係をわかりやすく紹介します。

凝縮性のテンション図

コンポーネントの設計では、以下の3つの原則が互いにテンション(対立関係)を持っています

  1. REP(再利用等価の原則)
    • 再利用性を最大化するためには、関連性のあるコードをまとめる必要があります。
  2. CCP(閉鎖性共通の原則)
    • 変更の理由が同じものを1つのコンポーネントにまとめる必要があります。
  3. CRP(全再利用の原則)
    • 同じモジュール内のクラスは、すべて一緒に再利用されるようにする必要があります。

テンション図を説明

  • REPとCCPの対立
    再利用性を高めるために多くの機能を1つにまとめすぎると、変更の理由が複数になり、閉鎖性共通の原則を壊してしまいます。
  • CCPとCRPの対立
    変更の理由でモジュールを分割すると、クラス間の関連性が薄れて、全再利用の原則が守れなくなることがあります。
  • CRPとREPの対立
    再利用性を重視しすぎると、モジュールに多くのクラスが含まれる可能性があり、クラス間の凝縮性が失われます。

解決策:
これらのテンションを考慮しながら、バランスを取ることが重要です。小さすぎず、大きすぎない適切なコンポーネントサイズを見極めましょう。

まとめ

  • コンポーネント凝縮性とは: コンポーネント内のクラスが強く関連し合い、一緒に変更され、一緒に再利用されるべきという考え方です。
  • テンション図: 原則同士が対立する場面を理解し、プロジェクトによって最適なバランスを見つけることが重要です。

コメント

タイトルとURLをコピーしました