"매 여러 field를 매 풀어 넘기지 말고 매 객체 자체를 넘겨라". Preserve Whole Object은 Fowler "Refactoring" (1999, 2nd ed. 2018) 의 매 catalog refactoring — 매 호출자가 매 객체에서 매 여러 값을 매 추출해 매 인자로 넘기는 매 패턴을 매 객체 통째로 매 넘기는 매 형태로 매 변환. 매 parameter list 축소 + 매 의존성 명시화.
매 핵심
매 적용 trigger
매 호출자가 매 한 객체에서 매 3+ 값을 매 추출해 매 인자로 넘김.
매 같은 추출 패턴이 매 여러 callsite에서 매 반복.
매 추후 다른 field가 매 필요해질 때 매 signature 변경 비용.
매 Trade-off
장점: parameter list 축소, 매 future-proof, 매 객체 의존성 명시.
단점: 매 callee의 매 객체 의존도 증가, 매 testability 저하 가능 (큰 객체 mock).
언제 X: 매 callee가 매 domain 외부 (해당 객체 unknown), 매 1–2 field만 사용.
매 응용
Range comparison: inRange(low, high) → inRange(range).
# 매 Before — primitive obsession + parameter explosiondefis_within(low:float,high:float,value:float)->bool:returnlow<=value<=highlow,high=room.days_temp_range.low,room.days_temp_range.highifis_within(low,high,today.low)andis_within(low,high,today.high):alert()# 매 After — preserve whole objectdefis_within(rng:"Range",value:float)->bool:returnrng.low<=value<=rng.highifroom.range.contains(today.low)androom.range.contains(today.high):alert()
// 매 Before
functionquote(price: number,tax: number,discount: number){...}// 매 After
interfacePricedItem{price: number;tax: number;discount: number;}functionquote(item: PricedItem){...}
IDE refactoring (PyCharm/IntelliJ)
1. Extract Class → 매 Range (low, high).
2. Move Method → contains() onto Range.
3. Inline Variable → low, high at callsite.
4. Replace Parameter with Method Call → is_within(range, value).