Group Study (2021-2022)/Clean Code

[클린코드 북리뷰 스터디] 7주차 - 점진적인 개선, Junit 들여다보기, SerialDate 리팩터링

wingbeat 2022. 7. 14. 18:47

Chapter14. 점진적인 개선

: 코드를 점진적으로 개선하기

 

01 책의 예제

<명령형 인수 구문 분석기>

 

코드 초안

  • 모든 로직이 하나의 클래스에 들어가있다.
  • 처음부터 지저분한 코드를 짜려는 생각은 없었고, 코드를 어느정도 손 봤지만 새로운 인수 유형이 들어오면서 재앙이 시작됐다.
  • 이제는 개선해야 할 때 라는걸 깨닫고, 변경 전후 시스템이 동일하게 돌아간다는 사실을 확인하기 위해 테스트들을 작성해뒀다.
  • 자잘하게 점진적으로 개선해나갔다

 

코드 완성본

  • Args 클래스에서 코드 중복을 최소화하고, ArgsException 클래스를 분리했다. ArgumentMarshaler 클래스를 통해 여러 인수에 대한 추후 확장성을 만들어냈다.
  • 코드만 분리해도 설계가 좋아진다. 관심사를 분리하면 코드를 이해하고 보수하기 훨씬 더 쉬워진다.

 

=> 자신이 스스로 점진적으로 코드를 개선해보는 경험을 통해 더 많이 배우게 된다.

 

02 점진적으로 개선하기

1. 코드가 나빠지고 있음을 느꼈을 때 기능을 추가하지 않고 개선을 시작한다.

2. 테스트 코드를 작성한다.

변경을 가한 후에도 시스템이 변경 전과 똑같이 돌아가야 한다.

테스트 코드가 없다면 작성하고, 코드를 수정하기 전 상태에서 모든 테스트가 통과해야한다.

3. 점진적으로 개선한다

책임에 따라 클래스를 나누고, 코드를 옮긴다. 테스트가 깨지지 않도록 확인하며 자잘한 변경을 조금씩 진행한다.

=> “ 프로그램을 망치는 가장 좋은 방법 중 하나는 개선이라는 이름 아래 구조를 크게 뒤집는 행위다 ”

 

03 IDE를 활용해 점진적으로 개선하기

  • ExtractMethod: 메서드 추출 기능 => 코드 블럭을 메서드로 추출할 수 있다
  • Change Signature : 메소드 파라미터 추가, 삭제 및 변경 => 메서드의 파라미터를 추가하거나 변경할 수 있다.
  • Rename : 이름 변경 => 메서드나 변수 이름을 변경할 수 있다
  • Extract Variable : 변수 추출 기능 => 변수를 추출할 수 있다
  • Extract Field : 멤버 변수 추출 기능 => 특정값을 멤버 변수로 설정할 수 있다
  • Extract Constant : 상수 추출 기능 => 특정값을 상수로 추출할 수 있다
  • Pull Members Up & Pull Members Down => 하위 클래스의 메서드를 상위로 올리거나 & 상위 클래스의 메서드를 하위로 내릴 수 있다

 

 

Chapter15. JUnit 들여다보기 & 16. SerialDate 리팩터링

: 라이브러리 분석을 통해 코드를 바라보는 시각 기르기

 

15장. JUnit 들여다보기

세상에 완벽한 코드는 없다

  • 의도를 명확하게 표현하기 위해 조건문을 메서드로 분리
  • 전후 단계가 있는 변수들 사이 시간적인 결합 (hidden temporal coupling)을 해결하기 위해 리팩터링
  • 더 적절한 의미로 네이밍 변경
  • 불필요한 연산을 하는 코드 제거

16장. SerialDate 리팩터링

남의 코드를 비판하고, 내 코드의 비판을 듣는 건 편안하게 여겨야 할 활동이다

Make it Work

  • 테스트 코드가 모든 경우를 테스트하지 않는다. -> 주석 처리된 테스트 코드들을 모두 동작하도록 손본다.
  • 코드의 구조를 개선하기 전에 버그들을 수정한다. 경계 조건 오류, 늘 거짓인 조건문

Make it Right

  • 옛날 스타일 코드 제거 (Month Constants를 상속하는 방식 -> enum Month)
  • serialVersionUID를 컴파일러가 자동 생성하도록 함 (직접 변경하지 않아 생기는 버그보다 변경된 UID로 발생한 예외를 디버깅하는게 낫다)
  • DayDate(SerialDate) Abstract Factory를 통해 생성하도록 한다.
  • 캡슐화를 위해 접근 제한자를 수정 (public->private)
  • 사용되지 않는 변수 제거
  • 불필요한 주석 제거

 

오픈소스: 코드 분석 어떻게 하나?

  • 해당 솔루션에 대한 기본 지식을 먼저 익혀라.
  • 본인 PC에 빌드 및 실행환경을 구축하라
  • 수정, 실행, 확인 사이클을 짧게 만들어라
  • 자신에게 질문을 많이하라
  • 분석하면서 문서로 정리하라
  • 디버거 활용하기
  • 코드의 일부를 통해 먼저 파악하기