LoginSignup
0
1

More than 5 years have passed since last update.

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

Posted at

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();
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1