モジュールの凝集度を高く保つ
1. 原則
モジュールの凝集度は高く保て
- モジュールの凝集度は高く保たれなくてはならない
- モジュールの凝集度が高いとは、モジュールが提供する機能(=関数/メソッド)が単機能(またはそれに近い)状態を指す
2. 根拠
凝集度が低いモジュールは保守が困難
- 凝集度が高いモジュールは、モジュールの責務が明確である
- 責務が明確なモジュールは頑健性・信頼性・保守性に優れる
- 逆に、責務が曖昧なモジュール(=凝集度の低いモジュール)は頑健性・信頼性・保守性が低い
3. 指針
モジュールが担う仕事は1つに限定する
4. 注意
参考資料
Appendix-1 モジュールの凝集度の一覧
機能的凝集
- 単一の処理のみを行っている
- 保守性、テスト容易性の観点から見ると最良の状態
逐次的凝集
- 複数の処理がまとめられている
- ある処理の出力が次の処理の入力になっている
- 処理の順序に意味がある
通信的凝集
- 複数の処理がまとめられている
- 処理の間で同じデータを共有する
- 処理の順序に依存しない(順番が前後しても構わない)
手続き的凝集
- 複数の処理がまとめられている
- 処理は特定の順序で実行される
- 処理間でデータの共有はしない
時間的凝集
- 特定のタイミングで実行される複数の処理がまとめられている
- 処理の順序に依存しない(順番が前後しても構わない)
- 処理間でデータの共有はしない
論理的凝集
- 論理的に似たような処理がまとめられている
- 制御フラグなどでどの処理が実行されるか決定される
- 処理間でデータの共有をしたりしなかったりする
偶発的凝集
- 関係の無い処理がまとめられている
- データ共有や処理の順序の関連性も無い
- どのように実装するのかはよくわからない
Appendix-2 情報的凝集
- モジュールの機能は1つのデータに対する操作だけを提供している
- 概ねクラスを指す
- ↓の
MyClass
はself.value
に対する機能だけを提供している
class MyClass:
def __init__(self, value):
self.value = value
def exec(self):
print(self.value)
Appendix-3 凝集度のスコープ
- パッケージ/コンポーネントの凝集度
- クラス/サブルーチンライブラリとしての凝集度
- 関数/メソッドの凝集度