# モジュール性
## 定義
モジュール性(modularity)とは、関連するコードを論理的にグループ化する編成の原理であり、その単位であるモジュール(module)は「より複雑な構造を構築するために使用できる標準化された部品または独立した単位の各集合」と定義される。モジュールは物理的な分離ではなく論理的な分離のみを意味し、オブジェクト指向言語のクラス集合や構造化言語・関数型言語の関数集合などを指す一般的な用語として使われる。アーキテクトがモジュール性を計測するツールには、凝集度(モジュール内の要素同士の関連度)・結合度(求心性結合・遠心性結合、およびそこから導かれる抽象度・不安定度・主系列からの距離)・コナーセンス(コンポーネント間の変更の連動関係を静的・動的に分類したもの)という3つのキーコンセプトがある。(Source: [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 3 モジュール性]])
## 未解決の問い
- コナーセンスは求心性・遠心性結合をオブジェクト指向向けに再構築したものだが、マイクロサービスのような分散アーキテクチャにおける同期/非同期通信の判断には十分に対処できていない。この現代的な拡張はどのような形を取るか。(Source: [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 3 モジュール性]])
- コードレベルのモジュール性メトリクス(LCOM、抽象度・不安定度・主系列からの距離)は、アーキテクチャレベルの構造評価にどこまで転用できるか。
## 未編纂の観察
- **[定義] 第3章の凝集度・結合度・コナーセンスは、第7章では「デプロイ単位の境界」を定める尺度として使い直される。** 第3章はコナーセンスをモジュール内部の結合を計測するキーコンセプトの1つとして位置づけたが、第7章はこれを発展させ、アーキテクチャクォンタム(高度な機能的凝集性と同期的なコナーセンスを持つ、独立してデプロイ可能なアーティファクト)という単位を定義する。すなわち第3章の「凝集度が高いか」「コナーセントか」という判定基準が、第7章では「どこまでを1つのデプロイ単位に含めるか」という境界線の引き方に転用される。単一データベースを使う従来のモノリシックシステムは定義上1つのクォンタムになる一方、マイクロサービスでは各サービスが独自データベースを持つことで複数のクォンタムに分かれる。(Source: [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 7 アーキテクチャ特性のスコープ]], [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 3 モジュール性]])
- **[未解決の問い] 第7章は、コナーセンスの分散アーキテクチャ向け拡張として「動的なコナーセンス」を同期的・非同期的に分ける形で答えている。** 第3章の未解決の問いは「コナーセンスがマイクロサービスの同期/非同期通信の判断に十分対処できていない」という点だったが、第7章はこれを正面から扱い、同期呼び出しの動的なコナーセンス(呼び出し元が呼び出し先を待つことで運用特性が揃う必要が生じる)と非同期呼び出しの動的なコナーセンス(ファイア・アンド・フォーゲットにより運用特性をサービスごとに使い分けられる)を区別する。ただし、この区別はアーキテクチャクォンタムの境界を引くための基準であり、コードレベルのコナーセンス計測手法そのものを更新するものではない。(Source: [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 7 アーキテクチャ特性のスコープ]], [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 3 モジュール性]])
## 関連
- source: [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 3 モジュール性]] / [[@2022__OReillyJapan__ソフトウェアアーキテクチャの基礎 - Chapter 7 アーキテクチャ特性のスコープ]]
- 概念: [[疎結合のアーキテクチャ]]
## 出典
- Mark Richards, Neal Ford 著, 島田浩二 訳, *ソフトウェアアーキテクチャの基礎*, オライリー・ジャパン, 2022, 第 3 章.