지난 글에서 [불 표현식을 직접 반환] 하는 방법을 적용하여 반환문을 하나로 압축하였다. 그러나 하나의 반환문에 여러 조건문을 합쳐 조건문이 이전보다 복잡해지게 되었다. 복잡해진 조건문을 어떻게 간소화할 수 있을까?
boolean willCrewSurvive() {
return hull.holes == 0 &&
fuelTank.fuel >= navigator.requiredFuelToEarth() &&
oxygenTank.lastsFor(crew.size) > navigator.timeToEarth();
}
위 코드는 조건문이 너무 길어 이해하기가 어렵다. 길이가 길다 보니 일부를 변경해야 할 때 실수가 발생하기 쉽고, 조건문의 의미를 이해하는 데에 비용(시간)이 발생한다.
boolean willCrewSurvive() {
boolean hasEnoughResources = hasEnoughFuel() && hasEnoughOxygen();
return hull.isIntact() && hasEnoughResources;
}
private boolean hasEnoughFuel() {
return fuelTank.fuel >= navigator.requiredFuelToEarth();
}
private boolean hasEnoughOxygen() {
return oxygenTank.lastsFor(crew.size) > navigator.timeToEarth();
}
여러 조건문을 하나로 합쳐 확인해야 할 경우 조건의 의미에 따라 그룹핑하는 것이 좋다.
한 메서드 안에서는 추상화 수준이 비슷하도록 명령문을 합쳐야 한다. 더 높은 수준의 메서드가 다음으로 낮은 수준의 메서드를 호출하도록 한다.
위의 코드는 코드 행은 늘었지만 코드 이해도는 훨씬 향상되었다. 커다란 조건문을 한 번에 이해할 필요없이 의미 단계별로 이해가 가능하다. 또한 변수명과 메서드명으로 원하는 결과를 표현하는 것이 가능하다.