この記事のゴール
モジュール、サブシステム、コンポーネントの一般的な区別の仕方を紹介する
前提
残念ながら、ITコミュニティの中での唯一の普遍的な概念の定義はないそうです。
なので、プロジェクトごとに言葉の定義を確認するしかありません。
とはいえ、デフォルトでの言葉のイメージを持つことは有用だと思われます。というのも、何もイメージがなければ、言葉を見た時に混乱してしまうからです。何かデフォルトがあることで、既知の意味のまま解釈するか、あるいは少しずらすか、を考えられると思います。
というわけで、多くの人に受け入れられる意味の違いを以下に紹介します。
ご存じと思うが、境界には論理的な境界と物理的な境界がある。
これは、物理的には同じだとしても論理的には区別されるというケースがあることを意味する。
モジュール
- コードの集合
- OOPの文脈ならそれはクラスの集合。関数型言語なら関数の集合。
- コードはもちろんランダムに集めて集合にするわけではない。論理的に集める。
- 集合の間の境界は論理的なものであり、物理的な境界に対応しているとは限らない。
サブシステム
- モジュールの集合
モジュールの特徴を考えてみる
-
モジュールにとサブシステムに共通の要素は?
- モジュールと同様、論理的に集める。そのため、サブシステム間の境界は物理的な境界と対応づいているとは限らない。
- こんな概念を作って何が嬉しいのかというと、保守性を高めるため。
-
モジュールには無くて、サブシステムのみにある要素は?
- サブシステムは論理レイヤーに対応する。例えば、プレゼンテーション層やアプリケーション層など。
- だから、アプリ内の役割のスケールで比較すると、サブシステムはモジュールより大きい。
- あるいはDDD(ドメイン駆動設計)におけるコンテキスト境界のためのラッパー。
コンポーネント
- 物理的なパッケージ
- 例えば、ウェブサーバー、アプリケーションサーバー、コンテナ。Javaでいうjars。