else 피하기

ljjunh·2024년 11월 16일

clean-code-javascript

목록 보기
15/38
post-thumbnail

else 구문의 논리적 / 스타일적 문제

논리적 문제

  • if-else 구문은 함수의 '반전된 기능'을 암시함
  • 참인 경우와 거짓인 경우가 명시적으로 대비되어 있음
  • 이는 코드를 읽는 사람에게 "두 가지 상반된 경우를 처리하는 함수"라는 잘못된 인상을 줄 수 있음

스타일적 문제

  • 불필요한 코드 블록 증가
  • 조건문의 복잡도 상승

🔍 1. 개선 방법 비교

기존 방식 (안티 패턴)

function getActiveUserName(user){
	if(user.name){
		return user.name;
	} else {            // 👎 불필요한 else 블록
		return '이름없음';
	}
}

단축 평가 활용

function getActiveUserName(user){
	return user.name || '이름없음'; // 👍 단순한 폴백(fallback) 값 처리
}

Early Return 패턴

function getActiveUserName(user){
	if(user.name){
		return user.name;
	}
	return '이름없음'; // 👍 기본값으로서의 의미가 더 명확
}

💡 개선효과

  • 의미적 명확성
    • 조건부 반환이 아닌 “기본값 처리”라는 의도가 더 잘 드러남
    • 반전된 기능이라는 오해를 피할 수 있음
  • 코드 단순화
    • 불필요한 else 블록 제거
    • 로직의 흐름이 더 자연스러움
  • 유지보수성
    • 조건 추가, 수정이 용이
    • 코드의 의도 파악이 쉬움

📌 2. Early Return과 코드 평탄화로 가독성 높이기

❌ 안티 패턴: 깊은 중첩

function loginService(isLogin, user){
	if (!isLogin){
		if (checkToken()){           // 👎 과도한 중첩
			if(!user.nickName){        // 👎 판단하기 어려운 로직
				return registerUser(user);
			} else {
				refreshToken();
				return '로그인 성공';
			}
		} else {
			throw new Error('No Token');
		}
	}
}

🚨 이런 코드의 문제점

  • 인지 부하 증가 : 개발자가 여러 단계의 중첩을 머릿속에서 추적해야 함
  • 디버깅 어려움 : 어느 조건에서 문제가 발생했는지 파악하기 힘듦
  • 수정 위험 : 중첩 구조를 건드리면 예상치 못한 부작용 발생 가능

✅ Early Return + 함수 분리

function login() {                    // 👍 관심사 분리
    refreshToken();
    return '로그인 성공';
}

function loginService(isLogin, user) {
    if (isLogin) {                    // 👍 빠른 반환
        return;
    }
    
    if (!checkToken()) {              // 👍 명확한 에러 처리
        throw new Error('No Token');
    }
    
    if (!user.nickName) {             // 👍 평탄화된 조건문
        return registerUser(user);
    }
    
    return login();                   // 👍 추상화된 로직
}

💫 개선점

  1. 관심사 분리
    1. 각 기능의 책임이 명확해짐
  2. 조건문 평탄화
    1. 중첩 대신 순차적 구조로 변경
    2. 로직의 흐름을 한눈에 파악 가능
  3. 예외 처리 명확화
    1. 실패 케이스를 먼저 처리
    2. 해피 패스가 더 명확해짐

📌 3. 의존성이 많은 로직 개선하기

❌ 안티 패턴: 조건문 중첩

function 오늘하루(condition, weather, isJob) {
    if (condition === 'GOOD') {       // 👎 불필요한 중첩
        공부();
        게임();
        유튜브보기();
        
        if (weather === 'GOOD') {     // 👎 가독성 저하
            운동();
            빨래();
        }
        
        if (isJob === 'GOOD') {
            야근();
            취침();
        }
    }
}

✅ Early Return + 평탄화

function 오늘하루(condition, weather, isJob) {
    if (condition !== 'GOOD') {       // 👍 early return
        return;
    }

    // 👍 조건 없이 항상 실행
    공부();
    게임();
    유튜브보기();

    // 👍 평탄화된 조건부 활동
    if (weather === 'GOOD') {
        운동();
        빨래();
    }
    
    if (isJob === 'GOOD') {
        야근();
        취침();
    }
}

💡 개선효과

Early Return 활용

  • 실패 조건을 먼저 처리
  • 중첩 제거로 가독성 향상

의존성 평탄화

  • 조건부 로직을 동일한 레벨로 구성
  • 로직 흐름을 명확하게 표현

구조적 이점

  • 코드 확장이 용이
  • 조건 추가, 수정이 간단
profile
Hello

0개의 댓글