Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- RxCocoa
- UITextView
- Xcode
- collectionview
- uiscrollview
- Refactoring
- HIG
- 리펙토링
- ios
- Clean Code
- tableView
- Protocol
- 클린 코드
- swiftUI
- clean architecture
- 리팩토링
- SWIFT
- uitableview
- rxswift
- UICollectionView
- map
- 애니메이션
- 리펙터링
- swift documentation
- ribs
- 스위프트
- Observable
- MVVM
- combine
- Human interface guide
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[Refactoring] 10-6 API 리펙토링 (오류 코드를 예외로 바꾸기) 본문
오류 코드를 예외로 바꾸기
- 하드코딩된 상수인 매직 넘버를 사용하여 오류처리를 하는 경우가 있는데, 매직 넘버를 사용하면 의미나 목적을 이해할 수 없으므로 매직 넘버를 사용하면 안좋고 예외로 바꾸어야함
ex) 매직 넘버 예시
// 매직 넘버를 사용한 예시
func calculateAreaOfCircle(radius: Double) -> Double {
return 3.14159 * radius * radius
}
// 매직 넘버를 상수로 대체
let pi = 3.14159
func calculateAreaOfCircle(radius: Double) -> Double {
return pi * radius * radius
}
ex) 예외 처리를 하지 않은 오류
enum FetchItemType: CaseIterable {
static var allCases: [FetchItemType] = [.item(""), .fail]
case item(String)
case fail
}
let item = fetchItem()
print(item)
private func fetchItem() -> FetchItemType {
FetchItemType.allCases.randomElement()!
}
예외 처리의 핵심
- 예외를 던지는 곳은 어디에서나 가능하지만, 예외를 처리하는 곳은 콜스택 가장 상위여야함
- 예외를 처리하는 곳은 콜스택 가장 상위라는 의미는, 예외를 던지는 함수에서는 계속 위로 예외를 던지는 코드를 만들어야함
- 콜스택 가장 상위여야하는 이유?
- 함수를 사용하는 쪽에서 예측가능하도록 함수를 작성해야 처음 보든 개발자라도 쉽게 수정하고 유지보수에 유리한 코드 관리가 가능
- 콜스택 가장 상위까지 오류를 던지지 않고 중간에 처리하는 경우, 어떤 처리가 들어갈지 함수를 사용하는 쪽에서 예측이 힘들어지므로 가장 상위로 예외를 던지는 것이 중요
- A, B, C 함수가 있을 때, A에서 B를 호출하고 B에서 C를 호출하면 C에서 예외가 A까지 도달해야함
- 아래처럼 C에서 예외를 던지는 코드가 있다면, 콜스택 가장 상위인 A에게 에러를 던지기 위해서 B에서도 에러를 던지는 키워드인 throws를 붙여서 구현하는것이 바람직함
- B에서 단순히 에러를 위로 토스하려면 try키워드만 붙여줌
func A() {
do {
try B()
} catch {
print(error)
}
}
func B() throws {
try C()
}
func C() throws {
if Bool.random() {
print("success")
} else {
throw MyErrorType.myError
}
}
'Refactoring (리펙토링)' 카테고리의 다른 글
[Refactoring] 11-2 상속 리펙토링 (enum case 타입 코드를 서브클래스로 바꾸기) (1) | 2023.07.25 |
---|---|
[Refactoring] 11-1 상속 리펙토링 (메서드 올리기) (0) | 2023.07.15 |
[Refactoring] 10-5 API 리펙토링 (수정된 값 반환하기) (0) | 2023.07.12 |
[Refactoring] 10-4 API 리펙토링 (매개변수를 질의 함수로 바꾸기) (0) | 2023.07.09 |
[Refactoring] 10-3 API 리펙토링 (공통 모델에서 필요한 부분을 protocol을 사용하여 가져오기) (0) | 2023.07.07 |
Comments