南極の図書館

ペンギンが寝ていた…。

「リファクタリング」の完全読破。その8、7章後半

前回に引き続き、7章の後半。
8月に読み終わる予定が、もう10月も中旬に。

委譲の隠蔽(P157)

カプセル化は、唯一のとは言わないまでも、オブジェクト指向技術の鍵である。

class Client... 
  //before
  _manager = john.getDepartment().getManager();
  //after
  _manager = john.getManager();  }


class Person{
  Department _department;
  public void setDepartment(Department arg){
    _department = arg;
  }

  //before
  public Department getDepartment(){
    return _department;
  }
  
  //after  委譲メソッドを作り、getDepartment()は削除する。
  public Person getManager() {
    return _department.getManager();
  }
}

class Department{
  //このクラスはリファクタリング前後で変更なし。
  private Person _manager;
  public Department(Person manager){
    _manager = manager;
  }
  public Person getManager(){
    return _manager;
  }
}
仲介人の除去(P160)

委譲の隠蔽の逆。
隠蔽をどの程度施すのか見極めるのは困難で、システムが変化すればその基準も変化していく。
適当だったカプセル化もしばらくすると扱いにくくなるが、それは悪いことではない。ひたすら直すこと。

外部メソッドの導入(P162)

「利用中のサーバクラスにメソッドを追加する必要があるが、そのクラスを変更できない」場合に行う。


約束は二つ。
作成するメソッドの第一引数は、サーバクラスのインスタンスとする。
決まったコメントをつける。(//外部メソッド;<サーバ名>クラスにあるべき)


コードの例が古すぎてEclipseが全力で取り消し線をつけてくれるんだけど、ここはDateクラスほどいい例が他に浮かばないのでそのまま写経してみた。
当時のDateクラスは、どこのシステムでも自社フレームワークとして拡張してるんじゃないかな。

Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
↓
Date newStart = nextDay(previousEnd);
private static Date nextDay(Date arg) {
//外部メソッド;Dateクラスにあるべき
  return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
}
局所的拡張の導入(P164)

外部メソッドの導入は対象メソッドが2つまで、こちらは3つ以上のときに行う。
サブクラスかラッパーか、どちらでも採用できるが、ファウラーは可能ならば作業の少ないサブクラス化を勧めている。
新クラスには元のオブジェクトを引数とする変換用コンストラクタを作る。サブクラスにしたならsuperで、ラッパーなら委譲フィールドを設定する。
以下はサブクラスの場合の手順で、ラッパーの場合については割愛する。

Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
↓
Date newStart = new MfDate(previousEnd).nextDay();
public class MfDate extends Date{
  public MfDate(String dateString) {
    super(dateString);
  }
  public MfDate(Date arg) {
    super(arg.getTime());
  }
  Date nextDay() {
    return new Date(getYear(), getMonth(), getDate() + 1);
  }
}


次回は8章だけど、先は長い。