Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 10-4 API 리펙토링 (매개변수를 질의 함수로 바꾸기) 본문

Refactoring (리펙토링)

[Refactoring] 10-4 API 리펙토링 (매개변수를 질의 함수로 바꾸기)

jake-kim 2023. 7. 9. 23:52

cf) 파생과 질의 구분하기

  • 파생(Derived) 변수: 사용하는쪽에서 관심 밖의 변수들에도 영향을 주는 것
  • 질의(Query) 함수: 사용하는쪽에서 관심 대상인 변수에만 영향을 주는 것 (단순 get, set)

매개변수를 질의 함수로 바꾸기

  • 함수의 동작에 변화를 주는 요인은 함수의 매개변수
  • 즉, 함수의 동작에 변화를 주는 요인을 구성할 때 짧으면 짧을수록 이해하기가 쉬운 형태의 함수

매개 변수를 질의 함수로 바꾸기

  • 함수가 스스로 쉽게 결정할 수 있는 값을 매개변수로 건네는 것도 일종의 중복이므로, 이 결정은 함수안에서 결정하게하여 더욱 간결한 함수형태로 변경이 필요

ex) 함수를 사용하는 쪽에서 person, person.name을 넘기는데, 중복코드가 발생

let person = Person(age: 1, name: "jake")
let info = getPersonInfoString(person: person, name: person.name)
print(info)

private func getPersonInfoString(person: Person, name: String) -> String {
    "\(person.age) + \(name)"
}
  • 이런 경우는 person만 넘기도록 수정이 필요
private func getPersonInfoString(person: Person) -> String {
    "\(person.age) + \(person.name)"
}
  • 위 코드에서 name의 매개변수를 제거하고 person만을 남겨둔 것의 의미 더욱 생각하기
    • name 값에 대한 책임 주체는 원래 해당 함수를 호출하는 쪽이었는데, 리펙토링된 후에는 name 값에 대한 관리 주체가 함수 내부가 된 것

책임을 함수 내부로 돌리는 것이 더욱 좋은 코드일까?

  • 책임을 함수 내부로 돌리게되면 함수가 더욱 간결해져서 이해가 쉬워지고, 호출하는 여러곳에서의 코드 중복이 줄어들게되어 좋은 코드 유지가 가능
  • 위 코드에서는 name 매개변수를 제거하고 person이라는 매개변수만 살려놓았는데, 이렇게 되면 호출하는 쪽은 간소화되고 함수 내부는 코드량이 증가된 상태
    • 책임을 함수 내부로 돌린 상황
    • '함수'라는 것은 다양한 곳에서 호출될 수 있는 하나의 '기능'이므로 이 함수를 사용하는 쪽의 코드들이 여러개 있을 것이라 생각한다면 가능하면 함수 내부에서 처리하고 호출하는 쪽은 단순화하도록 하는것이 코드 중복을 막을 수 있는 장점이 존재

* 참고

- Refactoring (Martin Flowler)

Comments