Refactoring (리펙토링)
[Refactoring] 8-1. 데이터 조작화 (변수 쪼개기)
jake-kim
2023. 5. 12. 23:21
변수 쪼개기
- 한 변수에 대입이 두 번 이상 이뤄진다면, 한 변수가 여러 가지 역할을 수행한다는 의미이므로 변수를 쪼개서 역할을 나누어야함
- 여러 용도로 변수가 사용되면 코드를 읽는 사람에게 혼란을 주기 때문에 변수를 쪼갤것

- 하나의 변수에는 하나의 대입 (= 하나의 역할)을 하게 하기 위해서 가능하면 변수를 불변으로 선언할 것
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)