Thief of Wealth
article thumbnail

리팩터링 책은 목적이 분명히 드러나는 이름의 짤막한 함수를 이용하기를 권한다.

그래야 코드가 명료해지고 이해하기 시워지기 때문이다.

 

하지만 때로는 함수 본문이 이름만큼 명확한 경우도 있다.

또는 함수 본문 코드를 이름만큼 깔끔하게 리팩터링할 때도 있다.

 

이럴 때는 그 함수를 제거한다. 간접 호출은 유용할 수도 있지만 쓸데없는 간접 호출은 거슬릴 뿐이다.

 

간접 호출을 너무 과하게 쓰는 코드도 흔한 인라인 대상이다.

가령 다른 함수로 단순히 위임하기만 하는 함수들이 너무 많아서 위임 관계가 복잡하게 얽혀 있으면 인라인해버린다.

 

그중 간접 호출을 유지하는 편이 나은 경우도 있겠지만, 모두 그렇지는 않을 것이다.

함수 인라인하기를 활용하면 유용한 것만 남기고 나머지는 제거할 수 있다.

 

절차는 다음과 같다.

1. 다형 메서드인지 확인한다.

=> 서브클래스에서 오버라이드하는 메서드는 인라인하면 안된다.

2. 인라인할 함수를 호출하는 곳을 모두 찾는다.

3. 각 호출문을 함수 본문으로 교체한다.

4. 하나씩 교체할 때마다 테스트한다.

=> 인라인 작업을 한 번에 처리할 필요는 없다.

인라인하기가 까다로운 부분이 있다면, 일단 남겨두고 여유가 생길 때마다 틈틈이 처리한다.

5. 함수 정의를 삭제한다.

 

말로는 아주 간단해 보인다.

하지만 실제로는 그렇지 않을 때가 있다.

 

재귀 호출, 반환문이 여러개인 함수, 접근자가 없는 다른 객체에 메서드를 인라인하는 방법 등을 일일이 설명하자면, 몇 쪽은 필요할 것이다.

각각의 경우를 다 설명하지 않는 이유는, 상황이 그 정도로 복잡하다면 함수 인라인하기를 적용하면 안되기 때문이다.

 

아래 함수를 예시로 들어보자

이런 경우에는 호출되는 함수의 반환문을 그대로 복사해서 호출하는 함수의 호출문을 덮어쓰면 끝이다.

 

 

그런데 복사한 코드가 새로운 위치에 잘 들어맞도록 손봐줘야 하는 경우도 있다.

예컨대 앞의 코드가 다음과 같이 약간 다르게 작성되어 있다고 해보자.

 

위 코드가 있다면 어떻게 할까?

 

단순히 잘라 붙이는 식으로는 gatherCustomerData()를 reportLines()로 인라인할 수 없다.

아주 복잡하지는 않고, 여전히 단번에 옮기고 약간 수정해주면 될 때도 많지만,

실수에서 않으려면 한 번에 한 문장씩 옮기는 것이 좋다.

 

그러니 먼저 여러 문장을 호출한 곳으로 옮기기를 적용해서 단계별로 적용해보자.

 

완료하면 위와 같이 변할 것이다.

 

끝!

profile on loading

Loading...