대부분의 프로그래밍 언어는 if/else 구문을 지원한다. 하지만 조건문이 중첩될수록 가독성은 떨어지기 마련이다. else if를 넣어 조건문의 분기를 추가하는 것은 코드를 리팩토링하는 것보다 훨씬 쉽지만 이는 가독성이 떨어지고 유지보수하기 어려운 코드를 만들어내곤 한다.
또는 return이 싫거나 함수의 반복(이 경우 redirect)을 줄이고 싶을 경우 이런 방법도 가능하다.
const login = (username: string, password: string) => {
let redirectRoute = 'homepage'
if (!userRepository.isValid(username, password)) {
addFlash('ERROR', '잘못된 인증 정보입니다.');
redirectRoute = 'login';
}
redirect(redirectRoute);
};
필자의 경우는 early return을 하는 방어적 프로그래밍의 방식을 선호한다. 순서만 바뀌었을뿐이지만, 개인적으로 예외상황을 먼저 처리한다면 null이나 undefined를 처리할 때 TypeError를 잡기도 용이하고 기본 로직을 확장하기 좋다고 생각한다.
객체지향 프로그래밍의 [다형성](https://ko.wikipedia.org/wiki//다형성_(컴퓨터_과학))을 활용한 상태 패턴과 전략 패턴을 사용하는 방법도 있다. 이런 패턴들을 사용한다면 상태(Unauthorized, Authorized)에 따라 수행되는 로직(next)을 캡슐화 할 수 있고, 코드를 수직이 아닌 수평적으로 확장할 수 있다. 사실 적당한 예시인지 모르겠지만 주요 디자인 패턴을 다룰 때 살펴보도록 하자.