부정 피하기

A Kind Dev·2022년 7월 13일
0

자바 코딩의 기술

목록 보기
3/7
post-thumbnail

코드에서는 긍정 표현식이 부정 표현식보다 낫다. 이해하기가 더 쉽고 공간도 (조금일지라도) 덜 차지한다.


잘못된 코드

class Laboratory {

    Microscope microscope;

    Result analyze(Sample sample) {
        if (microscope.isInorganic(sample) {
        	return Result.INORGANIC;
        } else {
        	return analyzeOrganic(sample);
        }
    }
    
    private Result analyzeOrganic(Sample sample) {
        if (!microscope.isHumanoid(sample) {
        	return Result.ALIEN;
        } else {
        	return Result.HUMANOID;
        }
    }
}

사실 위 코드는 명백히 잘못된 코드는 아니다. 코드의 목적에는 부합하지만, 표현하고자 하는 의도를 필요 이상으로 복잡하게 표현하고 있다.

위 코드의 If 조건문은 둘 다 부정 조건을 표현하고 있다. 첫 번째 조건문은 샘플이 isInorganic 인지를 테스트하며, 두 번째 조건문은 아예 대놓고 '!' 연산자를 사용하고 있다.


올바른 코드

class Laboratory {

    Microscope microscope;

    Result analyze(Sample sample) {
        if (microscope.isOrganic(sample) {
        	return analyzeOrganic(sample);
        } else {
        	return Result.INORGANIC;
        }
    }
    
    private Result analyzeOrganic(Sample sample) {
        if (microscope.isHumanoid(sample) {
        	return Result.HUMANOID;
        } else {
        	return Result.ALIEN;
        }
    }
}

위 코드는 부정 표현인 isInorganic() 대신 isOrganic() 을 호출하면서 if 와 else 블록의 본문을 서로 바꾸었다. 또한 isHumanoid() 를 똑같이 호출하되 부정을 제거하면서 마찬가지로 if 와 else 블록의 본문을 서로 바꾸었다.

이로써 코드를 좀 더 쉽게 직관적으로 이해할 수 있게 되었다.


결론

코드를 읽을 때는 일반적으로 긍정 표현을 이해하기가 더 쉽다. 부정 표현은 간접적인 행동 계층을 하나 더 추가하기 때문이다. 단순히 'X가 해당된다' 에 더하여 'X가 해당되지 않는다' 라는 표현을 추가로 이해해야 한다.

추가 표현은 대부분 불필요하다. 사소한 부분처럼 보일 수 있지만 이러한 작은 추가 표현들이 모이면 거대하고 복잡한 쓰레기 코드가 양산될 가능성이 커진다.

"긍정 표현을 사용한다" 는 원칙이 너무나 간단해 이렇게까지 해야 하는지 의문이 생길 수도 있다. 그러나 간단하기 때문에 더더욱 지켜야 한다. 코드 이해도를 높이는 데에 사실상 아무 비용이 들지 않는다 는 것과 같기 때문이다! 코드를 추가할 필요없이 기존 코드에서 불필요한 부분을 제거하고 순서를 재정렬하기만 하면 된다.

긍정적인 메서드와 부정적인 메서드가 둘다 필요한 경우도 있을 수 있겠다. 하지만 가능하다면 되도록 긍정적인 메서드로 부정적인 메서드를 대체하는 것이 좋다. 코드의 중복을 줄이게 되고, 긍정적인 메서드의 재사용성도 높아지기 때문이다. 굳이 비슷한 메서드 (부정적인 메서드)를 유지하여 코드를 중복할 필요는 없다.


출처 : [자바 코딩의 기술], 사이먼 하러 외 3인, 길벗 출판사

profile
친절한 개발자

0개의 댓글