2つのシステムの依存の種類

あるシステムsysAから別のシステムsysBの機能を利用するとき、sysAはsysBに依存していると呼び、2つのシステムにおいてどちらか一方向または双方向に依存しているとき、それらのシステムは結合していると呼ぶことにする。

で、2つのシステムの依存を考えると、依存と言ってもいくつかの種類が考えられる。オブジェクト間でも同様なので、Javaを例に考えると、以下の3種類に分けられる。

  • 定義依存
    • 静的モデルの定義にのみ利用される依存
    • インタフェース継承
    • アノテーション
  • 限定的振舞い依存
    • 結合がなくてもクラスオブジェクトは状態を維持できる可能性がある依存
    • メソッド内で一時的に利用されるオブジェクト
    • オプション的に用意されたコンストラクタに渡すオブジェクト
  • 非限定的振舞い依存
    • 結合がなければクラスオブジェクトは状態を維持できない依存
    • 委譲
    • クラス継承

impliments宣言はメソッドの存在を保証する宣言でしかないので、実装クラスの振舞いそのものを保証する依存関係ではない。interface Iを考えた場合、Iを定義した意図として以下のような振舞いがあったとしても、インタフェース定義そのものにはなにも関係がない。特定の振舞いを期待するのであれば抽象クラスにするか、BDD的に振舞いを別に定義すべきである。

 I i = createI();
 i.setHoge("ほげ");
 assertEquals("ほげ", i.getHoge());


結合の強さ = 依存の強さ * 依存の数 と考えると、システム間の結合の強さの測定が可能となる。

今日の結論

…みたいな話ってどこかにないんでしょうかw