2. 이 장의 내용
• org.jfree.date.SerialDate 클래스를
리팩토링 해보기
• 오리지널 코드
https://github.com/jfree/jcommon/tree/master/src/main/java/org/jfree/date
3. 테스트 코드를 수행하자
• 존재하는 테스트 코드를 돌려서 모든 테스트
케이스를 성공적으로 통과하는지 확인
• 테스트 코드가 모든 기능들을 테스트 하는 지
확인
• Code Coverage Tool
Java : Clover https://ko.atlassian.com/software/clover
Cpp : gcov http://korea.gnu.org/manual/release/gcov/gcov_1.ko.html
4. 코드 커버리지를 확인했더니…
• 코드 커버리지가 50% 밖에 되지 않았다!
• 모든 코드를 다 테스트 할 수 있도록 추가로
테스트 코드 작성 p484
• 새로 추가한 테스트 코드가 모두 성공할 수 있
도록 버그를 수정한다
5. 본격적으로 리팩토링 시작
• 변경 이력 제거 [C1] p448 L1
변경 이력은 소스관리 툴에서 확인 가능하다
• 코드에 사용되는 언어 통일 [G1] p449 L67
java와 javadoc 으로 통일
• 클래스명 변경 [N1] [N2]
좀 더 서술적이고 추상 클래스에 맞는 이름으
로 변경
6. 본격적으로 리팩토링 시작
• 구현 클래스에서만 사용하는 멤버변수를 구
현 클래스 안으로 이동 [G6] p450 L98
• 추상 클래스 안에 있는 구현 클래스 코드 제거
[G7] p466 L808
구현 클래스 생성 코드는 ABSTRACT
FACTORY 로 분리
DACORATOR, SINGLETON 적용
7. • 많은 수의 연관된 서브 클래스를 특정 그룹으
로 묶어 한번에 교체할 수 있도록 만든 디자인
패턴
http://jdm.kr/blog/192
8. • 주어진 상황 및 용도에 따라 어떤 객체에 책임
을 덧붙이는 패턴으로, 기능 확장이 필요할 때
서브클래싱 대신 쓸 수 있는 유연한 대안이 될
수 있다 [링크]
9. 본격적으로 리팩토링 시작
패턴들이 적용된 결과 p352~p353
• 요일 상수를 enum으로 변경 [J3] p450 L109
• 필요 없는 주석 삭제 [C3] p451 L139
코드만 봐도 충분히 의미가 파악된다
• 사용하지 않는 코드 제거 [G9] p451 L144
10. 본격적으로 리팩토링 시작
• 멤버 변수를 private로 변경 p451 L144
• 변수는 사용하는 곳과 가까운 곳에 선언
[G10] p505 L434
• 용어를 사용하여 의미를 명확하게 한다 [N3]
p452 L177
같은 의미를 가지는 수학적 용어로 이름 변경
11. 본격적으로 리팩토링 시작
• 빈 기본 생성자 제거 [G12] p452 L213
어차피 컴파일러가 자동으로 생성해준다
• 리팩토링을 하면서 코드와 의미가 달라진 주
석 삭제 [C2]
• 다른 조건으로 같은 행동을 하는 코드 묶음
[G5] p454 L259~L263
중복된 코드를 제거하라
12. 본격적으로 리팩토링 시작
• 같은 개념을 가진 코드는 같은 곳에 위치하도
록 이동 [G13] p453 250
요일을 enum으로 만들면서 수정할 필요가 생
김 p356
• 클래스 외부에 선언된 enum에 대한 연산을
하고 있다. 이 기능을 enum내부로 이동 [G14]
p456 L377 ~ p457 L426
달을 enum으로 만들면서 수정할 필요가 생김
p358
13. 본격적으로 리팩토링 시작
• 모호한 표현을 제거하고 서술적인 표현으로
가독성을 높인다 [G16] p459 L495
p359
• 부적절한 static 표현 삭제 [G18] p461 L562
재정의 하지 않을 것이라는 보장이 없다 p360
• 임시 변수의 이름을 서술적으로 바꾼다 [G19]
p461 L593 -> p360
14. 본격적으로 리팩토링 시작
• 모호하게 해석되지 않도록 명확한 이름으로
변경 [N4] p361
• 숨겨진 논리적 의도성을 드러내라 [G22]
p500 L247
추상 클래스와 연관 되어 있을 것 같은 동작이
구현클래스에 의존성을 가지고 있었다. 이를
메소드로 분리해 확실하게 드러낸다. p364
15. 결과 코드
• 리팩토링을 하면서 계속 테스트 코드를 실행
하여 코드 품질을 유지하도록 한다
• https://github.com/ludwiggj/CleanCode/
tree/master/src/clean/code/chapter16/sol
ution