Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- tableView
- ios
- SWIFT
- uitableview
- UITextView
- swift documentation
- Refactoring
- Human interface guide
- combine
- HIG
- 리팩토링
- Protocol
- RxCocoa
- swiftUI
- UICollectionView
- MVVM
- rxswift
- 리펙토링
- collectionview
- uiscrollview
- 애니메이션
- 리펙터링
- Clean Code
- map
- Xcode
- 클린 코드
- Observable
- 스위프트
- clean architecture
- ribs
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[Refactoring] 메서드와 함수의 파라미터 리펙토링 본문
용어
- *메서드: 객체가 가지고 있는 하나의 행위
- *함수: 객체없이 단독으로 있는 하나의 기능
(* 이 글에서는 편의상 메서드도 함수로 지칭)
함수의 파라미터 리펙토링
- 함수의 정의는 하나의 일을 하는 기능 단위로 볼 수 있다는 것은 유명한 의미
- 하지만 함수에서 인수와 파라미터를 사용할 땐 그저 함수 안에서 필요한 것을 넣는 경우가 존재
- 가장 위험한 코드는 함수 파라미터에 또 다른 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)"
}
}
결론
- 함수 파라미터를 결정할 때도, 꼭 함수 내부에서만 필요한 정보만 받도록 구현할 것
- 함수 안에서만 필요한 값만으로 파라미터를 지정하면, 해당 함수를 테스트할때도 불필요한 다른 정보를 알지 못해도 되므로 테스트에도 용이한 코드로 유지가 가능
'Refactoring (리펙토링)' 카테고리의 다른 글
Comments