개요
하나의 레코드에서 갑을 여러 개 꺼내서 인수로 넘길 바에 레코드 자체를 넘기는게 좋다
이점으로 매개변수 목록이 짧아지고, 수정될 가능성이 낮아진다.
단, 함수가 레코드에 의존하게 되므로, 서로 다른 모듈일 경우 이 리팩터링을 하지 않는다.
예시
실내온도 모니터링 시스템
function example(){ const low = aRoom.datsTempRange.low; const high = aRoom.datsTempRange.high; if(!aPlan.withinRange(low,high)) alerts.push("방온도가 지정 범위를 벗어났습니다."); } class HeatingPlan{ withinRange(bottom, top){ return (bottom >= this._temperatureRange.low) && (top <= this._temperatureRange.high); } } |
class HeatingPlan{ withinRange(bottom, top){ return (bottom >= this._temperatureRange.low) && (top <= this._temperatureRange.high); } //기존 메서드 대체할 빈 메서드 생성 xxNEWwithinRange(aNumberRange){ } } |
class HeatingPlan{ withinRange(bottom, top){ return (bottom >= this._temperatureRange.low) && (top <= this._temperatureRange.high); } //기존 메서드 호출코드 추가 xxNEWwithinRange(aNumberRange){ return this.withinRange(aNumberRange.low, aNumberRange.high); } } |
function example(){ //기존 함수 호출하는 곳 새 함수 호출로 변경 if(!aPlan.xxNEWwithinRange(aRoom.datsTempRange)) alerts.push("방온도가 지정 범위를 벗어났습니다."); } |
function example(){ //기존 함수 호출하는 곳 새 함수 호출로 변경 if(!aPlan.withinRange(aRoom.datsTempRange)) alerts.push("방온도가 지정 범위를 벗어났습니다."); } class HeatingPlan{ withinRange(aNumberRange){ return (aNumberRange.low >= this._temperatureRange.low) && (aNumberRange.high <= this._temperatureRange.high); } } |
예시:새 함수를 다른 방식으로 만들기
변형된 방법, 코드 작성 없이 다른 리팩터링을 연달아 수행하여 새 메서드 생성
function example(){ const low = aRoom.daysTempRange.low; const high = aRoom.daysTempRange.high; if(!aPlan.withinRange(low,high)) alerts.push("방 온도가 지정 범위를 벗어났습니다."); } |
function example(){ const low = aRoom.daysTempRange.low; const hihg = aRoom.daysTempRange.high; const isWithinRange = aPlan.withinRange(low, high); if(!isWithinRange) alerts.push("방 온도가 지정 범위를 벗어났습니다."); } |
function example(){ const tempRange = aRoom.daysTempRange; const isWithinRange = xxNEWwithinRange(); //함수 추출하기 function xxNEWwithinRange() { const low = tempRange.low; const high = tempRange.high; const isWithinRange = aPlan.withinRange(low, high); if (!isWithinRange) alerts.push("방 온도가 지정 범위를 벗어났습니다."); return isWithinRange; } } |
function example(){ const tempRange = aRoom.daysTempRange; const isWithinRange = aPlan.xxNEWwithinRange(); if (!isWithinRange) alerts.push("방 온도가 지정 범위를 벗어났습니다."); } class HeatingPlan{ //함수 옮기기 xxNEWwithinRange() { const low = tempRange.low; const high = tempRange.high; const isWithinRange = aPlan.withinRange(low, high); return isWithinRange; } } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
11 - API 리팩터링 - 세터 제거하기 (0) | 2023.09.17 |
---|---|
11 - API 리팩터링 - 매개변수를 질의 함수로 바꾸기 (0) | 2023.09.16 |
11 - API 리팩터링 - 플래그 인수제거하기 (0) | 2023.09.14 |
11 - API 리팩터링 - 매개변수화하기 (0) | 2023.09.13 |
11 - API 리팩터링 - 질의 함수와 변경 함수 분리하기(query and command) (0) | 2023.09.12 |