オブジェクト指向プログラミング十戒 2 コピー&ペーストして作成しない


 

2 コピー&ペーストして作成しない

似たようなコードになったら、それをメソッドやクラスとして抽出できないかを検討する。コピー&ペーストした部分に改修があると、いくつものクラスやメソッドを修正することになる。

RoundBrackets.java
public class RoundBrackets { private char ch; public RoundBrackets() {} public RoundBrackets(char ch) { this.ch = ch; } public void display() { System.out.print("("); for (int i = 0; i < 5; i++) System.out.print(ch); System.out.println(")"); } }
SquareBrackets.java
public class SquareBrackets { private char ch; public SquareBrackets() {} public SquareBrackets(char ch) { this.ch = ch; } public void display() { System.out.print("["); for (int i = 0; i < 5; i++) System.out.print(ch); System.out.println("]"); } }

文字を5回繰り返して () で囲んで表示するクラスがあったので、それをコピーして [] で囲むクラスを作成しました。

ただ、繰り返し回数が変わるなど処理が変わったときは、コピーして作成したクラスをすべて修正しなければならなくなります。

AbstractBrackets.java
public abstract class AbstractBrackets { private char ch; protected char openingBracket; protected char closingBracket; public AbstractBrackets() {} public AbstractBrackets(char ch) { this.ch = ch; } public void display() { System.out.print(openingBracket); for (int i = 0; i < 5; i++) System.out.print(ch); System.out.println(closingBracket); } }
RoundBrackets.java
public class RoundBrackets extends AbstractBrackets { public RoundBrackets(char ch) { super(ch); openingBracket = '('; closingBracket = ')'; } }
SquareBrackets.java
public class SquareBrackets extends AbstractBrackets { public SquareBrackets(char ch) { super(ch); openingBracket = '['; closingBracket = ']'; } }

共通する主要な機能をスーパークラスに組み込み、
異なる機能をサブクラスに組み込みます。