エンジニアリングとお金の話

都内で働くエンジニアの日記です。

システム設計の原則5

【SPONSORED LINK】

システム設計の原則の感想5

区分ごとのクラスを同じ型として扱う

区分ごとにクラスを分けるとロジックの整理はしやすくなるが、クラスを使う側は各区分クラスの型を意識しなければならなくなる。この問題を解決するためにインタフェースを活用する。

インタフェースFeeを実装した区分クラス

interface Fee{
  Yen yen();
  String label();
}


class AdultFee impliements Fee{
  Yen yen(){
    return new Yen(100);
  }

  String label(){
    return "大人"
  }
}

class ChildFee implements Fee {
  Yen yen(){
    return new Yen(50);
  }

  String label(){
    return "子供";
  }

}

オブジェクトを生成する時はFee型をコンストラクタに設定する

class Charge {
  Fee fee;
  Charge(Fee fee){
    this.fee = fee;
  }
  
  Yen yen(){
    return fee.yen();
  }
}

コンストラクタに渡すクラスによりChargeクラスの振る舞いが変わるのでif文による条件分岐が不要となる。なお、インタフェース宣言と区分ごとのクラスを組み合わせて、区分ごとに異なるクラスのオブジェクトを同じ型として扱うしくみを多態と呼ぶ。