여러 조건문을 하나로 합쳐 확인해야 한다면 다른 식으로 묶는 것이 낫습니다. 훌륭한 그루핑이란 조건의 의미에 따라 좌우되니 주제나 추상화 정도에 따라 그루핑하세요.
한 메서드 안에서는 추상화 수준이 비슷하도록 명령문을 합쳐야 합니다. 더 높은 수준의 메서드가 다음으로 낮은 수준의 메서드를 호출하는 것이 이상적이죠.
⟫ 유용한 괄호
불 조건은 특히 괄호가 없으면 다루기 까다롭습니다. 많은 개발자(그리고 우리 스스로)는 불 연산자 우선순위를 따로 기억하지 못하며 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(); } }