관리 메뉴

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

[Refactoring] 8-1. 데이터 조작화 (변수 쪼개기) 본문

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)

Comments