Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - swift] 리펙토링 - 로직을 위임하기 (#로직분리) 본문

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

Comments