코드를 값으로 다루어 표현력 높이기
이번 학습에서 코드를 값으로 다루어 표현력 높이기
라는 주제로 강의를 들었다. 이번 강의를 듣고 코드를 작성할 때 함수를 어떻게 작성하느냐에 따라 로직이 읽히는 코드가 될 수 있고 아닐 수 있다는 것을 알게 됐다. 그 중 go, curry, pipe
라는 개념을 알게 됐다.
go
함수들과 인자들을 한번에 받아 즉시 평가
하는데 사용한다.
pipe
함수들이 나열되어 있는 합성된 함수
를 만드는데 사용한다. 내부에서 go함수를 사용하는 방식이다. 묶어주는 역할..?
curry
함수를 값으로 다루면서 받아둔 함수를 자신이 원하는 시점에서 평가
할 수 있다. 함수를 받아 함수를 리턴하고, 인자를 받아 원하는 인자의 개수가 들어오면 리턴한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//변경 전
reduce(
add,
map(
(p) => p.price,
filter((p) => p.price < 20000, products)
)
);
//go 함수를 사용하여 실제 계산되는 순서대로 적용
go(
products,
(products) => filter((p) => p.price < 20000, products),
(products) => map((p) => p.price, products),
(prices) => reduce(add, prices)
);
//변경 후 아래와 같이 되지만 products만 인자로 받는거지 확연히 바뀌어 지진 않았다.
go(
products,
(products) => filter((p) => p.price < 20000)(products),
(products) => map((p) => p.price)(products),
(prices) => reduce(add)(products)
);
//하지만 위와같이 된다는 것은 그 다음 단계로 넘어갈 수 있다는 것이다.
//products가 생략가능해져 훨씬 보기 좋은 함수가 되었다.
go(
products,
filter((p) => p.price < 20000),
map((p) => p.price),
reduce(add)
);
❗ go함수로 함수를 보는 시점을 뒤집고, curry함수를 통해 보기 좋게 해준다. = 코드를 보기 좋게 해준다!
지연성
즉시 평가
실행되는 시점에 함수가 평가되는 것
지연 평가
실행되어도 원하는 시점이 아니라면 평가하지 않고 원하는 시점에서만 평가 되는 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// range 즉시 평가
// 숫자를 받고 숫자 크기만큼 배열을 리턴하는 함수
const range = (length) => {
let i = -1;
let res = [];
while (++i < length) {
res.push(i);
}
return res;
};
const add = (a, b) => a + b;
let list = range(4); //즉시 평가함으로 바로 평가된다.
reduce(add, list);
// 느긋한 range 지연 평가
const L = {};
L.range = function* (length) {
let i = -1;
while (++i < length) {
yield i;
}
};
let Llist = L.range(4); //평가되지않음
reduce(add, Llist); //reduce에서 값을 필요로 하는 시점에 평가됨
지연성의 장점
필요한 시점에서만 실행
되기에 즉시평가 되는 로직보다 상대적으로 계산이 효율적!
🚑깨달은 점
오늘 정말 많은 양을 공부했지만 정리를 하니 생각보다 많지 않았다. 그 이유는 코드의 표현과 지연성 공부를 하면서 내가 모든 내용을 이해
하는 것과 하루 만에 완벽히 익히
는 것이 불가능하다고 판단됐기 때문이다. 그래서 최대한 요약의 요약? 중요한 내용을 크게 기억하고 적는 전략을 짰다.
그래도 내가 중요하다고 생각하는 부분을 요약하는 능력
을 기르는 것도 실력이라는 말을 듣고 TIL을 작성을 했다. 이렇게 학습하고 끝내는 것이 너무 아쉬워 JS와 함수형 프로그래밍과 친해진다면 다시 돌아와 공부를 해야 될 거 같다. 현재는 자세하게 쓰는 건 무리.. But 코드를 표현할 때 오늘 학습한 방법을 알았으니 대만족!😎