SerialDateTest 또는 SerialDateTests라는 클래스는 단위 테스트 케이스를 몇 개 포함하며, 실행 시 실패하는 케이스는 없지만 모든 경우를 점검하지 않는다는 사실을 알 수 있습니다.
저자는 SerialDateTest.java에 있는 모든 테스트 케이스가 통과할 수 있게 만들었습니다.
Clover라는 Code Coverage 분석 도구를 이용하여 실행 코드와 실행하지 않는 코드를 확인한 결과, SerialDateTests는 **50%**의 경우만 테스트함을 확인할 수 있었습니다. 구체적으로는 185개 중 **50%**만 실행하고 있었습니다. MonthCodeToQuarter 메서드는 전혀 호출되지 않았습니다.
클래스를 철저히 이해하고 리팩터링하려면 훨씬 높은 테스트 커버리지가 필요했습니다.
2. 둘째, 고쳐보자
쓸모없는 주석은 제거합니다.
변경 이력, 작성자 등은 Git 등의 소스 코드 관리 도구로 대체할 수 있으므로 삭제합니다. 특히 변경 이력 주석은 1960년대 방식으로, 현재는 불필요합니다.
법적 정보는 유지합니다.
라이선스 및 저작권 관련 주석은 반드시 보존합니다.
좋은 주석은 유지합니다.
변수의 역사와 의미를 설명하는 주석은 코드 이해에 도움이 되므로 유지합니다.
Javadoc에는 하나의 언어만 사용합니다.
자바, 영어, HTML 등 여러 언어가 혼용되면 오히려 가독성을 해칩니다. 필요 시 <pre> 태그로 통일된 형식을 사용합니다.
import java.text.*, import java.util.* 형태로 범용 패키지를 사용해 코드 라인을 줄입니다.
기능을 명확히 표현합니다.
클래스와 메서드는 이름만 보고도 역할이 파악되도록 작성합니다.
**단일 책임 원칙(SRP)**을 지킵니다.
하나의 메서드는 하나의 역할만 하도록 분리하고, 복잡한 로직은 적절히 나눕니다.
플래그 인수는 제거하고 서술형 이름으로 분리합니다.
예: getMonths(boolean fullName) → getMonthNames() / getMonthShortCodes() 등으로 분리.
불필요한 상속은 제거합니다.
예: DayDate가 MonthConstants를 상속하는 것은 적절하지 않으며, 상수는 enum으로 분리합니다.
사용하지 않는 직렬화 제거
클래스 직렬화 버전이 달라질 경우 문제가 발생하므로, 직렬화를 피하는 것이 안전합니다.
변수 선언 시 final 키워드를 제거합니다.
실질적인 코드 안정성 향상보다는 복잡성만 높이므로, 전체적으로 제거합니다.
임시 변수와 설명을 통해 알고리즘 가독성을 높입니다.
변수명은 의미가 명확하고 클래스 컨텍스트에 어울리도록 수정합니다.
중복된 if 조건은 || 연산자로 합칩니다.
불필요한 중복을 줄이고 가독성을 높입니다.
정확한 의미를 반영한 이름으로 변경합니다.
예: SerialDate → DayDate. Serial은 제품 일련번호와 관련된 용어이므로 날짜를 표현하기에 적절하지 않습니다.
중복 메서드는 통합하여 의미를 명확히 합니다.
예: getMonths가 두 개 존재할 경우, 역할에 따라 메서드를 구분하거나 하나로 통합합니다.
변수가 특정 클래스에서만 사용된다면 추상 클래스가 아닌 해당 클래스에 위치시킵니다.
변수와 사용 코드 간 거리를 줄이면 가독성이 높아집니다.
구현 정보를 추상 클래스에 담지 않습니다.
자식 클래스와의 결합도를 낮추기 위해 ABSTRACT FACTORY 패턴을 적용합니다.
No Comments