CleanCode

[CleanCode] 16장 SerialDate 리팩터링

첫째, 돌려보자

  • 단위 테스트가 다 구현이 되어있는가?

둘째, 고쳐보자

  • 법적인 정보는 필요하기 때문에 라이선스 정보와 저작권은 보존한다
  • 변경이력은 소스 코드 제어 도구가 있으므로 하지 않아도 된다.
  • import 문은 java.text.* *와 java.util.**로 줄인다.
  • Javadoc 주석은 HTML 태그를 사용한다. 그러나 하나의 소스코드에 여러 언어를 사용하는 것은 지양하는 방식이기 때문에 주석 전부를 < pre> 로 감싸는 편이 좋다.
  • 오래된 주석은 고쳐서 개선하기
  • 일반적으로 기반 클래스는 파생 클래스를 모르는 것이 좋기 때문에 추상 팩토리 패턴을 적용한다.

🔹 추상 팩토리 패턴
상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공하는 패턴

public abstract class DayDateFactory {
    private static DayDateFactory factory = new SpreadsheetDateFactory();
    public static viud setInstance(DayDateFactory factory) {
        DayDateFactory.factory = factory;
    }

    protected abstract DayDate _makeDate(int ordinal);
    protected abstract DayDate _makeDate(int day, DayDate.Month month, int year);
    protected abstract DayDate _makeDate(int day, int month, int year);
    protected abstract DayDate _makeDate(java.util.Date date);
    protected abstract int _getMinimumYear();
    protected abstract int _getMaximumYear();

    public static DayDate makeDate(int ordinal) {
        return factory._makeDate(ordinal);
    }

    public static DayDate makeDate(int day, DayDate.Month month, int year) {
        return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(int day, int month, int year) {
        return factory._makeDate(day, month, year);
    }

    public static DayDate makeDate(java.util.Date date) {
        return factory._makeDate(date);
    }

    public static int getMinimumYear() {
        return factory._getMinimumYear();
    }

    public static int getMaximumYear() {
        return factory._getMaximumYear();
    }
}

위 클래스에서 createInstance 메서드를 makeDate라고 좀 더 서술적으로 변경했다.

public class SpreadsheetDateFactory extends DayDateFactory {
    public DayDate _makeDate(int ordinal) {
        return new SpreadsheetDate(ordinal);
    }

    public DayDate _makeDate(int day, DayDate.Month month, int year) {
        return new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(int day, int month, int year) {
        rturn new SpreadsheetDate(day, month, year);
    }

    public DayDate _makeDate(Date date) {
        final GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        return new SpreadsheetDate(
            calendar.get(Calendar.DATE),
            DayDate.Month.make(calendar.get(Calendar.MONTH) + 1),
            calendar.get(Calendar.YEAR));
    }

    protected int _getMinimumYear() {
        return SpreadsheetDate.MINIMUM_YEAR_SUPPORTED;
    }

    protected int _getMaximumYear() {
        return SpreadsheetDate.MAXIMUM_YEAR_SUPPORTED;
    }
}

MINIMUM_YEAR_SUPPORTED와 MAXIMUM_YEAR_SUPPORTED 변수를 적절한 위치인 SpreadsheetDate로 옮긴다.

  • enum을 독자적인 소스파일로 옮기기
  • 주석은 최소화 하는것이 좋다.
  • 적절하게 접근 제어자를 이용
  • 사용하지 않는 변수 제거
  • 추상 메서드를 클래스로 수정
  • 변수가 한 곳에서만 사용될 경우, 사용 위치와 최대한 가깝게 옮긴다.
  • 코드 커버리지를 감소시켰다.

결론

따라서 리팩터링을 통해 테스트 커버리지가 증가시키고, 버그 고치고, 코드 크기를 줄이고 코드를 명확하게 할 수 있다.

  • 처음에 나오는 주석은 너무 오래되었기 때문에 간단하게 고치고 개선했디.
  • enum을 모두 독자적인 소스 파일로 옮겼다.
  • 시간을 투자해서, 보이스카우트 규칙을 따랐다.

참고 링크

Leave a Reply