본문 바로가기
자바

if문 제거하기

by 이상한나라의개발자 2023. 12. 12.

if문이 너무 많은 코드

 

public class Client {

    public int someMethod(CalculateCommand calculateCommand) {
        CalculateType calculateType = calculateCommand.getCalculateType();
        int num1 = calculateCommand.getNum1();
        int num2 = calculateCommand.getNum2();

        int result = 0;
        // if 문이 많아서 복잡하다.
        if ( calculateType != null && calculateType.equals(CalculateType.ADD)) {
            result = num1 + num2;
        }
        else if ( calculateType != null && calculateType.equals(CalculateType.MINUS)) {
            result = num1 - num2;
        }
        else if ( calculateType != null && calculateType.equals(CalculateType.MULTIPLY)) {
            result = num1 * num2;
        }
        else if ( calculateType != null && calculateType.equals(CalculateType.DIVIDE)) {
            if (num2 == 0 ) {
                throw new RuntimeException("num2 cannot be 0");
            }
            else {
                result = num1 / num2;
            }
        }

        return result;
    }
}

 

 

빠르게 반환하기 - Early return

 

객체에 대한 null 체크를 미리 함으로써 if문의 조건을 줄일 수 있습니다.

public class ClientEarlyReturn {

    public int someMethod(CalculateCommand calculateCommand) {
        CalculateType calculateType = calculateCommand.getCalculateType();
        int num1 = calculateCommand.getNum1();
        int num2 = calculateCommand.getNum2();

        int result = 0;

        if ( calculateType == null ) {
            return result;
        }

        if ( calculateType.equals(CalculateType.DIVIDE) && num2 == 0 ) {
            throw new RuntimeException("num2 cannot be 0");
        }

        // 널체크와 예외처리를 빼고 나머지는 모두 같은 로직이다. 하지만 복잡하다.
        if ( calculateType.equals(CalculateType.ADD)) {
            result = num1 + num2;
        }
        else if ( calculateType.equals(CalculateType.MINUS)) {
            result = num1 - num2;
        }
        else if ( calculateType.equals(CalculateType.MULTIPLY)) {
            result = num1 * num2;
        }
        else if ( calculateType.equals(CalculateType.DIVIDE)) {
            result = num1 / num2;
        }

        return result;
    }
}

 

 

코드 개선 및 생성 시점에 유효성 검사

 

아래 코드는 위 if문이 많은 코드 보다 가독성이 좋아 졌습니다. 천천히 살펴 보시죠

 

public class AdvanceClient {
    public int someMethod(AdvanceCalculateCommand calculateCommand) {
        AdvanceCalculateType calculateType = calculateCommand.getCalculateType();
        int num1 = calculateCommand.getNum1();
        int num2 = calculateCommand.getNum2();
        // 릭팩토링 결과 변경 없이 코드의 구조를 재조정 하는 것 가독성을 높이거나 유지보수를 편하게 함.
        int result = calculateType.calculate(num1, num2); 
        return result;
    }
}

 

 

null 체크와 필요한 유효성 검사는 생성 시점에 하도록 합니다.

 

public class AdvanceCalculateCommand {
    private AdvanceCalculateType calculateType;
    private int num1;
    private int num2;

    public AdvanceCalculateCommand(AdvanceCalculateType calculateType, int num1, int num2) {
        if ( calculateType == null ) {
            throw new IllegalArgumentException("calculateType is null");
        }
        if ( calculateType.equals(AdvanceCalculateType.DIVIDE) && num2 == 0 ) {
            throw new IllegalArgumentException("num2 cannot be 0");
        }
        this.calculateType = calculateType;
        this.num1 = num1;
        this.num2 = num2;
    }

    public AdvanceCalculateType getCalculateType() {
        return calculateType;
    }

    public int getNum1() {
        return num1;
    }

    public int getNum2() {
        return num2;
    }
}

 

 

enum 으로 각 타입을 계산 합니다.

 

public enum AdvanceCalculateType {
    ADD (Integer::sum),
    MINUS ((num1, num2) -> num1 - num2),
    MULTIPLY ((num1, num2) -> num1 * num2),
    DIVIDE ((num1, num2) -> num1 / num2);

    AdvanceCalculateType(BiFunction<Integer, Integer, Integer> expression) {
        this.expression = expression;
    }

    private final BiFunction<Integer, Integer, Integer> expression;

    public int calculate(int num1, int num2) {
        return this.expression.apply(num1, num2);
    }
}

'자바' 카테고리의 다른 글

SOLID  (0) 2023.12.12
의존성 ( dependency )  (0) 2023.12.12
Java Optional  (0) 2023.12.12
Object Class  (1) 2023.12.11
예외  (0) 2023.12.11