Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - swift] 리펙토링 - 코드 수정 잘 하는 방법 (#목적지 먼저 수정하기, #필요에 의해 수정하기) 본문

Refactoring (리펙토링)

[iOS - swift] 리펙토링 - 코드 수정 잘 하는 방법 (#목적지 먼저 수정하기, #필요에 의해 수정하기)

jake-kim 2025. 4. 16. 01:06

코드 수정 잘 하는 방법

  • 코드를 수정해야하는 경우, 어떻게 하면 효율적으로 할 수 있을까?
    • 기존 화면에 새로운 요구사항이 생겨서, 기존 코드를 수정해야 할 때 효율적으로 수정하는 방법?
    • 이름을 바꾸는 등 리펙토링이 필요할 때 효율적으로 수정하는 방법?
  • 코드를 작성하는 흐름을 생각해보면 무턱대고 코드를 수정하는 것보단, 목적지 먼저 수정하는 것이 효율적으로 수정하는 방법
    • 예를 들어, A화면, B화면이 있을 때 B화면에 필요한 정보를 A로부터 받고 있는 경우, 그 정보의 이름이 바뀌면 A화면을 먼저 수정하는 것보단 B화면을 먼저 수정해나가는 것이 효율적인 수정 방법
    • 단계) B화면을 먼저 수정 -> 빌드 -> A화면에서 컴파일에러 발생 -> A화면 코드 수정
  • 필요에 의해 수정한다는 흐름으로 수정하므로 더욱 효율적으로 수정이 가능
  • 만약 화면이 A, B, C, D ... Z까지 단계적인 화면이 있을때, Z에서 이름이 바뀌어야 한다면 A먼저 바꾸어 나간다면 개발자는 코드를 수정하다가 길을 잃을 수 있음

필요에 의해 수정하기) 예시 

  • VC1 > VC2 > VC3 순서로 데이터를 넘기는 코드가 있을 때 여기서 VC3의 age 프로퍼티 타입을 String으로 바꾸어야 하는 경우?
class VC1: UIViewController {
    let someModel = SomeModel(name: "jake", age: 20, isActive: true, score: 10.0)
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc2 = VC2(name: someModel.name, age: someModel.age)
    }
}

class VC2: UIViewController {
    var name: String
    let age: Int
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc3 = VC3(age: age)
    }
}

class VC3: UIViewController {
    let age: Int
}
  • 필요의 의해 수정하기 방법은 VC1이 아닌 VC3부터 수정하는 방법
    • "VC3에서 age의 타입이 Int에서 String으로 필요하니 수정"
class VC3: UIViewController {
    let age: String
}
  • 빌드 -> VC2에서 넘겨주는 타입이 Int이므로 VC2에서 age를 String으로 수정
class VC2: UIViewController {
    var name: String
    let age: String // <-
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc3 = VC3(age: age)
    }
}
  • 빌드 -> VC1에서 Int를 넘기고 있으니 이부분 수정
class VC1: UIViewController {
    let someModel = SomeModel(name: "jake", age: "20", isActive: true, score: 10.0)
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc2 = VC2(name: someModel.name, age: someModel.age)
    }
}
  • 완성
class VC1: UIViewController {
    let someModel = SomeModel(name: "jake", age: "20", isActive: true, score: 10.0)
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc2 = VC2(name: someModel.name, age: someModel.age)
    }
}

class VC2: UIViewController {
    var name: String
    let age: String
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let vc3 = VC3(age: age)
    }
}

class VC3: UIViewController {
    let age: Int
    
    init(age: String) {
        self.age = age
        super.init(nibName: nil, bundle: nil)
    }
}

만약 출발지 먼저 수정한다면?

  • 반대로 출발지인 VC1 먼저 수정한다면 개발자는 수정해나가다가 중간에 집중력을 잠깐 잃으면 "내가 무엇을 위해 이것을 수정하려고 했지"라고 방향을 잃는 경우가 발생
  • 실무 코드는 코드 변경해야하는 곳이 10개정도 이상 많아지면 개발자는 하나하나 바꾸다가 "어떤것을 바꾸려고 했지?"라는 경우가 생기므로 목적지 먼저 수정하는 것이 효율적인 코드 수정 방법이 될 수 있음
Comments