본문 바로가기
  • GDG on campus Ewha Tech Blog
3-2기 스터디/클린코드 독서

[6주차] 15~16장 정리

by NowPiece 2022. 5. 22.

📌15장 JUnit 들여다보기

JUnit 프레임워크

JUnit은 저자가 많다. 시작은 엔지니어 둘이 비행기에서 기초를 구현한 것이다. 우리가 살펴볼 모듈은 문자열 비교 오류를 파악할 때 유용한 코드다. ComparisonCompactor는 두 문자열을 받아 차이를 반환한다.

오늘날 사용하는 개발 환경에서는 변수 이름에 범위를 명시할 필요가 없다. fexpected 처럼 접두어 f는 중복되는 정보이므로 모두 제거한다. 다음으로 의도를 명확히 표현하려면 조건문을 캡슐화 해야한다. 조건문을 메서드로 뽑아내 적절한 이름을 붙인다. 그리고 부정문은 긍정문보다 이해하기 약간 더 어려우므로 긍정문을 주로 쓰자.

함수 이름, 멤버 변수 이름 또한 좀 더 정확하게 바꾸도록 한다. 그리고 불필요한 부분을 제거하고 구조를 다듬어 정리한다. 최종 코드를 보면, 상당히 깔끔하다. 모듈은 일련의 분석함수와 조합 함수로 나뉜다. 전체 함수는 위상적으로 정렬했으므로 각 함수가 사용된 직후에 정의된다. 분석 함수가 먼저 나오고 조합 함수가 그 뒤를 이어서 나온다.

초반에 내렸던 결정 일부를 번복하며 수정하는 건 흔한 일이다. 리팩터링은 코드가 어느 수준에 이를 때까지 수많은 시행착오를 반복하는 작업이기 때문이다.

결론

물론 저자들은 우수한 모듈을 만들었지만, 세상에 개선이 불필요한 모듈은 없다. 처음보다 조금 더 깨끗하게 만드는 책임은 우리 모두에게 있다.

📌16장 SerialDate 리팩터링

http://www.jfree.org/jcommon/index.php 에서 JCommon 라이브러리를 제공한다. org.jfree.date라는 패키지에 SerialDate라는 클래스가 있다. 이번 장은 이 SerialDate에 대해 알아보도록 한다.

SerialDate는 분명히 ‘우수한’ 코드지만 여기서 낱낱이 까발린다. 이를 구현한 데이비드 길버트는 누구나 사용하고 누구나 비판하라고 오픈 소스로 공개했다.

SerialDate는 날짜를 표현하는 자바 클래스다. 이미 java에는 시간 기반 날짜 클래스가 있지만 이보다 순수 날짜 클래스를 환영하는 바이다.

첫째, 돌려보자

SerialDateTests라는 클래스는 단위 테스트 케이스 몇개를 포함하는데, 훑어보면 모든 경우를 점검하지 않음을 알 수 있다. 코드 커버리지 분석 도구인 클로버를 이용해 단위 테스트가 실행하는 코드와 실행하지 않는 코드를 조사했더니, 대략 50%정도 실행하는 코드 비율이 나왔다.

SerialDate를 리팩터링하면서 모든 테스트 케이스를 통과하게 코드를 손보도록 하자.

  • 454쪽 259, 263행 equalsIgnoreCase으로 수정
  • 487쪽 153, 154행
  • 487쪽 163행 ~ 488쪽 213행 stringToMonthCode 매서드 수정
  • 491쪽 318행 버그
  • 493쪽 417행 494쪽 429행은 오류 문자열 대신 IllegalArgumentException을 던져 수정

이렇게 수정을 통해 모든 테스트 케이스를 통과하게 했다. 이젠 SerialDate 코드를 ‘올바로’ 고쳐보자

둘째, 고쳐보자

  • 448쪽 1행 주석 너무 오래되어서 간단하게 고치고 개선함
  • 450쪽 86행 클래스 선언, 사실 SerialDate 보단 그냥 Date 혹은 Day가 낫지만 이미 자바 라이브러리에 존재하므로 DayDate라 결정
  • enum을 모두 족자적인 소스 파일로 옮김
  • 정적 변수와 정적 메서드를 DateUil이라는 새 클래스로 옮김
  • 일부 추상 메서드를 DayDate 클래스로 끌어올림
  • Month.make를 Month.fromInt로 변경. 다른 enum도 똑같이 변경. 또한 모든 enum에 toInt() 접근자를 생성하고 index 필드를 private로 정의.
  • plusYears와 plusMonths에 흥미로운 중복. correctLastDayOfMonth라는 새 메서드를 생성해 중복 없앰.
  • 1을 모두 없애고 Month.JANUARY.toInt() 혹은 Day.SUNDAY.toInt로 적절히 변경함. 알고리즘도 살짝 손봄.

결론

보이스카우트 규칙을 따랐다. 이렇게 테스트 커버리지가 증가하고, 버그 수정하고, 코드 크기를 줄여, 명확한 코드가 되었다. 다음 사람은 코드를 더 쉽게 이해하고 더 쉽게 개선하리라.

'3-2기 스터디 > 클린코드 독서' 카테고리의 다른 글

[7주차] 17장 정리  (0) 2022.05.28
[5주차] 14장 정리  (0) 2022.05.17
[4주차] 클린코드 11~13장 정리  (0) 2022.05.17
[3주차] 클린코드 7~10장 정리  (0) 2022.04.15
[2주차] 클린코드 4~6장 정리  (0) 2022.04.06

댓글