코드에 눈에 띄는 버그는 없습니다. 다만 조건과 명령문이 계속 연이어 나온다는 점이 문제죠. 이렇게 되면 모든 조건과 명령문을 한 번에 읽고 이해해야 합니다. 중첩이 별로 없는 작은 예제이므로 별로 어렵지 않습니다. 하지만 현실에서는 구조가 커질 수 있고 이해하기 매우 힘들어질 수 있습니다.
본질적인 문제는 코드 대칭성(code symmetry)의 부재입니다. 켄트 벡(Kent Beck)이 내린, 다음과 같은 정의를 한 번 봅시다.* “거의 같은 것들은 똑같은 부분과 완전히 다른 부분으로 나눌 수 있다.”
생각해보세요. 모든 분기가 비슷한 관심사를 표현하나요? 병렬 구조를 띠나요? 아니면 세 가지 분기 모두 정말 대칭인가요?
정답은 “그렇지 않다”입니다. 첫 번째 분기는 접근을 거절합니다. 두 번째와 세 번째 분기는 접근을 부여합니다. 대칭이 아니죠.
그러면 코드를 대칭적으로 바꾸면 어떤 모습일까요?
class BoardComputer { CruiseControl cruiseControl; void authorize(User user) { Objects.requireNonNull(user); if (user.isUnknown()) { cruiseControl.logUnauthorizedAccessAttempt(); return; } if (user.isAstronaut()) { cruiseControl.grantAccess(user); } else if (user.isCommander()) { cruiseControl.grantAccess(user); cruiseControl.grantAdminAccess(user); } } }