Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 9-6 조건부 로직 최소화 (Assertion 추가하기) 본문

Refactoring (리펙토링)

[Refactoring] 9-6 조건부 로직 최소화 (Assertion 추가하기)

jake-kim 2023. 6. 5. 22:43

Assertion 추가하기

  • 특정 조건이 참일 때만 동작하도록 하는 코드 영역이 있는데, 이러한 기능을 development 타겟에만 적용시켜서, 사전에 개발할 때 실수를 방지하도록 하는 기능
    • 이러한 가정이 코드에 항상 명시적으로 기술되어 있지 않거나 이런 명시적인 것을 못보고 개발을 할 때 실수를 막기 위하여 assertion을 넣는 것
  • assertion 추가 시 주의사항
    • assertion 실패는 시스템의 다른 부분에 영향을 주지 않아야함
    • development 타겟에만 적용시켜 운영에서는 영향을 주지 않도록 해야함
  • assertion은 개발자가 실수를 할만한 곳이나 버그를 잡은 후에도 assertion을 넣으면 다른 개발자가 실수할 확률을 줄어주기 때문에 좋은 코드

어서션 추가하기 도식화

Assertion 리펙토링하기

  • swift에서는 다양한 Assertion이 있는데, 대표적인 assert()만 알아도 무방
    • swift에서의 Assertion 내용은 이전 포스팅 글 참고 (Optimization Level 개념과 assert, assertFailure, precondition, preconditionFailure, fatalError 사용 방법)
  • assert(condition, message)는 안에 들어갈 값이 true여야하며, false인 경우 message를 출력하며 크래시가 발생함
    • 단, assert(condition, message)는 debug모드에서만 동작

ex) 손님이 있고, 이 손님의 계산을 도와주는 applyDiscount(number:) 메소드가 존재

struct Customer {
    var discountRate = 0.8
    var discounted = false
    
    func applyDiscount(number: Double) -> Double {
        discounted ? number * discountRate : number
    }
}
  • 만약 위 코드를 포함한 프로그램이 몇만줄인데 API 요청한 discount 값을 보니 음수로 찍힌 상태 -> 에러가 난 곳을 찾기가 힘듦
    • assertion을 사용하면 어디서 에러가 났는지 쉽게 파악이 사전에 가능
struct Customer {
    var discountRate = 0.8
    var discounted = false
    
    func applyDiscount(number: Double) -> Double {
        assert(0 < number && 0 < discountRate, "number와 discountRate는 양수여야합니다.")
        
        return discounted ? number * discountRate : number
    }
}

* 참고

- Refactoring (Martin Flowler)

Comments