# コナーセンス

コナーセンスの強度を弱く、程度を小さく、局所性を小さくしましょう。コナーセンスとは、モジュール間の結合を強度、程度、局所性の3つの軸で分類する方法です。
処理によっては強いコナーセンスにせざるを得ない場合がありますが、その場合は程度を小さくしたり、局所性を小さくしたりしましょう。また、パッケージの分割などで局所性が大きくなる場合は、強度を弱くしたり程度を小さくしたりしましょう。変更の影響範囲を小さくすることができます。

# 強度

コナーセンスの強度とは、モジュール間の結合の強さの度合いです。

以下の種類があります。上のものほど弱いコナーセンスです。

  • 名前のコナーセンス (Connascence of Name)
    • モジュール同士が同じ名前に依存するコナーセンス
    • 変数名やメソッド名など
  • 型のコナーセンス (Connascence of Type)
    • モジュール同士が同じ型に依存するコナーセンス
    • 動的型付け言語で型を指定していない場合など
      • 型を指定すると名前のコナーセンスになります
  • 意味のコナーセンス (Connascence of Meaning)
    • モジュール同士が同じ値の意味に依存するコナーセンス
    • マジックバリュー、例外時の汎用エラー型やnull、特定の概念を表すプリミティブ型の値など
    • 定数にしたり専用の型にすると名前のコナーセンスになります
  • 位置のコナーセンス (Connascence of Position)
    • モジュール同士が同じ値の順序に依存するコナーセンス
    • リスト内の値の順序や関数の引数の順序など
    • 構造体にすると名前のコナーセンスになります
  • アルゴリズムのコナーセンス (Connascence of Algorithm)
    • モジュール同士が同じアルゴリズムに依存するコナーセンス
    • 暗号化と復号、エンコードとデコード、バリデーションルールなど
  • 実行のコナーセンス (Connascence of Execution)
    • モジュール同士が同じ実行の順序に依存するコナーセンス
    • 特定の状態のときにのみ実行できる関数や、先にファイルを開く関数を実行する必要がある関数など
  • タイミングのコナーセンス (Connascence of Timing)
    • モジュール同士が処理の実行タイミングに依存するコナーセンス
    • 特定の時刻に実行される処理など
  • 値のコナーセンス (Connascence of Values)
    • モジュール同士がそれぞれの値を同時に変更させる必要があるコナーセンス
    • 複数のモジュールが同じマジックバリューや初期値をそれぞれ持っている場合など
    • 共通の定数にすると名前のコナーセンスになります
  • 同一性のコナーセンス (Connascence of Identity)
    • モジュール同士が同じインスタンスに依存するコナーセンス
    • DBコネクションやシングルトンなど

# 程度

コナーセンスの程度とは、結合しているモジュールの数の多さです。

# 局所性

コナーセンスの局所性とは、結合しているモジュールの位置の近さです。たとえば同じパッケージ内、ディレクトリ内、ファイル内などによってそれぞれ局所性が異なります。

NOTE

✏️ コナーセンスの強度を弱く、程度を小さく、局所性を小さくする

# 関連

# 凝集度 / 結合度

コナーセンスの強度を弱くすると凝集度が高くなったり結合度が低くなったりします。