Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[iOS - swift] extension을 활용한 네임스페이스 리펙토링 방법 본문

Refactoring (리펙토링)

[iOS - swift] extension을 활용한 네임스페이스 리펙토링 방법

jake-kim 2024. 1. 20. 13:51

일반적인 방법

  • 네임스페이스를 구성할 때 보통 해당 클래스 혹은 해당 블록 안에 선언하여 구현
    • ex) 커스텀 버튼을 만들 때 (MyButton) 안쪽에 struct Config를 선언하여 사용
public class MyButton: UIButton {
    public struct Config {
        public let backgroundColor: UIColor
        
        public init(backgroundColor: UIColor) {
            self.backgroundColor = backgroundColor
        }
    }
    
    private let config: Config
    
    public init(config: Config) {
        self.config = config
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError()
    }
    
    private func setupUI() {
        backgroundColor = config.backgroundColor
    }
}
  • 이렇게되면 MyButton안에 또 다른 타입이 정해지게되어 가독성이 낮아지는 문제가 존재
    • 개발자는 코드를 위에서 아래로 읽어내려갈 때 MyButton이라는 이름을 보고, 그 다음 바로 Config가 나오는데 Config의 정의부는 개발자가 직접 안보아도 사용하는것만 봐도 예측이 가능하므로 굳이 MyButton 안에 있을 필요가 없는 것

extension으로 네임스페이스 관리하기

  • 별도의 파일을 생성한 다음 여기에 extension으로 추가
// MyButton+Config.swift
public extension MyButton {
    struct Config {
        public let backgroundColor: UIColor
        
        public init(backgroundColor: UIColor) {
            self.backgroundColor = backgroundColor
        }
    }
}
  • 다시 MyButton을 보면, 개발자는 MyButton이라는 이름을 보고 바로 config 프로퍼티, 초기화 메서드를 읽어내려가면서 밑에 setupUI()에서 config.backgroundColor를 보며 굳이 Config 코드 부분으로 jumb하여 보지 않아도 예측이 가능
    • extension과 별도의 파일로 나눔으로써 더욱 가독성 높은 코드관리가 가능
public class MyButton: UIButton {
    private let config: Config
    
    public init(config: Config) {
        self.config = config
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError()
    }
    
    private func setupUI() {
        backgroundColor = config.backgroundColor
    }
}

 

* 전체 코드:  https://github.com/JK0369/ExRefactorExtension

 

Comments