Refactoring (리펙토링)
[iOS - swift] 리펙토링 - 로직을 위임하기 (#로직분리)
jake-kim
2024. 1. 25. 01:02
한곳에 방대해지는 코드
- 한곳에 여러가지의 프로퍼티, 메서드들이 들어가다보면 방대해지는 문제점이 존재
- 방대해지는 것을 막을 수 있는 방법은 로직을 위임하는 방법
- (단순 코드 분리는 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