리팩토링 28. 함수 인라인
- etc/리팩토링
- 2023. 5. 10.
들어가기 전
이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다.
리팩토링 28. 함수 인라인
- '함수 추출하기'의 반대에 해당하는 리팩토링
- '함수 추출하기'는 거대한 함수에서 함수를 뽑아내는 리팩토링.
- '함수 추출하기'를 통해 함수의 이름으로 의도를 표현하는 방법
- 함수 인라인은 추출된 함수를 다시 다른 함수로 합쳐서, 함수를 없애는 리팩토링이다.
- Use case
- 함수 본문이 함수 이름보다 더 의도를 잘 표현하는 경우도 있음. 이 경우, 본문을 그대로 사용하는게 나음.
- 함수 리팩토링이 잘못된 경우, 여러 함수를 인라인하여 커다란 함수를 만든 다음, 다시 함수 추출하기를 시도할 수 있다. (리팩토링 전단계)
- 단순히 다른 메서드 호출을 감싸는 형태
- 함수가 다른 함수를 감쌀 때는 의미가 바뀌어야 함. 의미가 바뀌지 않은 랩핑 함수는 의미가 없으므로 함수 인라인을 통해서 제거함.
- 주의 사항
- 상속 구조에서 오버라이딩 하고 있는 메서드는 인라인 할 수 없다.
대부분은 긴 함수에서 새로운 함수를 추출하는 리팩토링이 적절하다. 이를 통해서 함수의 의도를 보다 잘 표현할 수 있기 때문이다. 그렇지만 이런 함수 인라인 리팩토링이 필요한 경우가 몇 가지 존재한다. 다음은 함수 인라인 리팩토링을 이용해 기존에 존재하는 함수를 제거해야하는 경우다.
- 함수의 이름보다 함수의 본문이 의미를 잘 표현하는 경우
- 함수 추출을 잘못 했을 때. 인라인으로 거대한 함수로 다시 만들고, 다시 함수 추출할 때
- 함수가 다른 함수를 단순히 감싸기만 했을 때.
함수가 다른 함수를 감싸는 것은 일반적으로는 괜찮다. 만약 함수가 다른 함수를 감쌌을 때, 함수의 의미가 바뀐다면 이런 경우는 그대로 사용해도 된다. 그런데 의미가 바뀌지 않는다면 함수가 다른 함수를 감싸는 의미가 없기 때문에 이런 부분은 삭제가 필요하다.
코드
아래 코드의 moreThanFiveLateDeliveries() 메서드를 살펴보자. 이 메서드는 한 가지 문제점이 있다.
- 메서드의 이름은 메서드가 하는 일을 잘 표현한다.
- 메서드 내부의 내용이 메서드의 이름보다 메서드가 하는 일을 더 잘 표현한다.
따라서 이런 경우라면, 코드 복잡도를 고려했을 때 쓸모없는 메서드를 제거하고 수식을 그대로 사용하는 것이 더 좋을 것이다.
public class Rating {
public int rating(Driver driver) {
return moreThanFiveLateDeliveries(driver) ? 2 : 1;
}
// 메서드 이름만큼 수식도 메서드의 의미를 잘 표현한다.
private boolean moreThanFiveLateDeliveries(Driver driver) {
return driver.getNumberOfLateDeliveries() > 5;
}
}
IDE가 제공하는 리팩토링 기능
인텔리제이가 제공하는 리팩토링 기능을 제공하자. 이 기능은 ctrl + alt + n 을 이용해서 할 수 있으며, 'inline all and remove the method'를 선택하면 된다. 수정 이후 코드는 다음과 같다.
public class Rating {
public int rating(Driver driver) {
return driver.getNumberOfLateDeliveries() > 5 ?
2 : 1;
}
}
'etc > 리팩토링' 카테고리의 다른 글
냄새 9. 기능 편애 (0) | 2023.05.10 |
---|---|
리팩토링 29. 클래스 인라인 (0) | 2023.05.10 |
리팩토링 27. 필드 옮기기 (0) | 2023.05.10 |
냄새 8. 산탄총 수술 (0) | 2023.05.10 |
리팩토링 26. 함수 옮기기 (0) | 2023.05.10 |