コナーセンス(Connascence) とは
コナーセンスとはコードの変更容易性に着目した結合度の測り方です
Meilir Page-Jones により提唱され、1995年に著書「What Every Programmer Should Know About Object-Oriented Design」で紹介されました
コナーセンスにはコードの結合性を評価する3つの尺度があり、強度、程度、局所性で表されます
3つの尺度について順に見ていきます
コナーセンスの強度
コナーセンスにはいくつかのタイプがあります
強いコナーセンスは修正が難しかったり、コナーセンスの発見が難しかったりして、変更コストが高いものをいいます
以下にコナーセンスの弱い順からコナーセンスのタイプを並べてみます
順序は厳密なものではなく、目安となります
名前のコナーセンス
変数名やメソッド名などの名前による参照のことです
例としてメソッドを呼び出すコードがある時、メソッド名を変更した場合は、合わせて呼び出し元のコードを全て修正する必要があります
型のコナーセンス
型による結合のことです
静的な型を持つ変数を宣言して、代入操作を行うコードがあるとき、変数の型を変えると、代入部も変更する必要があります
意味のコナーセンス
特定なプリミティブの値に意味を持たせており、複数のコンポーネントで意味を共有している状態です
いわゆるマジックナンバーです
マジックナンバーの値を変えるのは変数名を変えるよりも変更コストが高いです
位置のコナーセンス
引数の位置を共有している状態です
メソッドを呼び出すときに、何番目にどう言った意味の情報が入っているかを知っている必要がある状態です
アルゴリズムのコナーセンス
他のコンポーネントがどういうアルゴリズムを用いているか知っている必要がある状態です
エンコード、デコードのプログラムがある時、デコード側のプログラムがエンコード側のプログラムのアルゴリズムを知っている必要があるような状態を指します
実行順序のコナーセンス
他のコンポーネントの実行順序を知っている必要がある状態です
例えば createメソッドと save メソッドがあるときに、createメソッドを実行してからでないと save メソッドが実行できないというような場合を指し、順序関係に暗黙な依存があるという状態です
タイミングのコナーセンス
他のコンポーネントの実行タイミングを知っている必要がある状態です
create メソッドと saveメソッドがあるときに、save メソッドは create メソッドを呼び出してから少なくとも10秒後以降でないと呼び出せないというような状態をさします
値のコナーセンス
アイデンティティのコナーセンス
コナーセンスの程度
関連するコンポーネントの数です
あるクラスを使用するクラスが10クラスの場合と、100クラスの場合とでは、100クラスの方がコナーセンスの程度が大きくなります
コナーセンスの局所性
コナーセンスのある2つのコンポーネントが近い場所にあるか遠い場所にあるかということです
コナーセンスのある2つのコードが同じクラス内にある場合に比べ、別のクラス、別のプロジェクト内にある場合は、遠い場所にあるため、コナーセンスの局所性は大きくなります
コナーセンスをプログラムにどう活用できるか?
コナーセンスの3つの軸の定義から、コナーセンスの強度が低い、程度が低い、局所性が小さいコードを目指せばいいことになります
コナーセンスの強度を低くする
意味のコナーセンス
マジックナンバーを避けるために、列挙型を定義してマジックナンバーを使用する複数のコードから参照することで、コナーセンスの強度を低くすることができます
位置のコナーセンス
引数や配列の順番に特定の意味がある場合には、引数や配列の中身を構造体で定義して、プロパティを参照することにより、順序を知っている必要がなくなります
コナーセンスの局所性を小さくする
関連する処理を一箇所にまとめるなどの設計上の考慮をすることで局所性を小さくすることができます
以上、コナーセンスについて調べてまとめてみました
コナーセンスの概念を活用して、結合度が低く、変更容易性の高いプログラムを書き、プログラムの品質を上げていきたいです
参考文献
- Meilir Page-Jones. What Every Programmer Should Know About Object-Oriented Design. 1995. Dorset House
- fujiharuka. 結合度の尺度「コナーセンス」とは何か.
- snoozer05. Connascence:コードの結合度を測るもうひとつの指標.
- morifuji. コナーセンス(Connascence)について調べてみた.