객체를 다루기 위한 고차 함수
- 앞장에서는 배열에 대한 고차 함수를 알아보았다면, 이번에는 객체에 대한 고차함수를 다루는 것을 알아본다.
필드명을 명시적으로 만들기
- 기존에 함수이름에 암묵적인 인자 냄새를 리팩토링한 함수
// field라는 명시적 인자로 교체하였다.
function incrementField(item, field){
const value = item[field];
const newValue = value + 1;
// 객체 업데이트 해주는 함수
const newItem = objectSet(item, field, newValue);
return newItem;
}
function incrementField(item, field){
const value = item[field];
const newValue = value + 1;
// 객체 업데이트 해주는 함수
const newItem = objectSet(item, field, newValue);
return newItem;
}
function decrementField(item, field){
const value = item[field];
const newValue = value - 1;
// 객체 업데이트 해주는 함수
const newItem = objectSet(item, field, newValue);
return newItem;
}
function halveField(item, field){
const value = item[field];
const newValue = value / 2;
// 객체 업데이트 해주는 함수
const newItem = objectSet(item, field, newValue);
return newItem;
}
- 함수들의 목적은 다르지만, 대부분 비슷한 동작을 하고 있다. → 또 다른 중복의 시작…..
- 동작이 함수 이름에 들어 있다…(보라색 부분)
- 객체의 값을 조작하는 부분도 따로 함수로 전달하면 좋을것 같지?
// 공통되는 부분을 함수로 추출한다.
function upateField(item, field, modify){
const value = item[field];
const newValue = modify(value);
const newItem = objectSet(item, field, newValue);
return newItem;
}
function incrementField(item, field){
// return 하는애가 함수이지만 결국은 값이다.
return updateField(item, field, (value) => value + 1)
}
function decrementField(item, field){
return updateField(item, field, (value) => value - 1)
}
function halveField(item, field){
return updateField(item, field, (value) => value * 2)
}
기존 함수와 비교
// 기존 함수
function incrementField(item, field){
const value = item[field]; // 조회
const newValue = value + 1; // 변경
const newItem = objectSet(item, field, newValue); // 설정
return newItem;
}
// 리팩토링한 함수
function incrementField(item, field){
return updateField<T>(item : T, field : keyof T, (value) => value + 1)
}
- item : 바꿀 타겟 객체
- key : 바꿀 키
- 콜백 : 바꾸는 계산