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
- 클린 코드
- UITextView
- ribs
- Refactoring
- scrollview
- 스위프트
- 리펙토링
- clean architecture
- Protocol
- tableView
- collectionview
- Clean Code
- combine
- SWIFT
- Human interface guide
- 리팩토링
- Xcode
- 애니메이션
- swift documentation
- HIG
- swiftUI
- Observable
- RxCocoa
- MVVM
- ios
- UICollectionView
- map
- uitableview
- uiscrollview
- rxswift
Archives
- Today
- Total
김종권의 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개정도 이상 많아지면 개발자는 하나하나 바꾸다가 "어떤것을 바꾸려고 했지?"라는 경우가 생기므로 목적지 먼저 수정하는 것이 효율적인 코드 수정 방법이 될 수 있음
'Refactoring (리펙토링)' 카테고리의 다른 글
| [iOS - swift] 리펙토링 - 밀집된 코드 vs 분리된 코드 작성하기 (#응집도, #결합도, #과도한 분리(over-abstraction), #파일 점프) (0) | 2025.05.07 |
|---|---|
| [iOS - swift] 데이터를 넘길 때 struct 형태의 모델로 넘기면 좋은 이유 (데이터 넘기기) (0) | 2025.04.30 |
| [iOS - swift] protocol을 준수하는 1회용 모델 생성 팁 (protocol 구현체) (0) | 2024.03.22 |
| [iOS - swift] DataSource 리펙토링 - Section과 Item을 enum으로 놓고 dictionary로 관리하기 (1) | 2024.01.26 |
| [iOS - swift] 리펙토링 - 로직을 위임하기 (#로직분리) (0) | 2024.01.25 |
Comments