객체지향은 가동부를 캡슐화하여 코드의 이해를 돕는다
함수형 프로그래밍은 가동부를 최소화하여 코드의 이해를 돕는다
어떤 문제는 객체지향 설계 방식으로도 해결할 수 있지만
자바스크립트는 상태 공유가 보편적,
동적인 언어라 복잡성이 증가하고 가독성이 떨어진다
최근 유행하는 리액티브 프로그래밍은 데이터 흐름과 변경 전파에 초점을 둔다
애플리케이션 설계 시 다음과 같은 요소를 생각해야 한다
함수형 프로그래밍은 위 모두를 만족할 수 있는
프로그래밍 패러다임이다
애플리케이션의 부수효과를 방지하고
상태 변이를 감소하기 위해 데이터의 제어 흐름과
연산을 함수와 함수의 조합으로 추상화 하는 것
보통의 FP 서적은 피보나치 수열을 예로 시작한다
서술부와 평가부를 분리하여
내부적으로 어떻게 구현되는지 밝히지 않은채 연산/작업을 표현한다
함수를 매개변수로 받는 일급 고차함수를 이용해
재사용성, 확장성이 우수한 선언적 코드로 대체
람다 표현식이나 화살표 함수를 사용하여
코드를 깔끔하게 사용한다
루프는 재사용도 어렵고 반복 시 상태가 계속 바뀌기 떄문에 제거하는 것이 좋다
함수형 프로그래밍은 무상태성과 불변성을 지향한다
무상태 코드는 전역 상태를 바꾸거나 혼선을 일으킬 가능성을 없앨 수 있다
부수효과나 상태 변이를 일으키지 않는 순수 함수를 써야한다
외부 자원을 읽거나 수정하는 것은 순수 함수가 아니다
자바스크립트의 this 는 사용하는 함수의 실행 컨텍스트에 따라 달라지기 때문에 가급적 지양한다
이처럼 다양한 것을 모두 순수함수로 대응할 수는 없다
함수형 프로그래밍은 상태 변이를 최소화 하고
순수/불순 함수를 구분하자는 것이다
함수의 여러 인수를 부분적으로 나누어 세팅하는 것
참조 투명성은 순수 함수를 정의하는 공식적인 방법
순수성이란 함수의 인수와 결괏값 사이의 순수한 매핑 관계를 의미한다
함수가 동일한 입력에 항상 동일한 결과를 내면
참조 투명한 함수라고 한다
이런 함수는 테스트에 용이하고 전체 로직을 파악하기도 쉽다
// 명령형
let counter = 0
increment()
increment()
console.log(counter) // ?
// 함수형
const plus2 = run(increment, increment)
console.log(plus2(0)) // 2
함수형 프로그래밍은 외부에서 관찰 가능한 부수효과가 제거된 불변 프로그램을 작성하기 위해 순수함수를 선언적으로 평가하는 것이다
그러기 위해서는 연산의 관점에서 데이터를 절대 변경하지 않는 고정된 작업 단위로 바라봐야 한다
함수형 프로그래밍의 함수는 분해와 함성의 상호작용으로 모듈적으로 동작한다
작업 단위는 함수 자신이다
모듈화는 단일성의 원리와 밀접한 관계가 있다
함수를 이어 붙이기 위해서는 입력과 출력 형식을 서로 맞춰야 한다
참조 투명성이 이러한 사고방식을 가질 수 있도록 돕는다
합성은 이어붙여진 함수들의 반환값과 그걸 인수로 사용하는 함수의 느슨하고 type-safe 한 관계가 맺어진다
함수형으로 합성한 코드는 전체 표현식의 의미를
개별 조각의 의미에서 추론할 수 있다
함수 체인은 필요한 시점까지 실행을 미루는 게으른 평가를 수행하여 cpu 부하를 줄일 수 있는 장점이 있다
루프나 분기 같은 명령형 흐름을 최대한 모듈화된 함수 내부에서 처리해서 반환값으로만 함수간 소통을 한다는 점에서 객체지향의 캡슐화와 비슷한 것 같다
캡슐화는 모듈화 단위가 객체라는 점에서 큰 차이를 가지지만..
학문적으로 함수형 프로그래밍에서는 예외를 던지는 것이 부수효과를 일으키기에 존재하지 않지만
실제 애플리케이션에서는 불가능하다
순수 에러 처리와 예외 처리를 구별하여 처리한다
리액티브 패러다임은 옵저버블이라는 아주 중요한 장치를 매개로 움직인다
함수형을 배우면 리액티브 패러다임에 대한 학습도 절반은 한 것과 다름없다
꼭 리액티브와 함수형을 섞어 쓸 필요는 없지만
함수형으로 사고하다보면 두 가지를 혼용하게 되어
결국 함수형 리액티브 프로그래밍 아키텍처에 눈을 뜨게 된다