Categories
Programming

Early Returns

오늘은 Early Returns 에 관하여 이야기 해보려 한다. 한국어로는 조기리턴 이라고도 한다.

Early Returns 란 쉽게 말해서 조건이 맞을시, 바로바로 리턴 해버리는 패턴을 이야기한다.

예를 들어보자. 언어는 Go 이다. 주어진 연도가 윤년인지 아닌지 구분하는 함수이다.

// Early Return 사용한 예
func isLeapYear(year int) bool {
	if year % 4 == 0 && year % 100 != 0 {
		return true
	}
	if year % 400 == 0 {
		return true
	}
	return false
}

위 코드는 분명 이렇게도 쓸수있다.

// Early Return 사용 하지 않은 예
func isLeapYear(year int) bool {
	if (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 {
		return true
	} else {
		return false
	}
}

언뜻 보면 별 차이 없어 보이고 코드도 Early Return 을 사용하지 않은 예가 라인 수도 더 적다. 하지만 Early Returns 는 다음과 같은 장점을 갖는다.

  1. return false 코드를 보면 한칸 덜 들여쓰기 되어있다. 즉 그만큼 코드가 더 간결해진다.
  2. 만약 return false 같은 간결한 구문이 아니고 여러가지 연산이 필요한 코드라면 그 위의 조건들에 부합한다면 그 다음 코드가 사용되지 않는다는 확신을 쉽게 가질수 있다.
  3. 위 이유만큼 간결해 지면서 이에 대한 테스트 또한 쓰기 쉬워진다.

이러한 컨셉은 루프문에서도 사용가능하다. 주어진 기간 동안의 윤년들을 리턴하는 함수이다

func getLeapYears(start int, end int) []int {
	leapYears := []int{}
	for year := start; year <= end; year++ {
		if !isLeapYear(year) {
			continue
		}
		leapYears = append(leapYears, year)
	}
	return leapYears
}

위 예에서 보다시피 isLeapYear(year)false 리턴시 바로 continue 를 해버림으로써 Early Returns 와 같은 효과를 볼 수 있다.

사실 Early Returns 는 어디까지나 개발자의 취향이다. 나는 개인적으로 많이 선호하는 편이나 별로 좋아하지 않은 사람들도 있다. 가장 중요한건 읽기 쉬운 코드를 작성하는 것이라 본다.