前回、モジュールに分けること自体は目的ではないと述べました。 良い分け方とはどういうものか。物差しは 2 つあります。
結合度(モジュール間の関係) ── 低いほど良い
モジュールどうしがどれだけ強く結びついているか。
結びつきが強いと、片方を直すともう片方も直すことになります。
強度(凝集度)(モジュール内の関係) ── 高いほど良い
1 つのモジュールの中の機能どうしが、どれだけ関連しているか。
関連の薄いものを詰め込むと、何のためのモジュールか分からなくなります。
目指すのは「低結合・高強度」。
| 段階 | 名前 | 内容 | 評価 |
|---|---|---|---|
| ① | 内容結合 | あるモジュールが、他のモジュール内部の構成要素を直接参照・変更できる。GoTo 文で他の内部へ飛ぶなど | 結合度が高い (好ましくない) |
| ② | 共通結合 | 複数のモジュールが共通の大域データを参照する | ↑ |
| ③ | 外部結合 | 共通の外部データ項目を参照する(必要なものだけを共有) | |
| ④ | 制御結合 | 相手の処理内容を指示する制御情報(フラグなど)を引数で渡す | |
| ⑤ | スタンプ結合 | データ構造(レコード全体など)を引数で渡す。相手は一部しか使わない | ↓ |
| ⑥ | データ結合 | 必要なデータ項目だけを引数で渡す | 結合度が低い (好ましい) |
覚え方。下から順に
データ → スタンプ → 制御 → 外部 → 共通 → 内容。
「必要なものだけ渡す」がいちばん良く、
「相手の中身に手を突っ込む」がいちばん悪い、という並びです。
制御結合が中ほどにある理由は、フラグを渡すと
「呼ぶ側が、呼ばれる側の中の分岐を知っている」ことになるからです。
呼ばれる側の作りを変えると、呼ぶ側も直すことになります。
1 つのモジュール内の機能どうしの関連性を表します。
| 段階 | 名前 | 内容 | 評価 |
|---|---|---|---|
| ① | 暗号的強度 | 関連のない処理を、理由なくまとめただけ | 強度が低い (好ましくない) |
| ② | 論理的強度 | 似た種類の処理をまとめ、引数でどれを行うか選ぶ | ↑ |
| ③ | 時間的強度 | 同じ時期に実行される処理をまとめた(初期化処理など) | |
| ④ | 手順的強度 | 決まった手順で順に実行される処理をまとめた | |
| ⑤ | 連絡的強度 | 手順的強度に加えて、処理どうしが同じデータをやりとりする | ↓ |
| ⑥ | 機能的強度 | ひとつの機能だけを果たす | ↓ |
| ⑦ | 情報的強度 | 同じデータ構造を扱う複数の機能を、その入口ごとにまとめた | 強度が高い (好ましい) |
情報的強度が最上位である理由。
「あるデータ構造を扱う操作を、そのデータと一緒にまとめる」という考え方は、
第9回で扱うオブジェクト指向のカプセル化そのものです。
データとそれを操作する手続きを一体にすれば、
データの表現を変えても影響が内側に閉じます。
結合度・強度の議論は、そのままオブジェクト指向へつながっています。