
자유도에 대해서 배우게 되었다.
예제를 보며 상세하게 더 알아보자.
예제1
예제 두가지 중 어떤 코드가 더 좋은 코드일까?
예제 1-1
function solution(arr: number[], query: number[]): number[] {
query.forEach((v, i) => {
if (i % 2 === 0) {
arr = arr.slice(0, v + 1);
} else {
arr = arr.slice(v);
}
})
return arr;
}
예제 1-2
function solution(arr: number[], query: number[]): number[] {
query.forEach((v, i) => {
arr = arr.slice(...(i % 2 === 0 ? [0, v + 1] : [v]));
})
return arr;
}
물론 2번이 더 짧아서라는 이유도 있겠지만 더 중요한 사실은 바로 자유도의 차이다.
arr = arr.slice(...(i % 2 === 0 ? [0, v + 1] : [v]));
1-2 예제의 이 부분이 더 자유도가 낮기 때문에 좋다.
읽는 순간 arr에 값을 넣는 계산임을 바로 예측할 수 있다.
극단적인 예시로 1번의 경우 다른 코드가 상단에 있다면?
if (i % 2 === 0) {
// --------다른코드-----------------
// ----다른코드---------------------
// ------------------다른코드-------
// -------------다른코드------------
arr = arr.slice(0, v + 1);
// ---다른코드----------------------
// ------------------다른코드-------
} else {
arr = arr.slice(v);
}
상단의 코드 또는 하단의 코드를 전부 읽고 나서야 arr에 계산된 값을 넣는 동작임을 파악할 수 있게 된다.
코드를 전부 읽어야 하는 이유는 다른 코드내에서 변경의 여지가 있을 수 있고, 그 사실을 확인해야 하기 때문이다.
예제2
다른 예제도 확인해보자.
예제 2-1
function solution2(number: string):number {
return [...number].map(Number).reduce((acc, cur) => acc + cur, 0) % 9;
}
reduce의 자유도는 매우 높다.
앞선 예제처럼 어떤 코드가 존재할지, 어떻게 쓰일 지 모른다. (for문도 동일한 이유로 자유도가 높음)
그렇다면 자유도를 어떻게 해결 할 수 있을까?
이런 경우에는 lodash를 이용해주면 해결할 수 있다.
예제 2-2
function solution2(number: string):number {
return _.sum(number
.split('').map(Number)) % 9;
}
성질이 보장된 lodash의 sum() 과 같은 함수를 써줌으로써 자유도를 줄이는 것이다.
결론
코드에서 자유도란 동작의 예측 범위이다.
자유도가 낮다면, 나머지 코드를 파악하지 않아도 코드의 동작 방식이나 성질을 파악할 수 있다.
자유도가 높다면, 그 반대의 경우를 마주할 수 있다.
'개발 > 개발 아카이브' 카테고리의 다른 글
| URL 파라미터 정리하기: JavaScript와 React에서 (0) | 2025.12.30 |
|---|---|
| 동기화 안 되는 main-develop, PR Cherry-pick 전략으로 배포 프로세스 개선해보기 (1) | 2025.10.18 |
| 디바운스(debounce)와 쓰로틀(throtte) 그리고 디바운스 적용기 (4) | 2025.08.08 |
| JavaScript 소수점 시리즈 - ceil, round, floor, trunc (1) | 2025.08.07 |
| 웹 스토리지 (로컬 스토리지 / 세션 스토리지) 개념과 조작법 그리고 사용하기 좋은 상황에 대하여 (0) | 2025.07.16 |