Section 7. Functional Programming

Udemy - JavaScript: The Advanced Concepts

Section 7. Functional Programming

FP 특징

. 함수와 데이터의 분리
. 함수를 재활용 할수있음

이런 함수를 만들자

  1. 1 task
  2. return Statement
  3. Pure
  4. No Shared State
  5. Immutable State
  6. Composable
  7. Predictable

FP 용어

Pure Function

  1. 같은입력 -> 같은 출력 (참조 투명성)
  2. 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는 함수형이야 오브젝트형이야?

좋은 웹페이지 즐겨찾기