Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 8-3. 데이터 조작화 (파생 변수를 질의 함수로 바꾸기) 본문

Refactoring (리펙토링)

[Refactoring] 8-3. 데이터 조작화 (파생 변수를 질의 함수로 바꾸기)

jake-kim 2023. 5. 14. 01:35

파생 변수를 질의 함수로 바꾸기

  • 파생(Derived) 변수: 사용하는쪽에서 관심 밖의 변수들에도 영향을 주는 것
  • 질의(Query) 함수: 사용하는쪽에서 관심 대상인 변수에만 영향을 주는 것 (단순 get, set)
  • 파생 변수를 질의 함수로 바꾸기 리펙토링: 가변 데이터의 유효 범위를 줄이는 것
    • 가변 데이터가 많아지면 한 쪽 코드에서 수정한 값이 연쇄 효과를 일으켜 다른 쪽 코드에 영향을 주어, 원인을 찾기 어려운 문제를 야기하므로 가변 데이터의 유효 범위를 줄이는 리펙토링이 필요

 

파생 변수를 질의 함수로 바꾸기

파생 변수를 질의 함수로 리펙토링 예시)

  • Price에서 구조는 매우 안좋은 구조
    • discountedTotal의 정보를 변경하기 위해 setDiscountedTotal(number:)를 호출했더니 의도치 않게 안에서 discount 필드도 변경함
    • 개발자는 인터페이스만 보고 discount가 변경된다는 것을 예측하기가 힘듦
    • 가변 데이터 (discount)의 유효 범위를 줄이는 방향으로 리펙토링하면?
struct Price {
    private var discountedTotal: Double
    private var discount: Double
    
    func getDiscountedTotal() -> Double {
        discountedTotal
    }
    
    mutating func setDiscountedTotal(number: Double) {
        let old = discount
        discount = number
        discountedTotal += old - number
    }
}
  • 리펙토링
    • setDiscountedTotal 메소드 수정을 하고 discountedTotal을 제거하며 가져올때(get) 계산하도록 수정
    • set에서는 단순히 원하는 값만 변경해주도록 변경
struct RefactorPrice {
    private let baseTotal: Double
    private var discount: Double
    
    func getDiscountedTotal() -> Double {
        baseTotal - discount
    }
    
    mutating func setDiscount(number: Double) {
        discount = number
    }
}
  • 리펙토링 결과
    • setDiscount(number:) 에서 개발자가 원하는 필드만 변경하게끔하여 가변 데이터의 유효 범위를 줄였으므로, 원하지 않는 변경을 막아 연쇄 효과가 줄어들게 만듦
    • 개발자 입장에서 메소드 시그니처만 보더라도 코드가 예측 가능하게되어 개발 속도도 향상

* 전체 코드: https://github.com/JK0369/ExRefactoring8_3

* 참고

- Refactoring (Martin fowler)

Comments