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
- UICollectionView
- SWIFT
- swift documentation
- 애니메이션
- 리펙터링
- map
- HIG
- 리펙토링
- rxswift
- uiscrollview
- swiftUI
- MVVM
- UITextView
- Protocol
- 클린 코드
- ios
- tableView
- 스위프트
- Clean Code
- Human interface guide
- clean architecture
- uitableview
- collectionview
- Refactoring
- ribs
- Observable
- 리팩토링
- RxCocoa
- Xcode
- combine
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 리펙토링 - 로직을 위임하기 (#로직분리) 본문
한곳에 방대해지는 코드
- 한곳에 여러가지의 프로퍼티, 메서드들이 들어가다보면 방대해지는 문제점이 존재
- 방대해지는 것을 막을 수 있는 방법은 로직을 위임하는 방법
- (단순 코드 분리는 extension으로도 가능하지만 로직 자체를 위임하는 방법이 더욱 코드 관리에 용이)
ex) 아래처럼 ViewController하나에서 여러 상태가 저장되고 계산하는 상태
- 현재는 프로퍼티와 func가 많이 없어서 복잡하지 않지만 계속 늘어나면 관리가 힘들어지는 현상이 발생
class ViewController: UIViewController {
var info = 1
var sampleString = "str"
override func viewDidLoad() {
super.viewDidLoad()
}
func someFunc1() {
// info 를 가지고 계산하거나 set해주는 코드
info += 1
}
func someFunc2() {
// sampleString를 가지고 계산하거나 set해주는 코드
sampleString += "1"
}
}
로직 위임하기
- ViewController에서 로직을 위임하기 위해서는 별도의 Task라는 것을 만들어서 처리하는 방법도 있지만 더욱 단순한 방법은 자기자신 인스턴스 (self)를 넘기는 방법
- 이렇게되면 자기 자신에 있던 프로퍼티와 메서드도 위임했던 부분에서 사용이 가능
- 아래처럼 별도의 인스턴스의 init에서 self를 넣도록 구현
// 일을 위임받아서 처리할 구조체
struct LogicHelper {
let instance: ViewController
init(instance: ViewController) {
self.instance = instance
}
func someFunc1() {
instance.info += 1
}
func someFunc2() {
instance.sampleString += "1"
}
}
// 사용하는곳
class ViewController: UIViewController {
var info = 1
var sampleString = "str"
lazy var logicHelper = LogicHelper(instance: self)
}
DIP 적용하기
- DIP(Dependency Inversion Principle): 프로토콜을 활용하여 의존하는 대상이 구현체가 아닌 프로토콜을 의존하게 함으로써 구현체를 유연하게 바꿀 수 있도록 하는 것
- DIP에 대한 자세한 개념은 이전 포스팅 글 참고
- LogicRequirement라는 프로토콜을 만들어서, LogicHelper에서는 이 프로토콜 인터페이스로 지정
protocol LogicRequirement where Self: UIViewController {
var info: Int { get set }
var sampleString: String { get set }
}
class ViewController: UIViewController, LogicRequirement { // <-
...
}
struct LogicHelper {
let instance: LogicRequirement
init(instance: LogicRequirement) {
self.instance = instance
}
...
}
* 전체 코드: https://github.com/JK0369/ExRefactor
'Refactoring (리펙토링)' 카테고리의 다른 글
[iOS - swift] protocol을 준수하는 1회용 모델 생성 팁 (protocol 구현체) (0) | 2024.03.22 |
---|---|
[iOS - swift] DataSource 리펙토링 - Section과 Item을 enum으로 놓고 dictionary로 관리하기 (1) | 2024.01.26 |
[iOS - swift] 단순 열거 switch 리펙토링 (dictionary 활용하기) (0) | 2024.01.22 |
[iOS - swift] property 관리 리펙토링 (computed property를 활용한 리펙토링) (0) | 2024.01.21 |
[iOS - swift] extension을 활용한 네임스페이스 리펙토링 방법 (0) | 2024.01.20 |
Comments