const isNumber = value => typeof value === 'number';
const checkNumber = arr => arr.every(isNumber);
const sum = (x,y) => x + y;
const total = arr => arr.reduce(sum);
const length = arr => arr.length
const divide = (x,y) => x / y;
const average = (arr) => divide(total(arr), length(arr))
const errorOrNot = (isTrue, fn) => isTrue ? fn : 'is error';
const value = [10, 20, 30, 40, 50, 60, 70];
errorOrNot(checkNumber(value), average(value)); // 40
const value2 = [10,20,30,'메롱'];
errorOrNot(checkNumber(value2), average(value2)); // 'is error'
const value = [10, 20, 30, 40, 50, 60, 70];
const getAverage = (arr) => {
let total = 0;
let len = arr.length;
for(let i=0;i<arr.length;i++) {
if(typeof arr[i] !== 'number') return 'is error';
total += arr[i];
}
return total / len;
}
getAverage(value); // 40
하지만, 선언적 프로그래밍은 이와 달리 하나하나 그 과정을 표현하기 보다는 위 과정을 한 단어의 함수 등으로 추상화 해서 표현한다(위에 표현해 놓은 함수형 프로그래밍 코드 처럼).
: 아직은 나도 함수형 프로그래밍의 장점이나 특징 등이 크게 와닿지는 않지만, 오늘 예시를 통해 배운 것은 함수형 사고를 하면 기획을 받았을 때, 혹은 어떤 대단위 기능을 만들 때 그 기능을 작은 작업 단위들(함수)로 쪼개서 작업을 할 수 있도록 해준다는 것이다(그리고 이렇게 생각의 단위를 너무 크게 하지 않고, 작은 단위부터 해나가면 생각이 좀 더 단순해지지 않을까 생각이 든다).
그리고, 그렇게 쪼갠 함수는 재사용하기도 좀 더 편하고(절차 지향에 비해서), 확장 시에도 해당 코드를 손대지 않고, 나중에 배울 compose 등의 함수형 프로그래밍 도구? 등을 써서 좀 더 쉽게 확장할 수 있다는 장점이 있을 것 같다(내가 함수형 프로그래밍에 관심을 갖게된 계기 이기도 하다 => 재사용과 확장성의 용이). 그리고 선언적인 프로그래밍이 아직은 파악이 절차 지향보다는 어렵지만, 적응이 되면 map, filter를 볼 때처럼 레거시 파악 등에도(함수형 프로그래밍으로 된 코드들) 더 용이할 것 같다는 생각이 든다(혹은 다른 사람의 코드를 볼 때).
마지막으로, 순수 함수를 사용함으로써 예측 가능한 코드 혹은 프로젝트
를 유지할 수 있다는 점이 장점이 될 것 같다. 물론 타입스크립트 등을 써서 어느 정도 예측 가능한 코드를 만들 수 있지만, 함수형 프로그래밍의 장점으로 불변성, 순수 함수 등을 생각해보면 데이터와 관련해서 부수 효과가 없는 참조 투명한 함수들을 사용하여 코드를 작성하는 것은 예측 불가한 사항들을 어느정도 최대한 통제할 수 있다는게 되므로 그런 부분에 있어서 장점을 가져갈 수 있을 것 같다.