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조건으로 적용한다는 원리를 이해하면 조건문을 읽기 쉽게 작성이 가능