더북(TheBook)

여러 조건문을 하나로 합쳐 확인해야 한다면 다른 식으로 묶는 것이 낫습니다. 훌륭한 그루핑이란 조건의 의미에 따라 좌우되니 주제나 추상화 정도에 따라 그루핑하세요.

한 메서드 안에서는 추상화 수준이 비슷하도록 명령문을 합쳐야 합니다. 더 높은 수준의 메서드가 다음으로 낮은 수준의 메서드를 호출하는 것이 이상적이죠.

유용한 괄호

불 조건은 특히 괄호가 없으면 다루기 까다롭습니다. 많은 개발자(그리고 우리 스스로)는 불 연산자 우선순위를 따로 기억하지 못하며 x && y || z(x && y) || z인지 x && (y || z)인지 알려면 잠시 생각해야 하죠. &&가 항상 ||보다 먼저 평가된다는 사실, 알고 있었나요?

예제의 willCrewSurvive() 메서드는 한 조건문 안에서 낮은 수준의 각 세부 내용을 확인합니다. 상호 추상화 정도가 어떤가요? 아래처럼 코드를 바꾸면 어떨까요?

class SpaceShip {

    Crew crew;
    FuelTank fuelTank;
    Hull hull;
    Navigator navigator;
    OxygenTank oxygenTank;

    boolean willCrewSurvive() {
        boolean hasEnoughResources = hasEnoughFuel() && hasEnoughOxygen();
        return hull.isIntact() && hasEnoughResources;
    }

    private boolean hasEnoughOxygen() {
        return oxygenTank.lastsFor(crew.size) > navigator.timeToEarth();
    }

    private boolean hasEnoughFuel() {
        return fuelTank.fuel >= navigator.requiredFuelToEarth();
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.