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 |
Tags
- 애니메이션
- uiscrollview
- Xcode
- HIG
- UITextView
- MVVM
- clean architecture
- 리펙토링
- uitableview
- rxswift
- Protocol
- 리팩토링
- ios
- swift documentation
- tableView
- RxCocoa
- 스위프트
- Refactoring
- combine
- swiftUI
- Human interface guide
- Observable
- 클린 코드
- ribs
- collectionview
- 리펙터링
- UICollectionView
- SWIFT
- Clean Code
- map
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[Refactoring] 8-1. 데이터 조작화 (변수 쪼개기) 본문
변수 쪼개기
- 한 변수에 대입이 두 번 이상 이뤄진다면, 한 변수가 여러 가지 역할을 수행한다는 의미이므로 변수를 쪼개서 역할을 나누어야함
- 여러 용도로 변수가 사용되면 코드를 읽는 사람에게 혼란을 주기 때문에 변수를 쪼갤것
- 하나의 변수에는 하나의 대입 (= 하나의 역할)을 하게 하기 위해서 가능하면 변수를 불변으로 선언할 것
ex) for문에서의 i값은 불변(immutable)로 선언되어 있고, 재활용하지 않으며 매번 새로운 i로 선언됨
// i변수는 내부적으로 let으로 선언되어, 한 변수에 여러번의 대입이 되지 않도록 되어있음
for i in 0...10 {
print(i)
}
변수 쪼개기 예제 1
- 여행한 거리를 구하는 함수 distanceTravelled(value:time:)에서 accerlaeration 변수는 2번 대입되고 있는 상태
- accerleration은 2가지 역할을 하고 있기 때문에 변경이 필요
- 첫번째 accerleration 대입 -
- 두번째 accerleration 대입 -
struct Value {
let primaryForce: CGFloat // 힘
let secondaryForce: CGFloat // 힘
let mass: CGFloat // 질량
let delay: Date
}
func distanceTravelled(value: Value, time: Double) -> CGFloat {
var result: CGFloat
// 가속도 = 힘 / 질량
// 1. acceleration 변수 쓰임 첫번째
var acceleration = value.primaryForce / value.mass
let primaryTime = min(time, value.delay)
result = 0.5 * acceleration * primaryTime * primaryTime // 전파된 거리
let secondaryTime = time - value.delay
if secondaryTime > 0 {
let primaryVelocity = acceleration * value.delay
// 2. acceleration 변수 쓰임 두번째
acceleration = (value.primaryForce + value.secondaryForce)
result += primaryVelocity * secondaryTime + 0.5 * acceleration * secondaryTime * secondaryTime
}
return result
}
- 변수 쪼개기 리펙토링
- 변수에 새로운 이름 부여
- let 키워드를 사용하여 불변으로 변경
- 두 번째로 대입할 변수를 다시 선언
func refactor1_distanceTravelled(value: Value, time: Double) -> CGFloat {
var result: CGFloat
// 1. 이름변경 && let 키워드 사용: acceleration > primaryAcceleration
let primaryAcceleration = value.primaryForce / value.mass
let primaryTime = min(time, value.delay)
result = 0.5 * primaryAcceleration * primaryTime * primaryTime
let secondaryTime = time - value.delay
if secondaryTime > 0 {
let primaryVelocity = primaryAcceleration * value.delay
// 2. 새로운 let 변수로 수정
let acceleration = (value.primaryForce + value.secondaryForce)
result += primaryVelocity * secondaryTime + 0.5 * acceleration * secondaryTime * secondaryTime
}
return result
}
- 두번째 변수도 이름 변경
func refactor2_distanceTravelled(value: Value, time: Double) -> CGFloat {
var result: CGFloat
let primaryAcceleration = value.primaryForce / value.mass
let primaryTime = min(time, value.delay)
result = 0.5 * primaryAcceleration * primaryTime * primaryTime
let secondaryTime = time - value.delay
if secondaryTime > 0 {
let primaryVelocity = primaryAcceleration * value.delay
// 이름변경: acceleration > primaryAcceleration
let secondaryAcceleration = (value.primaryForce + value.secondaryForce)
result += primaryVelocity * secondaryTime + 0.5 * secondaryAcceleration * secondaryTime * secondaryTime
}
return result
}
* 전체 코드: https://github.com/JK0369/ExRefactoring8_1
* 참고
- Refactoring (Marting Flowler)
'Refactoring (리펙토링)' 카테고리의 다른 글
[Refactoring] 8-4 데이터 조작화 (참조를 값을 바꾸기) (0) | 2023.05.15 |
---|---|
[Refactoring] 8-3. 데이터 조작화 (파생 변수를 질의 함수로 바꾸기) (0) | 2023.05.14 |
[Refactoring] 7-8. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문을 파이프라인으로 바꾸기, 선언형 프로그래밍 (0) | 2023.04.28 |
[Refactoring] 7-7. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문 쪼개기 (0) | 2023.04.27 |
[Refactoring] 7-6. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 문장 슬라이드 (0) | 2023.04.25 |
Comments