リファクタリング

[読書メモ]リファクタリング - フィールドによるサブクラスの置き換え

What? そもそもサブクラスとは?

サブクラスは特性を追加したり、振る舞いを変えたりするために作るもの。
例えば、以下のようなケース。
```.java
abstract class Person {
public abstract String getCode();
public abstract boolean isMale();
}

class Male extends Person {
@Override
public String getCode() {
return "M";
}

@Override
public boolean isMale() {
return true;
}
}

class Female extends Person {
@Override
public String getCode() {
return "F";
}

@Override
public boolean isMale() {
return false;
}
}
```

この場合は、性別によって返すコードを変更するためにサブクラスが使われています。
親クラスにアクセサを定義し、サブクラスごとに異なる値を返しています。

Why?

上記の例では、サブクラスがハードコードされた値をそれぞれ返しています。
これをConstant Methodパターンと言います。

Constant Methodしかないクラスは存在価値が低いです。
Constant Methodで返されるそれぞれの値を親クラスにフィールドを設置することで代替できます。

How?

基底クラス.java
class Person {
  String code;
  boolean isMale;

  private Person(String code, boolean isMale) {
    this.code = code;
    this.isMale = isMale;
  }

  static Person createMale() {
    return new Person("M", true);
  }

  static Person createFemale() {
    return new Person("F", false);
  }
}

// ↓client code
public static void main(String[] args) {
  Person karl = Person.createMale();
}