※ 오늘의 명언
항상 이런 생각으로 개발에 임하라.“내 소스를 유지보수하게 될 개발자는내가 어디 살고 있는지 알고 싶어하는 과격한 사이코패스일 것이다.”
- Martin Golding
서론
우리는 보통 어떠한 기능을 갖고 있는 로직들을 함수로 만들어 사용한다. 과연 기능을 갖고 있다해서 모두 함수로 만들어 사용하는 것이 좋은 소스라고 볼 수 있을 것인가? 바로 이 질문에 대해 이번 글에서 다뤄볼려고 한다.
작성 소스
int val = ?;
private int getValue()
{
return compareValueCheck() ? 2 : 1;
}
boolean compareValueCheck()
{
return val > 5;
}
위의 소스를 보면 int형은 val가 멤버변수로 선언되어있는 상태이고 compareValueCheck()라는 int형 함수를 활용하여 최종 값을 얻어오는 로직을 구현한 상태이다. 뭐 물론 이렇게 사용해도 문제되는 것은 당연히 없다. 그렇지만 리팩토링 책에서는 이렇게 제안한다.
"메서드 기능이 너무 단순해서 메서드명만 봐도 너무 빤할 때는 그 메소드의 기능을 호출하는 메서드를 넣어버리고 해당 하는 그 메서드는 삭제해버리자"
위 내용을 참고하여 수정을 해보자.
리팩토링 후
int val = ?;
private int getValue()
{
return (val > 5) ? 2 : 1;
}
어떤가? 너무 간단해졌다. 물론 해당 compareValueCheck()의 함수가 어디선가 재정의가 되고 있는것이 있다면 당연히 없어지면 문제가 생기지만 아니라면 위의 방법으로 구현하는 것이 깔끔하다고 볼 수 있다.
리팩토링의 핵심은 의도한 기능을 한눈에 파악할 수 있는 직관적인 메서드명을 사용하는 것과 메서드를 간결하게 만드는 것이다.
그래야 메서드가 더 명료해지고 코드를 알아보기 쉽기 때문이다. 하지만 위와 같이 간혹 메서드명에 모든 기능이 반영될 정도로 메서드 기능이 지나치게 단순할 때가 있다.
이럴땐 그 메서드에 포함된 내용을 호출한 부분에 삽입하여 메서드를 삭제하는 것이 좋은 방법이라고 할 수 있다.
메서드 내용 직접 삽입 리팩토링 방법
위의 리팩토링 방법을 기술하면 이렇다.
- 메서드가 어디선가 재정의가 되어있는가? 메서드 삭제를 위해선 가장 중요한 부분이니 확인을 꼭 해보자!
- 그 메서드를 호출하는 부분을 모두 찾아놓는다.
- 호출 하는 부분을 메서드의 내용으로 교체한다.
- 테스트를 실시해본다. 필수!
- 테스트를 해서 이상이 없다면 기존 메서드를 삭제한다.
위 제안한 방법대로 진행한다면 메서드 내용을 직접 삽입하여 수정하는데 문제가 생기진 않을 것이니 참고하여 현재 사용하고있는 프로그램에서 리팩토링할 부분을 찾아 적용시켜보면 좋을 것 같다.
'Refactoring > Refactoring Skill' 카테고리의 다른 글
[Refactoring 기법 #05] 메서드 정리 - 알고리즘 전환 (0) | 2022.01.16 |
---|---|
[Refactoring 기법 #04] 메서드 정리 - 임시변수를 메서드 호출로 전환 (0) | 2022.01.11 |
[Refactoring 기법 #03] 메서드 정리 - 임시변수 내용 직접 삽입 (0) | 2022.01.09 |
[Refactoring 기법 #01] 메서드 정리 - 메서드 추출 (0) | 2022.01.04 |
[Refactoring] 리팩토링(Refactoring)이란? (리팩토링 효과 / 해야 하는 이유) (0) | 2022.01.03 |
댓글