함수 추출하기는 내가 가장 많이 사용하는 리팩터링 중 하나다
객체는 특정 로직과 데이터를 외부와 공유하려 할 때 공유할 .. 설명해주는 적당한 크기의 문맥이 되어준다.
좋은 이름을 떠올리는 데 효과적인 방법이 하나 있다. 바로 주석을 이용해 함수의 목적을 설명해보는 것이다. 그러다 보면 주석이 멋진 이름으로 바뀌어 되돌아 올 때가 있다.
먼저 그 데이터로의 접근을 독점하는 함수를 만드는 식으로 캡슐화
데이터의 유효범위가 넓을수록 캡슐화해야 한다.
let defaultOwner = {firstName: "마틴", lastName: "파울러"};
let defaultOwnerData = {firstName: "마틴", lastName: "파울러"};
export function defaultOwner() { return defaultOwnerData;}
export function setDefaultOwner(arg) { defaultOwnerData = arg; }
defaultOwnerData 가 외부에서 변경되지 않기 위해서 defaultOwner() 에서 새 객체로 deep copy 해서 반환. 외부의 영향을 차단하기 위해서 새 객체로 반환하는 것이 유용할 때가 있음.
스스로 자신을 설명할 수 있는 이름을 붙여라
let a = height * width
to
let area = height * width
같이 업데이트 되어야 할 변수 그룹들을 하나의 데이터 구조로 치환하라
function amountInvoiced(startDate, endDate) {}
function amountReceived(startDate, endDate) {}
function amountOverdue(startDate, endDate) {}
to
function amountInvoiced(aDateRange) {}
function amountReceived(aDateRange) {}
function amountOverdue(aDateRange) {}
Motivation
공통의 데이터에 대한 함수 그룹들을 베이스 클래스로 묶어라
function base(aReading) {}
function taxableCharge(aReading) {}
function calculateBaseCharge(aReading) {}
to
class Reading() {
base() {}
taxableCharge() {}
calculateBaseCharge() {}
}
Motivation
소스 데이터를 입력으로 받아 모든 파생값을 계산하고 각 파생값을 출력 데이터의 필드에 넣어라
function base(aReading) {}
function taxableCharge(aReading) {}
to
function enrichReading(argReading) {
const aReading = _.cloneDeep(argReading)
aReading.baseCharge = base(aReading)
aReading.taxableCharge = taxableCharge(aReading)
return aReading
}
Motivation
서로 다른 작업을 수행하는 코드를 서로 다른 모듈로 분할해라
const orderData = orderString.split(/\s+/)
const productPrice = priceList[orderData[0].split("-")[1]]
const orderPrice = parseInt(orderData[1]) * productPrice
to
const orderRecord = parseOrder(orderString)
const orderPrice = price(orderRecord, priceList)
function parseOrder(aString) {
const values = aString.split(/\s+/)
return {
productID: values[0].split("-")[1],
quantity: parseInt(values[1])
}
}
function price(order, priceList) {
return order.quantity * priceList[order.productID]
}
Motivation