저번에 deepCopy를 모든 컬렉션들까지 카피가 이루어지도록 만들어았다.
이 때 작성한 코드는 else if 와 중첩 if 가 있어 depth가 깊어져 가독성이 떨어지고 유지보수가 어려운 코드였다.
Guard Clause 를 키워드를 제시해주셨고 적용해보고, 좀 더 가독성 있고 안정적인 코드로 만들기위해 일일히 [object Object]
이런식으로 빼두었던 것들을 다른 방식으로 고쳐보라는 피드백을 받았다.
앞으로 이 코드를 계속 개선해 나아가면서 나만의 코드습관을 만들고 왜 이 코드를 적었는지 생각하는 과정이 될 것 같다.
const customCopy = function (target) {
let result = {};
if (Object(target).toString() === objectTag || Object(target).toString() === arrayTag) {
for (let key in target) {
result[key] = customCopy(target[key]);
}
} else if (Object(target).toString() === regexpTag) {
return new RegExp(target);
} else if (Object(target).toString() === setTag) {
return new Set(target);
} else if (Object(target).toString() === mapTag) {
return new Map(target);
} else {
result = target;
}
return result;
};
const customCopy = (target) => {
let result = {};
if(target === null) return;
if(Object(target).toString() === objectTag || Object(target).toString() === arrayTag) {
for (let key in target) {
result[key] = customCopy(target[key]);
}
}
if (Object(target).toString() === regexpTag) return new RegExp(target);
if (Object(target).toString() === setTag) return new Set(target);
if (Object(target).toString() === mapTag) return new Map(target);
result = target;
return result;
}
const typeGroup = [Map, Set, WeakMap, WeakSet, Function, RegExp];
const copy = (target) => {
let result = {};
if(target.constructor === Object || target.constructor === Array){
for(let key in target){
result[key] = copy(target[key]);
}
}
const typeIndex = typeGroup.indexOf(target.constructor);
console.log(typeIndex);
if(typeIndex < 0) return new typeGroup[typeIndex](target);
result = target;
return result;
}
음 .. 2번째 개선코드에는 문제점이 있는데 생성자 함수가 실행이 안된다는 점이다.. 음 ,.. 생성자함수를 실행할 때는 뭔가의 조건이 또 있는 것 같다 ㅠ 이건 알아봐야 할 것 같은데 이런 방식으로 간추리는게 가능하다면 정말 간편한 코드가 될 것 같다.
일단 첫 번쨰 개선코드만으로도 이전 코드와 다르게 한 눈에 보기 쉬워졌다.
이렇게 해도 문제점은 없지만.. 일일히 생성타입마다 비교를 해야하는지 ... 비슷한 ? 코드들이 자꾸 반복되어 줄이고 싶다..