개발 , 컴퓨터, IT지식

[객체지향 생활체조 원칙] 2. else 키워드를 사용하지 마라.(2/9)

김먼저 2022. 12. 1. 15:53

 

 

 

......?? 대체 왜?? 이유가 뭐지???

 

 

대부분의 프로그래밍 언어는 if / else 구문을 지원하는데.....??

 

 

(else 쓰지말라고 해서 swich / case 사용할 생각하는 사람은 없죠...?? = 나)

 

 

이유를 검색해보자....!!

 

 

 

숨은 의미

이 원칙의 제시 의도는 한 메소드에서 발생하는 분기문을 줄이자는 것이다. 분기문을 많이 가지고 있는 메소드는 많은 기능을 가지고 있을 확률이 높다. 메소드를 분리하거나, 객체지향적인 구조를 적요해 분기문을 줄일 수 있다. 이는 결국 설계관점에서의 개선을 의미한다.

else 키워드는 '조건을 만족하지 않을 때'를 전체하고 시작한다. 가독성이 떨어질 수 밖에 없다. if 조건을 만족하지 않는 모든 경우를 의미하기 때문에, 코드를 읽을 때 양 쪽을 함께 생각해야 한다. 오류가 발생할 확률도 높다.

 

 

.....림딩동님은 독자가 이해하기 쉽게 잘 설명해주시기 때문에 자주 방문합니다!!

 

 

림딩동님의 설명을 듣고 소름이 끼쳤습니다.

 

 

 

 

 

else 키워드는 '조건을 만족하지 않을 때'를 전체하고 시작한다.

 

 

따라서, 가독성이 떨어질 수 밖에 없다.

 

 

if 조건을 만족하지 않는 모든 경우를 의미하기 때문에

 

 

코드를 읽을 때 양 쪽을 함께 생각해야 한다.

 

 

따라서, 오류가 발생할 확률도 높다.

 

 

 

위 정리로 한번에 전부 이해가 되었습니다. (림딩동님 진짜 대단하시네요.)

 

 

 

이해했지만 그래도 구현해봐야죠!!

 

 

    public int keyboard(char aa){
        int num = 0;
        
        if("a".equals(aa)){
            num = 1;
        }else if("b".equals(aa)){
            num = 2;
        }
        //.....
        else if("Z".equals(aa)){
            num = 1000000;
        }else{
            num = -1;
        }
        return num;
    }

 

위 코드는 else문 기반의 코드를 작성한 예시입니다. 코드의 길이가 길지 않고(?) 가독성도 나쁘지 않다고 느낄 수 있다.

이 메소드는 return이 맨 끝에서 이루어집니다. 모든 조건문의 분기를 다 확인하기 전까지는 메소드가 어떻게 동작할 지 알

기 어렵습니다.

 

비즈니스적 구조로 보았을 때도 문제가 있는데, 대소문자 알파벳은 'num'과 1:1 관계를 가져야하나 'num = -1'이라는 구조

에서는 N:1 관계를 가진다고 표현합니다.

 

 

else 예약어의 단점을 알아보았습니다.

 

그럼 else 없이 어떻게 코드를 짜란건가...? 어떻게 없애지....?

 

 

 

early return 구조를 적용해보자!!!

 

else문 제거의 효과적인 방법은 early return 구조를 적용하는 것이다. → 디자인 패턴 - early return pattern

 

 

    public int keyboard(char aa){

        if("a".equals(aa)){
            return 1;
        }else if("b".equals(aa)){
            return 2;
        }
        //.....
        else if("Z".equals(aa)){
            return 1000000;
        }
        throw new IllegalArgumentException("존재하지 않는 코드입니다.");
    }

early return - throw exception 구조를 적용하면 가독성을 높일 수 있다. 개발자가 의도한 조건을 만족하는 경우 메소드는 return하고 종료한다. 코드를 읽을 대 의도한 조건을 생각하고 읽어주기만 하면 된다. 먼저 리턴을 하기 때문에 메소드를 끝까지 확인하지 않아도 된다.

 

if - return 기반으로 코드를 작성하면, 코드를 읽을 때 의식의 흐름이 메소드의 동작을 위한 '참'조건을 기반으로 일어난다.

 

 

'A인 경우'를 기반으로 생각하는 것이

 

'A가 아닌 경우'를 기반으로 생각하는 것

 

보다는 훨씬 명확하고 쉽다.

 

 

한 가지 더, early return 패턴으로 코드를 작성하면

 

 

불필요한 지역변수의 생성을 막을 수 있다.

 

 

위 예시코드에서는 'num'이라는 지역변수를 선언하고 코드를 작성했는데, 이 경우 중간에 지역변수 값이 변경될 수 있다는 예외상황이 언제든지 존재할 수 있다. 결국 분석해야할 코드량을 늘리게 된다.

 

 

 

 

객체지향 설계

 

분기점이 많아진다는 것은, 클래스의 구조를 변경해야 함을 의미할 확률이 높다.

한 클래스의 여러 메소드에서 같은 유형의 분기가 발생하는 패턴이 반복된다면,

클래스를 분리해 볼 수 있는 신호가 왔다고 생각 할 수 있다.