[테스트 주도 개발] 31장_리팩토링

시스템의 설계를 작은 단계를 통해 변화시키는 방법들을 정리한다.

차이점 일치시키기

비슷해 보이는 두 코드 조각을 합리려면?
두 코드를 단계적으로 닮아가게 수정한다. 완전히 동일해지면 둘을 합쳐라.

변화 격리하기

객체나 메서드의 일부만 바꾸려면?
일단 바꿔야할 부분을 격리해라. 격리 방법으로는,

  1. 메서드 추출
  2. 객체 추출
  3. 메서드 객체
메서드 추출하기

길고 복잡한 메서드를 읽기 쉽게 만들려면?
긴 메서드의 일부분을 별도의 메서드로 분리하고 이를 호출해라. 복잡한 코드를 이해하기 쉽고, 중복을 제거하기도 좋다.

메서드 인라인

제어 흐름이 너무 산재되어 있으면?
메서드 호출하는 부분을 호출될 메서드의 본문으로 교체해라.

인터페이스 추출하기

자바 오퍼레이션에 대한 두 번째 구현을 추가하려면?
공통되는 오퍼레이션을 담고 있는 인터페이스를 만들어라.

메서드 옮기기

메서드를 원래 있어야할 장소로 옮기려면?
적절한 클래스에 메서드를 추가하고, 이를 호출하게 해라. 다음과 같이, 한 메서드에서 다른 객체에 하나 이상의 메세지를 보내면 의심해봐라.

1
2
3
int width = bounds.right() - bounds.left();
int height = bounds.bottom - bounds.top();
int area = width * height;

다음과 같이 수정할 수 있다.

1
2
3
4
5
public class Shape {
...
int area = bounds.area();
...
}
1
2
3
4
5
6
7
8
9
public class Rectangle {

public int area() {
int width = this.right() - this.left();
int height = this.bottom() - this.pop();

return width * height;
}
}
메서드 객체

여러 개의 매개 변수와 직역 변수를 갖는 복잡한 메서드는 어떻게 표현?
메서드를 꺼내서 객체로 만들어라.

매개 변수 추가

메서드에 매개 변수를 어떻게 추가?
메서드가 인터페이스에 선언되어 있으면 인터페이스에 매개 변수를 추가해라.


테스트 주도 개발 <켄트 벡>

Comments