리펙토링 (10)조건문 로직 간소화

hyeok·2022년 7월 28일
0

개발을 하다보면 연속된 if문으로 인해서 혼란스러울 때가 있다.
이게 정확히 어떤 조건을 나눈 분기 처리인지 처음 짤 때는 이해 할수 있으나
나중에 시간이 좀만 지나면 이해하기 힘들다. 심지어 나도 그런데 남이 나중에 보았을 때 과연 분기를 제대로 이해할 수 있을까?
그래서 직관적으로 이해할 수 있게 if문을 나누어야만 한다.

  1. 범위를 좁혀가며 return 하기
if( A === true){
	if( B > 10){
	...		
    }else if ( B > 20 ){
	...
    } else if ( B > 30){
	..
	}
}else{
	...
}

이런 경우 조금 정신이 없다.

if (A  === true){
	if(B > 30){
		return ...
	}
    if( B > 20){
		return ...
	} 
    if( B > 10){
    	return ... 
    }
    return ...
}
return ...

이런 방식이 더 깔끔하다. 명확히 어떤 조건에 의해서 return 값이 나오는지 분명하다.

2.동일 값 return이면 OR(||) 으로 한꺼번에 묶기

if (A > 10 ) { return true }
if( B > 10 ) { return true } 

> 

if (A > 10 || B > 10 ) { return true }

다만 내 생각으론 의미론상 다른 상황에서 return 값만 같은 거라면 분리하는 게 맞다고 본다. 그래야 이게 어떤 상황에서 분기된 거란 걸 직관적으로 이해할 수 있기 때문이다.

3.function으로 따로 빼서 이게 어떤 걸 구하는 건지 명시

if( A.health === true) {
	return checkHasValidAge(A) 
}
return checkPossibilityOfRecoverHealth(A) 


function checkHasValidAge(A){
	if(A.age >20) { return true} 
    return false
}

function checkPossibilityOfRecoverHealth(A){
	if(A.Energy > 10 || A.cover > 1000) { return  true } 
    ...
    ... 
    return false
}

이렇게 function으로 해당 분기가 '이러이러한 걸 확인하고 있다'를 나누어 놓으면 따로 주석이 필요 없으며 중간중간 console을 찍어보며 디버깅 하기도 쉽다. 게다가 test할때 해당 function만 따로 test할 수 있어 좋다. 즉 이런 function을 이용한 분기 처리는 리펙토링을 용이하게 하는 방법이다.

profile
내가 만든 소프트웨어가 사람들을 즐겁게 할 수 있기 바라는 개발자

0개의 댓글