개발놀이터

코딩 스탠다드 1 : if 문의 조건식이 길다면 함수로 빼버린다. 본문

리팩토링/코딩 스탠다드

코딩 스탠다드 1 : if 문의 조건식이 길다면 함수로 빼버린다.

마늘냄새폴폴 2024. 4. 29. 21:48

제목 그대로 if 문의 조건이 길다면 함수로 빼는 것이 제 첫번째 코딩 스탠다드입니다. 

 

상황) 만약 장바구니에 있는 상품 중에서 사이즈가 M인 상품을 2개 구매하려고 할 때 재고가 1개밖에 남지 않았다면 이를 막아야합니다. 

 

우리는 다음과 같은 흐름을 따라갈 것입니다. 

 

  1. 데이터베이스에서 나의 장바구니를 가져온다.
  2. 장바구니 안에 상품의 사이즈가 M인지 체크한다.
  3. 내가 고른 장바구니의 수량과 데이터베이스에 남아있는 수량을 비교한다. 
  4. 만약 재고가 더 많이 남아있으면 결제를 진행한다. 
Bucket myBucket = bucketRepository.findByLoginId(loginId);
String itemName = myBucket.getItem().getName()
Item myItem = itemRepository.findByItemName(itemName);

if (myBucket.getItem().getSize().equals("M")) {
	if (myBucket.getItem().getCount() - myItem.getStock() > 0) {
    	// payment logic
    }
}

 

 

일단 저렇게 if 문이 중첩되어있으면 하나로 합칠 수도 있을 것 같이 보입니다.

 

Bucket myBucket = bucketRepository.findByLoginId(loginId);
String itemName = myBucket.getItem().getName()
Item myItem = itemRepository.findByItemName(itemName);

if (myBucket.getItem().getSize().equals("M") && myBucket.getItem().getCount() - myItem.getStock() > 0) {
	// payment logic
}

 

들여쓰기가 하나 줄어들긴 했지만 if 문의 조건식이 굉장히 길어졌습니다. 

 

물론 나 혼자 개발하는거면 저렇게 냅둬도 상관 없을 수도 있습니다. 물론 1년뒤에 보면 까먹기 때문에 혼자 개발해도 리팩토링을 해야한다는 것이 제 생각이긴합니다만. 

 

아무튼 저렇게 길어진 조건식은 이렇게 함수로 빼면 깔끔하게 볼 수 있습니다. 

 

Bucket myBucket = bucketRepository.findByLoginId(loginId);
String itemName = myBucket.getItem().getName()
Item myItem = itemRepository.findByItemName(itemName);

if (isBucketCountOverZero()) {
	// payment logic
}

private boolean isBucketCountOverZero() {
	return myBucket.getItem().getSize().equals("M") && myBucket.getItem().getCount() - myItem.getStock() > 0
}

 

깔끔하게 코드를 리팩토링하고 나중에 이 코드를 다시 봤을 때 함수 이름으로 조건식을 짐작할 수 있기 때문에 코드가 클린해졌습니다. 

 

 

마치며

저는 if 문의 조건식이 길어지면 나중에 봤을 때 코드를 해석하기 굉장히 힘들어지기 때문에 리팩토링을 반드시 진행해야한다고 생각하는 주의입니다. 

 

if 조건식을 메서드로 모두 빼야한다고 주장하는 것은 아닙니다. if 조건식이 직관적으로 해석이 불가능할정도로 긴 경우에나 빼는 것이지 적당히 짧은건 그대로 냅둬도 된다고 생각합니다. 

 

하지만 만약 조건식이 중복되는 경우라면 반드시 메서드로 빼서 관리하는 것이 좋을 것 같습니다.