Section 7. Functional Programming
Udemy - JavaScript: The Advanced Concepts
Section 7. Functional Programming
FP 특징
. 함수와 데이터의 분리
. 함수를 재활용 할수있음
이런 함수를 만들자
- 1 task
- return Statement
- Pure
- No Shared State
- Immutable State
- Composable
- Predictable
FP 용어
Pure Function
- 같은입력 -> 같은 출력 (참조 투명성)
- no side effect (함수밖의것을 수정하지 않는다)
예상가능한 결과를 주고, 버그를 줄여서 좋은데
side effect 없는 함수만으로는 무슨 의미가 있니
그래서 함수별로 역할을 구분지어 소통담당, 퓨어 등으로 isolate하는게 중요
Idempotent(멱등): 여러번 연산해도 결과가 달라지지않음
DB에서 같은 user를 여러번 delete요청하면 에러가 나지만, get요청은 에러나지않음
console.log(5)는 외부세계를 변화시키니 pure하다고 할수는 없지만 항상 일정한 결과를 냄
-> imdmpotent 함수는 pure하지는 않지만, 예측가능한 함수가 됨
imperative(명령적) vs declarative(선언적)
machine에게 구체적인 행동방법을 알려주는가 vs 결과를 요청하고 맡기는가
물컵을 집고/돌아서/나에게 와서/내손에 옮겨 vs 물 좀 줘
machine code vs high level code
-> FP는 선언적 코딩을 하도록 해줌
immutability
원본을 바꾸지 않는다
-> side effect를 만들지않음
Higher Order Functins & Closures (5강에서 배움)
HOF : 함수를 변수나 리턴값으로 사용 (JS에서 함수는 1급객체)
-> 클로저를 가능하게 함
클로저 :
-> private한 (보호되는) state를 사용할 수 있음
Curry
다수의 파라메터를 받는 함수를 한 번에 한개의 파라메터를 받는 함수로 변환
const multiply = (a, b) => a * b
const curriedMultiply = (a) => (b) => a * b
const multiplyBy5 = curriedMultiply(5)
Partial Application
다수의 파라메터를 받는 함수에 미리 일부 파라메터 값을 넣어놓고,
다음번 call에 나머지 파라메터값을 받음
const multiply = (a, b, c) => a * b * c
const partialMultiplyBy5 = multiply.bind(null, 5)
partialMultiplyBy5(10, 20)
const currying = (a) => (b) => (c) => a * b * c
Compose & Pipe
함수를 컨베이어벨트처럼 차례로 실행
데이터를 넣었다가, 리턴을 받은걸 다시 넣고, 리턴을 받은걸 다시넣고...리턴을 받음
compose와 pipe는 순서의 차이
fn1(fn2(fn3(50)));
compose(fn1, fn2, fn3)(50) //Right to left
pipe(fn3, fn2, fn1)(50)//left to right
Arity
함수가 갖는 파라메터의 갯수
-> FP에서는 arity가 적을수록 좋다 (유연하게 적용가능)
나중에
커링/파셜은 왜쓰는거야?
람다? lodash? JS엔 compose가 없으면 람다 써도 됨? 람다가 언어가 아니라 라이브러리였어?
js는 함수형이야 오브젝트형이야?
Author And Source
이 문제에 관하여(Section 7. Functional Programming), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dldngus5/Section7-Functional-Programming저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)