Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 메서드와 함수의 파라미터 리펙토링 본문

Refactoring (리펙토링)

[Refactoring] 메서드와 함수의 파라미터 리펙토링

jake-kim 2023. 11. 19. 01:56

용어

  • *메서드: 객체가 가지고 있는 하나의 행위
  • *함수: 객체없이 단독으로 있는 하나의 기능

(* 이 글에서는 편의상 메서드도 함수로 지칭)

함수의 파라미터 리펙토링

  • 함수의 정의는 하나의 일을 하는 기능 단위로 볼 수 있다는 것은 유명한 의미
  • 하지만 함수에서 인수와 파라미터를 사용할 땐 그저 함수 안에서 필요한 것을 넣는 경우가 존재
  • 가장 위험한 코드는 함수 파라미터에 또 다른 struct나 class타입을 넣는 것

ex) 주식 정보 제공 앱을 만들 때, Candle이라는 구조체를 사용하는 경우

  • calculateMiPriceString 함수에서 candle 인스턴스를 받아서 candle안의 메서드를 호출하여 특정 문자열을 가져오는 함수
import UIKit

struct Candle {
    var open: Int
    var close: Int
    var high: Int
    var low: Int
    
    func calculateMidpoint() -> Int {
        (high + low) / 2
    }
}

class ViewController: UIViewController {
    let exampleCandle = Candle(open: 50, close: 60, high: 70, low: 40)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let midpointString = exampleCandle.calculateMidpoint()
    }
    
    private func calculateMidPriceString(candle: Candle) -> String {
        let midPoint = candle.calculateMidpoint() % 2
        
        if midPoint % 2 == 0 {
            return "짝수인 mid price: \(midPoint)"
        } else {
            return "홀수인 mid price: \(midPoint)"
        }
    }
}
  • 위 코드의 문제점
    • calculateMidPriceString은 Candle이라는 instance를 받게되면서 Candle 모델에 의존성이 생기는 현상이 발생
    • 즉, Candle이 바뀌면은 calculateMidPriceString 함수도 변경해주어야 하는 상황
    • calculateMidPriceString을 테스트 하고싶은 경우, Candle 인스턴스를 만들어야해서, Candle 초기화구문도 테스트쪽에서 불러야 하므로 불필요한 의존성 때문에 테스트에도 힘든 단점이 존재
  • 리펙토링 방법
    • calculateMiPriceString에서 Candle 구조체에 대한 의존성을 떼어내고 정말 함수 내부에서 필요한 값만 받도록 수정
private func refactor_calculateMidPriceString(high: Int, low: Int) -> String {
    let midPoint = ((high + low) / 2) % 2
    
    if midPoint % 2 == 0 {
        return "짝수인 mid price: \(midPoint)"
    } else {
        return "홀수인 mid price: \(midPoint)"
    }
}

결론

  • 함수 파라미터를 결정할 때도, 꼭 함수 내부에서만 필요한 정보만 받도록 구현할 것
    • 함수 안에서만 필요한 값만으로 파라미터를 지정하면, 해당 함수를 테스트할때도 불필요한 다른 정보를 알지 못해도 되므로 테스트에도 용이한 코드로 유지가 가능

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

Comments