[Refactoring] 일반화 처리

일반화 처리

필드 상향

메서드 상향

생성자 내용 상향

메서드 하향

필드 하향

하위클래스 추출

하위클래스 추출

상위클래스 추출

상위클래스 추출

인터페이스 추출

계층 병합

템플릿 메서드 형성

템플릿 메서드 형성

수정전

public class Customer {
    public String statement() {
        return new TextStatement().value(this);
    }
    public String htmlStatement() {
        return new HtmlStatement().value(this);
    }
}
public class HtmlStatement {

    public String value(Customer customer) {
        int multiply = 10 * 8;
        String result = "HtmlStatement : 고객님 대여 기록";

        for (int i = 0; i < 6; i++) {
            result += "누적 포인트 HtmlStatement";
        }
        result += "누적 대여료 HtmlStatement";
        return result;
    }

}
public class TextStatement {

    public String value(Customer customer) {
        int multiply = 10 * 8;
        String result = "TextStatement : 고객님 대여 기록";

        for (int i = 0; i < 6; i++) {
            result += "누적 포인트 TextStatement";
        }
        result += "누적 대여료 TextStatement";
        return result;
    }

}

수정 후

public class Customer {
    public String statement() {
        return new TextStatement().value(this );
    }
    public String htmlStatement() {
        return new HtmlStatement().value(this );
    }
}
public abstract class Statement {
    public abstract String headerString();
    public abstract String eachString();
    public abstract String footerString();

    public String value(Customer customer) {
        int multiply = 10 * 8;
        String result = headerString();

        for (int i = 0; i < 6; i++) {
            result += eachString();
        }
        result += footerString();
        return result;
    }
}
public class HtmlStatement extends Statement{

    @Override
    public String headerString() {
        return "HtmlStatement : 고객님 대여 기록";
    }

    @Override
    public String eachString() {
        return "누적 포인트 HtmlStatement";
    }

    @Override
    public String footerString() {
        return "누적 대여료 HtmlStatement";
    }
}
public class TextStatement extends Statement{

    @Override
    public String headerString() {
        return "TextStatement : 고객님 대여 기록";
    }

    @Override
    public String eachString() {
        return "누적 포인트 TextStatement";
    }

    @Override
    public String footerString() {
        return "TextStatement : 고객님 대여 기록";
    }
}

상속을 위임으로 전환

위임을 상속으로 전환