• Blog

  • Snippets

함수형 도구 체이닝

July 2, 2024

쏙쏙들어오는 함수형 코딩

# 체인을 명확하게 만들기

1. 단계에 이름 붙이기

function biggestPurchasesBestCustomers(customers) {
var bestCustomers = selectBestCustomers(customers);
var biggestPurhcases = getBiggestPurchases(bestCustomers);
return biggestPurhcases;
}
function selectBestCustomers () {
// ...
}...
function getBiggestPurchases {
// ...
}
...

이렇게하면 각단계에 숨어있던 두 함수의 구현도 알아보기 쉬워짐.

하지만 콜백함수는 인라인으로 사용되고 있어 재사용불가능함.

2. 콜백에 이름 붙이기

function biggestPurchasesBestCustomers(customers) {
var bestCustomers = filter(isGoodCustomer);
var biggestPurhcases = map(getBiggestPurhcase);
return biggestPurhcases;
}
function isGoodCustomer() {
// ...
}
function getBiggestPurhcase() {
// ...
}

따로 콜백함수를 빼면 재사용할수도있고, 호출 그래프의 아래쪽에 위치하므로 좋은코드라는걸 알 수 있음.

3. 두 방법을 비교

재사용성에선 이 방법이 좋기때문에 두번째 방법이 더 좋음. 하지만 두 가지 방법을 시도해서 뭐가 더 좋은지 비교해서 결정하는것도 좋은방법임

체이닝을 하면서 map, filter , reduce.. 이 쓰일텐데, 이 메서드들은 매번 새로운 함수들을 만들어낸다. 비효율적이라고 생각할 수 있지만 가비지 컬렉터가 이를 빠르게 처리하기 때문에 크게 신경쓰지 않아도 된다.

* 스트림결합 : 체인을 최적화 하는것

하지만 체인을 최적화해서 여러개의 체이닝을 하나의 동작으로 줄일 수 있다면 가비지 컬렉터 연산을 줄일 수 있기 때문에 로직 작성중에 *스트림 결합을 하면 좋다.

절차적 코드와 함수형 코드의 비교

절차적인 원래 코드

var answer = [];
var window = 5;
for(var i=0; i<array.length; i++) {
var sum = 0;
var count = 0;
for(var w=0; w<window; w++) {
var idx = i+w;
if(idx < array.length) {
sum += array[idx];
count += 1;
}
}
answer.push(sum/count);
}

함수형 도구를 사용한 코드

var window = 5;
var indices = range(0, array.length);
var windows = map(indices, function(i) {
return array.slice(i, i+window)
})
var answer = map(windows, average);
function range(start, end) {
var ret = [];
for(var i=start; i<end; i++) {
ret.push(i)
}
return ret;
}

함수형 도구를 사용하여 코드를 만들어서 보니, 각 과정을 각 단계로 나눠 명확하게 만들었음.

# 체이닝 디버깅을 위한 팁