객체를 다룰 수 있는 함수형 도구를 살펴봄
위의 코드는 함수 이름에 있는 암묵적 인자 코드 냄새가 있어서 다음과 같이 암묵적 인자를 드러내기 리팩토링을 사용하여 수정함
근데 increment 뿐만이 아니라 decrement, double, halve 등 여러 비슷한 동작이 많다
하려는 동작만 다르지 다들 비슷하다. 이런 동작들이 지금은 함수 이름에 들어가 있다. 중복을 없애기 위해 이 함수들을 통해 어떤 객체라도 바꿀 수 있는 함수를 도출해 보자.
function incrementField(item,field) {
var value = item[field];
var newValue = value++;
var newItem = objectSet(item, field, newValue);
return newItem;
}
function updateField(item, field, modify) {
var value = item[field];
var newValue = modify(value);
var newItem = objectSet(item, field, newValue);
return newItem;
}
function incrementField(item, field) {
return updateField(item, field, function(value) { // 값을 바꾸는 함수 전달
return value++;
})
}
인자명과 변수명을 일반적으로 변경하면 다음과 같음
function update(object, key, modify) {
var value = object[key];
var newValue = modify(value);
var newObject = objectSet(object, key, newValue);
return newObject;
}