1つのモジュール内の機能のまとまりの強さを示す尺度。
モジュール強度(凝集度)とは、1つのモジュール内の機能のまとまりの強さを示す尺度です。モジュール(=機能ごとに分けたプログラムの部品)の中身が、どれだけ1つの目的に向かってまとまっているかを表します。
中の機能が「同じ目的のためにまとまっている」ほど強度は強く(良く)、「関係のない処理が寄せ集められている」ほど強度は弱く(悪く)なります。凝集度という別名のとおり、中身がどれだけ凝り固まっているか、と考えると分かりやすいです。
身近な例で考えると、引き出しの整理に似ています。1つの引き出しに「文房具だけ」が入っていれば探しやすい(強い強度)のに対し、文房具・薬・電池がごちゃ混ぜだと使いにくい(弱い強度)です。上の図解では、強い順に7段階を並べています。一番上の機能的強度が最も良い状態です。
モジュール強度は、強い順に7段階に分類されます。上ほど良く、下ほど避けたい状態です。
| 順位 | 名称 | 意味 | 評価 |
|---|---|---|---|
| 7 | 機能的強度 | 1つの機能だけを実行 | 良い |
| 6 | 情報的強度 | 同じデータを扱う複数機能をまとめる | 良い |
| 5 | 連絡的強度 | 同じデータを使う処理を順に実行 | 良い |
| 4 | 手順的強度 | 決まった手順で複数処理を実行 | 避けたい |
| 3 | 時間的強度 | 同じ時期に行う処理を集める | 避けたい |
| 2 | 論理的強度 | 似た種類の処理を引数で切り替え | 避けたい |
| 1 | 暗号的強度 | 関係のない処理がたまたま同居 | 避けたい |
それぞれの段階を具体的に見ると次のようになります。
・機能的強度:たった1つの機能だけを実行する理想形(例:消費税を計算する)
・情報的強度:同じデータを扱う複数の機能を1つにまとめたもの
・連絡的強度:同じデータを使う処理を順番に実行する
・手順的強度:決まった手順で複数の処理を続けて実行する
・時間的強度:「起動時」など同じ時期に行う処理を集める(例:初期化処理)
・論理的強度:似た種類の処理を引数(=渡す値)で切り替える
・暗号的強度:関係のない処理がたまたま同居する最も悪い状態
モジュール強度は強い方が良いとされます。その理由は、強度が強いモジュールほど次の利点があるからです。
・役割が明確:1つの目的に絞られているので、何をする部品か一目で分かる
・影響範囲が限定的:修正してもその機能の中で完結し、他に波及しにくい
・再利用しやすい:単機能なので別のプログラムでもそのまま使える
・テストしやすい:確認すべき動作が1つに絞られる
逆に強度が弱いモジュールは、関係のない処理が同居しているため、1か所直すと無関係な機能まで壊れる恐れがあり、理解も再利用も難しくなります。だからモジュール設計では「できるだけ機能的強度に近づける」ことを目指します。
次のテーマである結合度とセットで「強度は強く、結合度は弱く」が良い設計の合言葉です。強度は強いほど良い、結合度は弱いほど良いと、向きが逆である点に注意しましょう。
凝集度が低いモジュール(弱い強度)には、関係のない処理が同居しています。そこで1か所を直すと、なぜ他も壊れてしまうのか。それは同じモジュール内に混在しているため、変数やデータが意図せず共有されているからです。
身近な例で考えると、ごちゃ混ぜの引き出しから1つ取り出そうとすると他のものも引っかかって出てきてしまう状態です。
・修正コストが増える:1か所を直すために他の処理も全部理解し直す必要がある
・バグが隠れやすい:どの処理が何に影響しているか把握しにくい
・再利用できない:使いたい機能だけ切り出せず、不要な処理まで一緒に持ち込まれる
なぜ機能的強度が理想なのか。それは「1つの機能だけ」を担うモジュールは、修正の影響がそのモジュール内で完結するからです。直したいことだけを安心して直せる。それが保守しやすいプログラムの姿です。
凝集度(モジュール強度)と結合度(モジュール結合度)は、プログラムの設計品質を表す対になる2つの指標です。どちらも「モジュール」という部品の良し悪しを測りますが、見ている場所が違います。
・凝集度=モジュールの中身のまとまり。「1つの部品の内部がどれだけ1つの目的に統一されているか」
・結合度=モジュール同士の間のつながり。「2つの部品がどれだけお互いに依存し合っているか」
良い設計の合言葉は「凝集度は強く、結合度は弱く」です。凝集度は強いほど良い(まとまりが高い)、結合度は弱いほど良い(独立性が高い)と、向きが逆であることに注意してください。上の図のように、各モジュールの中身がまとまっていて(凝集度:強い)、かつモジュール同士のつながりが最小限(結合度:弱い)になっている状態が理想です。