Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 7-2. 기능 이동 (함수 옮기기, 중첩함수 제거, 모듈성) - 필드 옮기기 본문

Refactoring (리펙토링)

[Refactoring] 7-2. 기능 이동 (함수 옮기기, 중첩함수 제거, 모듈성) - 필드 옮기기

jake-kim 2023. 4. 17. 01:34

필드 옮기기

  • 데이터구조에서 맥락상 어울리지 않는 필드가 있다면 필드를 옮기는 방법

필드 옮기기

필드 옮기기가 필요한 배경

  • 프로그램이 상당 부분 동작을 구현하는 코드로 이뤄지지만, 데이터 구조를 잘 활용하면 코드는 자연스럽게 단순하고 직관적으로 변경
  • 데이터 구조를 잘못 선정하면 아귀가 맞지 않는 데이터를 다루기 위한 코드로 범벅되고 데이터 구조파악도 힘들게 됨
  • 현재 데이터 구조가 적절치 않음을 깨닫게 된다면 곧바로 수정이 필요

ex) 필드 옮기기를 수행해야하는 상황

  • 함수에 어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 넘기고 있는 경우
  • 한 레코드를 변경하려 할 때 다른 레코드의 필드까지 변경해야하는 경우
  • 레코드 뿐만이 아닌 클래스나 객체도 동일

필드 옮기기 리펙토링

ex) 고객(Customer)과 계약정보(CustomerContract)가 있을 때, 고객 모델에 discountRate 필드가 있는데 이 필드는 CustomerContract에 있어야 더 어울리는 상황

struct Customer {
    let name: String
    let discountRate: Double
    let contract: CustomerContract
    
    func getDiscountRate() -> Double {
        discountRate
    }
}

struct CustomerContract {
    
}
  • CustomerContract에 discountRate를 넣고 모델 수정
struct Customer {
    let name: String
    let contract: CustomerContract
    
    func getDiscountRate() -> Double {
        contract.discountRate // <-
    }
}

struct CustomerContract {
    let discountRate: Double // <-
}
  • 사용하는쪽에서는 customer인스턴스만 알고있다고 생각하면, customer쪽에서 discountRate를 변경해야 한다면 Customer에 setter도 추가
    • swift에서는 computed property가 있으므로 이것으로 getter, setter 사용
struct Customer {
    let name: String
    var contract: CustomerContract
    
    var discountRate: Double { // <-
        get { contract.discountRate }
        set { contract.discountRate = newValue }
    }
}

* 참고

- Refactoring (Marting Flowler)

Comments