Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 복잡한 조건문 리펙토링 (if, else, else if, guard 문) 본문

Refactoring (리펙토링)

[iOS - swift] 복잡한 조건문 리펙토링 (if, else, else if, guard 문)

jake-kim 2023. 10. 27. 01:14

복잡한 조건문

  • 보통 복잡한 조건문은 코드의 깊이가 길어지는 형태

ex) 아래처럼 맨 처음 깊이는 if-else이며, if문 하위에 또다른 if-else가 있고, else하위에 if-else가 있어서 총 깊이가 3개짜리인 조건문

let isUserLoggedIn = true
let hasSubscription = false
let isContentAvailable = true

if isUserLoggedIn {
    if hasSubscription {
        print("사용자가 로그인하고 구독이 활성화되어 있습니다.")
    } else {
        if isContentAvailable {
            print("사용자가 로그인했지만 구독이 없습니다. 콘텐츠를 사용할 수 있습니다.")
        } else {
            print("사용자가 로그인했지만 구독이 없으며 콘텐츠를 사용할 수 없습니다.")
        }
    }
} else {
    print("사용자가 로그인하지 않았습니다.")
}
  • 코드의 깊이가 길어지면 길어질수록 읽기가 어려워지며, 조건들을 하나하나 비교하며 수행
  • 코드는 위에서 아래로 마치 소설처럼 자연스럽게 읽어나가야만 가독성이 좋고 이해하기 쉬운코드 유지가 가능

조건문의 깊이가 깊은 코드 리펙토링 방법

  • if-else로 시작하고, 이 if문이나 else문 하위에 또 조건문이 들어가는 경우에 가장 필요한 작업은 코드의 깊이를 줄이는 것
    • 대부분의 if-else문에 또 다른 조건문이 들어갈 때 깊이 줄이기가 가능
  • 1단계) 단순한 조건문을 앞에 배치
    • 복잡한 조건문이 초반에 등장하는것보단 단순한 조건문을 앞에 배치하고난 후 복잡한 조건문을 뒤에 배치
if !isUserLoggedIn {
    print("사용자가 로그인하지 않았습니다.")
} else {
	...
}
  • 2단계) 2중 깊이로 있던 조건문을 else if로 표현
    • if 조건문 후에는 모두 isUserLoggedIn이 true인 경우밖에 없으므로 else 하위에 따로 빼지 않아도, trure인 조건을 검사하지 않아도 되기 때문에 깊이가 줄어듦
if !isUserLoggedIn {
    print("사용자가 로그인하지 않았습니다.")
} else if hasSubscription {
    print("사용자가 로그인하고 구독이 활성화되어 있습니다.")
} else if isContentAvailable {
    ...
}
  • 3단계) 이와 동일한 논리로 isUserLoggedIn && !hasSubscription && isContentAvailable인 케이스와 isUserLoggedIn && !hasSubscription && !isContentAvailable 도 바로 뒤에 작성이 가능
if !isUserLoggedIn {
    print("사용자가 로그인하지 않았습니다.")
} else if hasSubscription {
    print("사용자가 로그인하고 구독이 활성화되어 있습니다.")
} else if isContentAvailable {
    print("사용자가 로그인했지만 구독이 없습니다. 콘텐츠를 사용할 수 있습니다.")
} else {
    print("사용자가 로그인했지만 구독이 없으며 콘텐츠를 사용할 수 없습니다.")
}

정리

  • 조건문이 깊어질수록 가독성 저하
  • else if를 사용하면 앞전 분기문에 대한 부정문이 and조건으로 적용한다는 원리를 이해하면 조건문을 읽기 쉽게 작성이 가능
Comments