CODE COMPLETE 上 第5章 コンストラクションにおける設計 5.3.7疎結合の維持
5.3.7疎結合の維持
結合度
クラスやルーチーンが他のクラスやルーチーンとどれだか結びついているかを表す。
良いモジュール間結合とは、あるモージュールが他のモジュールから簡単に使用できるくらい弱い(疎)結合であること。
他のモジュールに依存しないモジュールを作成しよう!
恋人同士ではなく、職場の冷めた関係くらいがちょうどいい。
結合の基準
モジュール間結合を評価する際の基準について紹介
サイズ
モジュールのインターフェイスが小さいほど良い。
使用するモジュールの引数は1つの方が6つより良い。
使用するクラスのパブリックルーチーンは4つの方が40個より良い。
可視性
2つのモジュール間結合が目に見えるということ。
グローバルデータを使うのはやめておきなさい。
柔軟性
モジュール間の結合はシンプルな方がいい。半田ごてと銅線を使うより、USBで接続できるぐらいがいい。
社員に与える休暇日数を雇用期間と職種情報から計算するLookupVacationBenefit()があるとする。
それとは別のモジュールが雇用日数と職種情報を持つemployeeオブジェクトを持ってて、LookupVacationBenefit()にemployeeオブジェクトを渡す設計だったとする。
もしemployeeオブジェクトを持ってないモジュールがLookupVacationBenefit()を使いたくなったらどうする?
無理やりemployeeオブジェクトを作る?
それより、LookupVacationBenefit()に雇用日数と職種情報の二つの引数を渡す様な設計の方が柔軟だ。
結合の種類
単純パラメータ結合 ←OK
ルーチーンの引数が全て基本的なデータ型のみ。
単純オブジェクト結合 ←OK
モジュール内でオブジェクトをインスタンス化すする場合。
オブジェクトパラメータ結合 ←あかんやつ
オブジェクト1がオブジェクト2を受け取る。
オブジェクト2の内部について知らなければならい。
セマンティック結合 ←あかんやつ
最も油断ならない結合。あるモジュールが別のモジュールのセマンティクス(一部の機能)を使用する場合に生じる。
例えば、モジュール1が制御フラグをモジュールに2に渡して、モジュール2ないの挙動を指示する。これはモジュール2の内部構造を熟知していなければならない。
使用される側のコードを変更したときに、思わぬ影響が起きる。