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)