클린코드 16장

jiwon·2022년 4월 26일
0

클린코드

목록 보기
16/17
post-thumbnail

16장 SerialDate 리팩터링

SerialDate는 날짜를 표현하는 자바 클래스다. 이 장에서는 SerialDate 클래스를 리팩터링한다.

첫째, 돌려보자.

SerialDateTest라는 클래스는 단위 테스트 케이스 몇 개를 포함한다. 돌려보면 실패하는 테스트 케이스는 없지만 살펴보면 모든 케이스를 점검하지 않는다. 그래서 저자는 독자적으로 단위 테스트 케이스를 구현한다. 그러자 경계 조건 오류가 존재하며, 논리적 오류로 인하여 결코 실행되지 않는 코드도 존재한다는 사실이 밝혀진다...해당 오류들을 모두 고쳐 테케를 모두 통과하게 만든 후 리팩터링에 들어가자.

둘째, 고쳐보자.

변경 이력 없애기

이제는 소스 코드 제어 도구를 사용하므로 변경 이력은 없애도 좋다.

import문 줄이기

import 문들을 java.util.* 등으로 합쳐서 줄이자.

javadoc 주석

한 소스코드에 HTML 태그 등을 섞어서 사용하는게 못마땅하다. 차라리 주석 전부를 <pre>로 감싸는 게 좋다.

서술적인 용어 사용하기

클래스 이름이 SerialDate인 이유는 '일련번호(serial number)'를 사용해 클래스를 구현했기 때문이다. 일련번호라는 정확하지 못하다. 차라리 '상대 오프셋(relative offeset)'이 낫다. 아니면 '서수(ordinal)'도 괜찮다. 또한 SerialDate라는 이름은 구현을 암시하는데 실상은 추상 클래스다. 그냥 Date가 더 적절하지만... Date라는 이름은 자바에 이미 너무 많으므로 앞으로는 SerialDate 대신 DayDate라는 이름을 사용한다.

상수 열거형 보다 Enum 사용

MonthConstants 를 상속하고 있는데 static final 상수 모음에 불과하다. Enum으로 바꿔서 사용하자.

serialVersionUID 삭제

이 변수 값을 변경하면 이전 소프트웨어 버전에서 직렬화한 DayDate를 더 이상 인식하지 못한다. 그래서 일단인 이 변수를 없애기로 결정한다.

주석 삭제하기

불필요한 주석들은 자리차지만 한다. 삭제한다.

변수 위치 올바르게 변경

변수들은 이상한 위치에 있지 말고 자신과 관련있는 클래스로 옮겨가야 한다.

기반 클래스와 파생 클래스

일반적으로 부모 클래스는 자식 클래스를 몰라야 바람직하다. 그런데 원본 코드에서는 뭔가 이상하게 꼬여서 이 법칙이 지켜지지 않는다. 이를 고치기 위해 ABSTRACT FACTORY 패턴을 적용해 DayCateFactory를 만들었다.

접근 제한자 변경

굳이 공개할 필요 없는 pulbic 변수들을 private으로 변경한다.

기본 생성자 삭제

기본 생성자는 이제 컴파일러가 기본으로 생성해준다. 필요없으니 삭제하자.

final 키워드 제거

저자는 final 키워드가 코드를 복잡하게 만든다고 주장한다. 저자는 final 키워드가 잡아낼 오류를 다른 방법으로 잡아냈기 때문에, final이 남아있을 필요가 없다. 삭제한다.

중첩 if 문 통합

if 문이 중첩되어 나올 경우 || 등으로 합친다.

플래그 인수 삭제

한 메서드가 다른 메서드를 호출하며 플래그를 넘기는 부분이 있다. 일반적으로 메서드 인수로 플래그 인수는 바람직하지 못하다. 그래서 두 메서드 이름을 변경하고, 단순화하고, Month enum으로 옮긴다.

모호한 이름 바꾸기

코드를 읽는 사람은 addDay(날짜)가 date 변수를 바꾸는 함수라고 생각할 확률이 높다. 이러한 모호함을 해결하기 위해 plusDays 와 plusMonth라는 이름을 선택한다.

테스트 케이스에서만 호출 한다면 제거

테스트케이스에서만 사용되는 메서드가 있었다...테케와 메서드 모두 제거해준다.

결론

우리는 또다시 보이스카우트 규칙을 지켰다. 테스트 커버리지가 증가했으며, 버그 몇 개를 고쳤고, 코드 크기도 줄었고, 코드가 더 명확해졌다. 시간이 걸렸지만 충분히 가치있는 작업이다.

profile
개발 공부합니다. 파이팅!

0개의 댓글