Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 6-2. 캡슐화 (클래스 추출하기) 본문

Refactoring (리펙토링)

[Refactoring] 6-2. 캡슐화 (클래스 추출하기)

jake-kim 2023. 3. 22. 01:02

클래스 or 구조체 추출하기

* 아래부터 편의상 구조체 추출하기도 클래스 추출하기로 명칭

  • 클래스 안에 일부 property나 메소드를 또다른 클래스로 묶을 수 있다면 따로 그 요소들을 별도의 클래스로 만드는 것
    • 클래스는 데이터가 추가되고, 연산이 추가되다보면 어느새 비대해지는데, 역할이 많을수록 복잡도가 증가하는데 이 것을 클래스 추출하기를 통해 해결이 가능
    • 하나의 클래스에는 하나의 성격만 담도록 코딩하다보면 나중에 변경할때도 다른 사이드 이펙을 고려하지 않고 쉽게 수정이 가능

클래스 추출하기

ex) 구조체 추출하기

struct Person {
    let officeAreaCode: String
    let officeNumber: String
    
    func getOfficeAreaCode() -> String {
        officeAreaCode
    }
    func getOfficeNumber() -> String {
        officeNumber
    }
}
  • person관련 정보와 phone성격 2가지가 있는데 이게 모두 Person 하나에 다 있으므로 Person에서 Phone정보를 따로 구조체로 추출이 가능
    • 리펙토링 - phone 성격을 따로 struct로 추출하기
    • 코드는 길어지긴 했지만 PhoneNumber라는 것을 캡슐화하여 Person 입장에서는 phoneNumber의 내부 로직을 모르게하여 Person의 관심사를 좁혀서 코딩할때 쉽게 접근할 수 있는 장점이 존재
struct Person {
    private let phoneNumber: PhoneNumber
    
    init() {
        phoneNumber = .init(areacode: "", number: "")
    }
    
    func getOfficeAreaCode() -> String {
        phoneNumber.getAreaCode()
    }
    func getOfficeNumber() -> String {
        phoneNumber.getNumber()
    }
}

struct PhoneNumber {
    let areacode: String
    let number: String
    
    func getAreaCode() -> String {
        areacode
    }
    func getNumber() -> String {
        number
    }
}

 

* 참고

- Refactoring (Marting Flowler)

Comments