리팩토링: 변수의 값에 대한 결정은 변수가 선언되는 시점에 하는게 좋다.

김수호·2024년 5월 31일
0

다음과 같은 코드가 있다고 가정해보자.

Candidate finalist;

int sum1 = candidate1.scoreSum();
int sum2 = candidate2.scoreSum();

if (sum1 > sum2) {
    finalist = candidate1;
} else if (sum1 == sum2) {
    finalist = null;
} else {
    finalist = candidate2;
}

if (finalist != null) {
    System.out.println(finalist.getName() + " 파이널 진출");
} else {
    System.out.println("무승부");
}

위 코드는 유지보수성이나 확장성 면에 있어서 좋은 코드라고 보기 어렵다.

왜냐하면, finalist 변수의 선언 시점과 그 변수에 값이 결정되는 시점이 다르기 때문이다. 변수를 선언해두고 그 변수에 대한 값은 한참 뒤에서 결정하고 있는 것이다. 그렇게 되면, 이 finalist 변수에는 값이 대체 언제 할당되는 것인지 파악하기 어려워지게 된다.

물론 위 코드는 간단한 코드라서 이해하는데 어렵지 않을 수 있겠지만, 코드가 길어질수록, 로직이 복잡해질수록, 변수가 여러개일수록, 더욱 파악하기 어려워 질 것이다.

따라서 이를 파악하기 위한 비용이 많이 들고, 기능의 확장성, 유지보수성 또한 떨어지게 된다.

🤔 그러면 어떤 방식으로 위 코드를 리팩토링 해볼 수 있을까?

다양한 방법이 있겠지만, 이럴 때는 (finalist 변수의 값을 할당하기 위한) 메서드를 별도로 생성해서, 변수의 값에 대한 결정을 변수가 선언되는 시점으로 되도록 하는게 좋다.

아래 코드를 통해 확인해 보자.

public static void main(String[] args) {
    Candidate finalist = getFinallist(candidate1, candidate2);
    if (finalist != null) {
        System.out.println(candidate1.getName() + " 파이널 진출");
    } else {
        System.out.println("무승부");
    }
}

// 메서드 분리
private static Candidate getFinallist(Candidate candidate1, Candidate candidate2) {
    int sum1 = candidate1.scoreSum();
    int sum2 = candidate2.scoreSum();

    if (sum1 > sum2) {
        return candidate1;
    } else if (sum1 == sum2) {
        return null;
    } else {
        return candidate2;
    }
}

수정된 코드를 보면 getFinallist(..) 라는 메서드를 추가했다.

그리고 finalist 변수가 선언되는 시점에, 메서드의 반환값으로 값이 대입되는 것을 확인할 수 있다.

이렇게 변수의 값에 대한 결정을 변수가 선언되는 시점으로 하게 되면, 코드를 분석하고 파악하는데 더 비용을 줄일 수 있고, 수정이나 확장에도 더욱 용이한 구조가 될 수 있다.

profile
현실에서 한 발자국

0개의 댓글