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 | 31 |
Tags
- 리펙토링
- rxswift
- 클린 코드
- map
- Human interface guide
- Xcode
- Protocol
- Observable
- HIG
- SWIFT
- uiscrollview
- RxCocoa
- Refactoring
- MVVM
- UITextView
- uitableview
- 리팩토링
- tableView
- swiftUI
- 애니메이션
- clean architecture
- Clean Code
- ios
- 리펙터링
- 스위프트
- swift documentation
- combine
- collectionview
- UICollectionView
- ribs
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[Refactoring] 8-3. 데이터 조작화 (파생 변수를 질의 함수로 바꾸기) 본문
파생 변수를 질의 함수로 바꾸기
- 파생(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)
'Refactoring (리펙토링)' 카테고리의 다른 글
[iOS - swift] Protocol 지향 프로그래밍 (상속보다 프로토콜을 사용하는게 좋은 이유, 인터페이스, DIP, SRP) (0) | 2023.05.21 |
---|---|
[Refactoring] 8-4 데이터 조작화 (참조를 값을 바꾸기) (0) | 2023.05.15 |
[Refactoring] 8-1. 데이터 조작화 (변수 쪼개기) (0) | 2023.05.12 |
[Refactoring] 7-8. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문을 파이프라인으로 바꾸기, 선언형 프로그래밍 (0) | 2023.04.28 |
[Refactoring] 7-7. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문 쪼개기 (0) | 2023.04.27 |
Comments