관리 메뉴

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

[Refactoring] 10-1 API 리펙토링 (질의 함수와 변경 함수 분리하기) 본문

Refactoring (리펙토링)

[Refactoring] 10-1 API 리펙토링 (질의 함수와 변경 함수 분리하기)

jake-kim 2023. 6. 6. 00:40

질의 함수와 변경 함수 분리하기

  • 용어
    • 질의 함수: 데이터를 단순히 가져오는 함수 (getter)
    • 변경 함수: 데이터를 변경하는 함수 (setter)
  • 함수를 구현할 때, side effect가 없이 값을 반환해주어야 하는 함수를 추구해야함
    • 이유) side effect가 없는 함수를 사용할 때 개발자가 신경 쓸 것들이 없는 장점이 존재
    • side effect가 없다면 어느 때건 원하는 만큼 호출해도 아무 문제가 없으며 호출하는 문장의 위치를 호출하는 함수 안 어디로든 옮겨도 되며 테스트하기도 용이
  • 질의 함수, getter 연산 프로퍼티에서는 side effect가 없게 구현해야함

질의 함수와 변경 함수 분리하기

질의 함수와 변경 함수 분리하기 예제

  • Product라는 구조체가 있고, items를 갖고 있는 상태
  • removeAndGetRemainingItems 메소드를 사용하면 파라미터로 넘긴 조건문에 해당하는 아이템들을 제거한 후 남은 아이템을 반환하는 기능
  • 문제점
    • 질의 함수와 변경 함수가 혼합되어 있음 (개발자가 이 코드를 사용할 때 고려해야할게 2가지가 됨)
    • 하나의 메소드에서 2가지 기능을 수행 중 (삭제, getter)
struct Product {
    var items = (0...20).map(String.init)
    
    mutating func removeAndGetRemainingItem(included: (String) -> Bool) -> [String] {
        let targetItems = items.filter(included)
        targetItems.forEach { removingItem in
            self.items.removeAll(where: { $0 == removingItem })
        }
        return items
    }
}

var product = Product()
product.removeAndGetRemainingItem(included: { Int($0)! % 2 == 0 }) // // ["1", "3", "5", "7", "9", "11", "13", "15", "17", "19"]
  • 리펙토링
    • 질의 함수와 변경 함수를 나누기
    • 하나의 메소드에서 하나의 일만 수행하도록 수정 (getter 메소드 하나를 만들고, remove 메소드를 하나 만들 것)
struct Product {
    var items = (0...20).map(String.init)
    
    func getItems(included: (String) -> Bool) -> [String] {
        items.filter(included)
    }
    
    mutating func remove(items: [String]) {
        items
            .forEach { removingItem in
                self.items.removeAll(where: { $0 == removingItem })
            }
    }
}

var product = Product()
let targetItems = product.getItems(included: { Int($0)! % 2 == 0 })
product.remove(items: targetItems)
print(product.items) // ["1", "3", "5", "7", "9", "11", "13", "15", "17", "19"]

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

 

* 참고

- Refactoring (Martin Flowler)

Comments