관리 메뉴

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

[Refactoring] 10-2 API 리펙토링 (객체 통째로 넘기기) 본문

Refactoring (리펙토링)

[Refactoring] 10-2 API 리펙토링 (객체 통째로 넘기기)

jake-kim 2023. 6. 21. 01:48

객체 통째로 넘기기

  • 객체에서 특정 값들을 가져와서 그 값들을 함수에 넘겨서 특정 일을 수행하는 것보다, 객체 통째로 파라미터로 넘길 것
    • 이유1) 수정해야할 기획 의도가 생겼을 때, 객체 통째로 넘기게 되면 매개변수 목록은 수정하지 않아도 되는 편리함
    • 이유2) 매개변수의 개수가 짧아져서 일반적으로는 함수 사용법의 이해가 올라감
    • 이유3) 객체를 통째로 넘기지 않으면, 함수들끼리 같은 데이터를 사용하는 부분이 있을 것이고, 중복될 가능성이 커짐 (레코드를 통째로 넘기게 된다면 중복 로직을 방지할 수 있음)

객체 통째로 넘기기 도식화

객체 통째로 넘기기 예시)

  • Room 이라는 인스턴스와 HeatingPlan 인스턴스가 존재
    • Room은 현재 방의 온도와 적절 온도 범위가 존재
    • HeatingPlan은 온도의 범위를 체크하는 일과 추후에 온도를 조절하는 기능을 담당
struct Room {
    struct TemparatureRange {
        let low: Int
        let high: Int
    }
    
    let range = TemparatureRange(low: 17, high: 32)
    let currentTemparature: Int
}

struct HeatingPlan {
    func containsInRange(low: Int, high: Int, temparature: Int) -> Bool {
        (low...high) ~= temparature
    }
}

let room = Room(currentTemparature: 10)
let heatingPlan = HeatingPlan()
let containsInRange = heatingPlan.containsInRange(low: room.range.low, high: room.range.high, temparature: room.currentTemparature)
  • HeatingPlan 메소드에 객체를 넘기도록 수정
struct HeatingPlan {
    // refactor
    func refactor_containsInRange(room: Room) -> Bool {
        (room.range.low...room.range.high) ~= room.currentTemparature
    }
}

let room = Room(currentTemparature: 10)
let heatingPlan = HeatingPlan()
let refactor_containsInRange = heatingPlan.refactor_containsInRange(room: room)

 

* 참고

- Refactoring (Martin Flowler)

Comments