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



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


1. 책의 예제

명령어 인수 구문 분석기

코드 초안

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


코드 완성본

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


책의 예제를 통해 배울 점

한번 정도 따라 읽어가며 저자가 ‘점진적으로’ 코드를 개선해나가는 사고 흐름을 따라가면 좋다.
부담 없이 가볍게 읽어본다
자신이 스스로 점진적으로 코드를 개선해보는 경험을 통해 더 많이 배우게 된다.


2. 점진적으로 개선하기

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

1. 앗! 뭔가 잘못되고 있어!

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



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

변경을 가한 후에도 시스템이 변경 전과 똑같이 돌아가야 한다.
테스트 코드가 없다면 작성하고, 코드를 수정하기 전 상태에서 모든 테스트가 통과해야 한다.


3. 점진적으로 개선한다.

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



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

Extract Method : 메서드 추출 기능

코드 블럭을 메서드로 추출할 수 있다


Change Signature : 메서드 파라미터 추가, 삭제 및 변경

메서드의 파라미터를 추가하거나 변경할 수 있다.


Rename : 이름 변경

메서드나 변수 이름을 변경할 수 있다.


Extract Variable : 변수 추출 기능

변수를 추출할 수 있다.


Extract Field : 멤버 변수 추출 기능

특정 값을 멤버 변수로 설정할 수 있다.


Extract Constant : 상수 추출 기능

특정 값을 상수로 추출할 수 있다.


Pull Members Up & Pull Members Down

하위 클래스의 메서드를 상위로 올리거나 & 상위 클래스의 메서드를 하위로 내릴 수 있다.