함수형 도구 체이닝
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;}
함수형 도구를 사용하여 코드를 만들어서 보니, 각 과정을 각 단계로 나눠 명확하게 만들었음.
# 체이닝 디버깅을 위한 팁
- 의미 없는 변수명 짓지않고 기억하기쉬운 이름으로 변수명 짓기
- 단계 사이에 print구문을 넣어 코드를 돌려보기
- 복잡한 체인이라면 한번에 한단계씩 체이닝을 추가하면서 print를 해보기