[Clean code] chapter 16. SerialDate 리팩토링
내용
둘러보자
코드의 이해와 리팩토링을 하기 전 가장 첫번째로 테스트가 얼마나 되는지 확인했다.
SerialDate 같은 경우 테스트 커버리지가 50% 정도 되었다.
해당 테스트를 통해서 커버리지가 얼마나되는지 확인했고 테스트를 하지 않거나 부실한 테스트를 추가했다.
그러면서 자신이 통과해야될 것 같은 경우도 같이 확인할 수 있었다.
고쳐보자
쓰잘데기 없는 주석을 지워버리기 (p.347)
라이센스 정보, 저작권 과 같은 경우 필요하다.
하지만 작성자, 변경 이력과 같은 경우는 소스 코드 관리 툴을 이용하게 되면 가볍게 무시할 수 있다.
- 변수에 대해서 역사와 의미를 남기는 주석은 좋은 주석이다. (p.350)
const int EARLIEST_DATE_ORDINAL = 2; // 1/1/1900 const int LATEST_DATE_ORDINAL = 3344231; // 12/31/9999
클래스와 함수의 기능을 명확하게
추상 클래스에 있는 변수가 오직 하나의 클래스에서만 사용한다면 그것은 옮기는 것이 좋을 것이다.
그것을 통해 해당 변수와 그 변수를 사용하는 거리가 좁아지고 실제 코드를 이해하는 도움이 될 것이다.
Naming
INCLUDED_NONE
, INCLUDE_FIRST
, INCLUDE_SECOND
, INCLUDE_BOTH
이런 변수명이 있다.
해당 변수명은 포함되어 있는 범위를 나타내고 수학에서는 어느 특정 범위에 있는가에 대한 것과 일치한다.
해당 변수를 CLOSED
, CLOSED_LEFT
, CLOSED_RIGTH
, OPEN
와 이름을 변경했을 때 조금 더 쉽게 이해된다는 생각이 든다.
public DayDate addDays(int days) {
return factory.makeDate(toOrinal() + days);
}
위에 함수명을 보게 되면 addDays(int days)
는 새로운 DayDate객체를 반환해준다. 사용자 입장에서 해당 메소드를 입고 이 메소드를 사용하면서 어떤 생각을 할 것인가?
새로운 객체를 반환한다고 생각할 것인가? 아니면 해당 인스턴스 밸류 값이 업데이트되기를 원할것인가?
서술적 로컬 변수
boolean method(int year) {
return year % 4 == 0 && (!(year % 100 == 0) || year % 400 == 0);
}
---
boolean method(int year) {
bool fourth = year % 4 == 0
bool hundredth = (year % 100 == 0)
bool fourHundredth = year % 400 == 0
return fourth && (!hundredth || fourHundredth);
}
모든 값들에 대한 의미가 없이 하나의 라인으로 사용해도 된다. 하지만 해당 값들에 대한 의미를 로컬 변수로 명확하게 하게 되면 코드를 이해하는데 큰 도움이 된다.
정리
- 주석 정리
- Enum을 활용한 정적 변수 활용
- 정적 변수와 정적 데이터를 Uitls라는 파일로 만듬
- 추상적인 개념에 메소드는 추상 클래스로 구체적인 메소드와 변수는 구현 클래스로
결론
보이스카우트 규칙. 언제나 우리가 처음 소스코드를 본 것보다 나아지게 만들자.
Leave a comment