[Refactoring] Guard Clauses

CheolHyeon Park·2022년 11월 3일
0

기초지식

목록 보기
3/15
post-custom-banner

😀 gaurd Clauses가 뭐지?

위키피디아에서 guard code를 아래와 같이 설명한다.

💡 Regardless of which programming language is used, guard code or a guard clause is a check of integrity preconditions used to avoid errors during execution. - Wikipedia

guard는 전제조건의 무결성을 확인하는 코드라고 적혀있다. 이는 guard code 이후 실행되는 코드는 전제조건을 만족한다는 것이다.
이를 이용하여, if문의 중첩을 줄일 수 있다.

🧐 언제 사용해?

주로 if - else if문이 여러개 중첩할 때 사용을 고려해볼 수 있고, if문의 조건 중 한 조건의 분기문이 간단하면 사용하기에 좋다.

guard하고 싶은 예

const convertUser = function(user) {
  if (user) {
    if(user.country === 'KOR' || user.country === 'NZL') {
      if(user.language === 'en') {
        // 복잡한 코드
        return user;
      } else {
        throw Error('영어안써요');
      }
    } else {
      throw Error('한국인, 뉴질랜드인이 아니예요');
    }
  } else {
    throw Error('유저가 없어요.');
  }
}

❓ 왜 사용해?

평탄화 작업을 통해 코드를 읽기 쉽게 만들어 준다.

그러면 위 코드는 왜 읽기 힘들까?

  • 들여쓰기가 가독성을 떨어뜨린다.
    if 문의 내용이 길다면 위 아래로 스크롤을 하며 읽어야 되기 때문이다.
  • 한번에 생각해야 할 조건이 많다.
    위 함수에서 복잡한 부분을 이해하려면 복잡한 부분의 내용뿐만 아니라, if 조건에 있는 user.language === 'en', user.country === 'KOR', user.country === 'NZL'와 같은 조건들도 고려하여 코드를 해석해야 한다. 이는 코드를 읽기 어렵게 하는 요인이다. (뇌의 처리 능력 부족)

👨🏻‍💻 어떻게 사용해?

const convertUser = function(user) {
  if (!user) {
    throw Error('유저가 없어요.');
  }
 
  if (!isNzlOrKor(user)) {
    throw Error('한국인, 뉴질랜드인이 아니예요');
  };
  
  if (!isAvailableEnglish(user)) {
    throw Error('영어안써요');
  }
  
  // 복잡한 코드
  return user;
}

const isNzlOrKor = function(user) {
 return user.country === 'KOR' || user.country === 'NZL' 
}

const isAvailableEnglish = function(user) {
 return user.language === 'en' 
}
  • 큰 범위의 조건부터 guard code를 작성한다.
    user가 있는지 없는지가 user.country보다 더 큰 범주이다. 그렇기에 user를 이용하여 guard code를 작성한다.
  • 조건이 복잡하면 함수로 로직을 분리하여 처리한다.
    isNzlOrKor와 같은 함수를 통해 조건의 가독성 좋게 만들 수 있다.

참고: Refactoring: Guard Clauses

profile
나무아래에 앉아, 코딩하는 개발자가 되고 싶은 박철현 블로그입니다.
post-custom-banner

0개의 댓글