코드냄새 하나와 리팩터링 두개

// 기존 함수
function arraySet(array, idx, value) {
  const copy = [...array]
  copy[idx] = value
  return copy
}

// 리팩토링
function arraySet(array, idx, value) {
  return withArrayCopy(array, (copyArray) => {
    copyArray[idx] = value
  })
}

// 카피 온 라이트에 대한 함수 재사용 가능함!!!!
function withArrayCopy(array, callBackFunc) {
  const copy = [...array]
  callBackFunc(copy)
  return copy
}

// 배열을 직접 변경하는 고성능 정렬함수
const sortedArray = withArrayCopy(array, (copyArray) => SuperSorter.sort(copyArray))

함수를 return 하는 함수 (HOC)

// 기존 코드
try{
 saveUserData(user);
}catch(err){
	logToSnapErrors(err);
}

try{
	fetchProduct(productId);
}catch(err){
	logToSnapErrors(err);
}
function withLogging(callBackFunc){
	try{
		callbackFunc()
	}catch(err){
		logToSnapErrors(err);
	}
}

withLogging(()=> saveUserData(user));
function saveUserDataWithLogging(user){
	try {
	// 그냥 유저데이터를 저장하는 함수
	saveUserDataNoLogging(user);
} catch(error){
	logToSnapErrors(error);
	}
}

function fetchProductWithLogging(productId){
	try {
	// 그냥 유저데이터를 저장하는 함수
	fetchProductNoLogging(productId);
} catch(error){
	logToSnapErrors(error);
	}
}

function wrapLogging(callBackFunc){
 // 함수자체를 return 함으로써 슈퍼파워 함수가 되었다.
	return function(arg){
		try{
			callBackFunc(arg);
		} catch(error){
			logToSnapErrors(error);
		}
	}
}

const saveUserDataWithLogging = wrapLogging(saveUserDataNoLogging);

<aside> 💡 데이터 파싱??? : 데이터를 원하는 형태는 작업.

</aside>

요점 정리