職場でポリモーフィズムを利用したコードにお目にかかったのでメモ。
良いところ
- 修正がしやすい。実装クラスの追加だけで済んだ。
- 既存クラスの変更が少ない
- コードが共通化される
新しい実装クラス(子クラス)を作るだけなので修正がしやすかった。
既存クラスの変更部分は実装クラスと実行クラスを呼び出すだけで変更点が少ない。
今までは変更をする時にif文を加えてこねくり回しがちだったけど、そういうのが必要なくきれいに収まった。
また、共通クラスの継承が必要なのでそのクラスのお作法に沿った書き方になる。
そのため1つ理解すれば他のコードも基本は同じなのでわかりやすい。
独自の謎コードを阻止できるのも良さげ。
悪いところ
- 理解が難しい
これは慣れの問題な気もするけど理解に時間がかかった。
処理を追いかけていくと共通クラスに行き着くんだけど、実装クラスを見に行かないと何してるかわからない。
あとデバッグモードで処理を追う時にあちこちに飛ばされてよくわからなくなってくるなど。
サンプル
package jouseki.tataisei; //共通クラス public abstract class AbstractCsvCreator { public abstract void outputCsv(); }
package jouseki.tataisei; //実装クラスA public class CsvCreatorA extends AbstractCsvCreator{ @Override public void outputCsv() { System.out.println("outputA"); } }
package jouseki.tataisei; //実装クラスB public class CsvCreatorB extends AbstractCsvCreator{ @Override public void outputCsv() { System.out.println("outputB"); } }
package jouseki.tataisei; //実行クラス public class ExecuteOutputCsv { public ExecuteOutputCsv(AbstractCsvCreator creator) { creator.outputCsv(); } }
package jouseki.tataisei; //Mainクラス public class MainTattaisei { public static void main(String[] args) { //実装クラス呼び出し AbstractCsvCreator a = new CsvCreatorA(); AbstractCsvCreator b = new CsvCreatorB(); //実行クラス呼び出し new ExecuteOutputCsv(a);//outputA new ExecuteOutputCsv(b);//outputB } }
今回のお仕事では、実装クラスCを新たに追加。
共通クラスは変更なし、Mainクラスでは実装クラスと実行クラスの呼び出しのみ追加。
まとめ
修正がきれいにできると気持ち良いなあという感想w
これはAdapterパターンに近い感じなのだろうか。
こういう設計なら変更が重なってもifやforが入り組んだ魔窟になりにくく、読みやすいコードが維持される。
素晴らしい!