본문 바로가기

공부/Refactoring

Refactoring 개요

리팩토링(Refactoring)의 정의

  • 소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부 구조를 변경하는 것
    • 즉, 리펙토링의 목적은 소프트웨어를 이해하기 쉽게 만드는 것 (성능 최적화와 목적이 다름)
    • 겉으로 보이는 소프트웨어의 기능을 변경하지 않음

리팩토링을 해야하는 이유?
  • 소프트웨어의 디자인 개선
    • 단기적인 목적을 이루거나, 전체 디자인을 고려하지 않고 수정된 코드를 정돈함으로서 전체 코드의 디자인을 유지
    • 예를 들어 중복된 코드의 제거는 코드의 수정시간이 줄어드는 이점이 있고, 수정할 코드가 한 곳에 모여있다는 것은 좋은 디자인의 필수 조건
  • 소프트웨어의 가독성(이해도) 증가
    • 리펙토링은 코드의 가독성을 높여 코드를 이해하기 쉽게 만듬
  • 디버깅
    • 코드의 가독성을 높임으로서 디버깅을 쉽게 할 수 있음
  • 프로그램 생산성 증가
    • 디자인, 가독성, 디버깅 등에서 이점을 가지면 품질 뿐 아니라, 개발 생산성도 향상됨

리팩토링 시점

리팩토링은 시간을 정해두는 것 보다는, 틈틈히 지속적으로 하는 것이 좋다. 주로 아래와 같은 시점에 리팩토링을 하는 것이 좋다. 
  • 삼진 규칙
    • 처음 코드를 작성할 때는 그냥 작성
    • 두 번째 비슷한 작업 역시 중복으로 작성
    • 세 번째 비슷한 작업을 할 때 리팩토링
  • 기능을 추가할 때
    • 추가가 쉽지 않은 형태의 디자인을 변경
  • 버그를 수정해야 할 때
  • 코드 검토를 할 때
    • XP의 페어 프로그래밍(Pair Programming)

프로그램의 수정을 어렵게 하는 이유들
  • 가독성이 떨어짐
  • 중복된 로직
  • 실행중인 코드를 변경해야 하는 특별한 동작을 요구하는 프로그램
  • 복잡한 조건문

인디렉션(Indirection)의 이점
  • 로직의 공유
    • 다른 두 곳에서 호출되는 서브 메소드
    • 모든 서브클래스에서 공유되는 수퍼클래스의 메소드
  • 의도와 구현을 분리하여 설명
    • 클래스와 메소드의 이름은 코드의 의도를 의미
    • 클래스와 메소드 내용은 그 의도에 대한 구현을 설명
    • 클래스와 메소드 내부 역시 의도의 관점에서 작성되었다면, 그 구조에 대한 중요한 정보의 대부분을 잘 전달할 수 있도록 코드를 작성할 수 있다.
  • 변경의 격리
    • 특정 클래스를 서브클래스를 통해 변경하여 원본 클래스의 변경과 격리
  • 조건 로직의 부호화
    • 조건문을 다형성을 통해 개선하여 중복을 줄이고 융통성을 늘림



출처 : 리팩토링 (마틴 파울러 저)