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の内部構造を熟知していなければならない。

使用される側のコードを変更したときに、思わぬ影響が起きる。