2. 함수형으로 전환하기
#
명령형 프로그래밍 보다 선언적 프로그래밍- 코드가 간결
- 오류와 실수 감소
- 정확하게 코딩했다는 확신을 느끼기 쉽다.
#
명령형 코드- 30 세 이상인 users 를 거른다.
- 30세 이상인 users의 names를 수집한다.
- 30세 미만인 users를 거른다.
- 30세 미만인 users의 ages를 수집한다.
#
_filter, _map 으로 리팩토링명령형 코드 1번과 3번의 중복을 제거해 보자.
users 말고도 규격을 맞춘다면 다른 객체를 사용할 수 도 있다.
이제 users 를 list 로 일반화 시켜보자.
명령형 코드 2 와 4 의 중복을 제거해 보자.
#
eachfilter 와 map 의 중복을 제거하자
- for loop
- list[i]
#
다형성map, each, filter 는 함수가 아닌 자바스크립트 array.prototype 의 메서드 이다.
- 이것은 순수함수가 아니며, 객체의 상태에 따라 결과가 달라진다.
- 메서드는 객체지향 프로그래밍이다.
- 메서드는 해당 클래스의 인스턴스에서만 사용할 수 있다.
- array 가 아니면 사용할 수 없다
- 다형성을 지원하기가 어렵다.
array like 객체
- javascript 에 array 가 아닌데 array 같이 여겨지는 객체들
- jquery 객체
- document.querySelectorAll('body');
- document.querySelectorAll('*');
- 배열이 아닌 NodeList.
함수형 프로그래밍의 높은 다형성
- 그리고 우리가 만든 map 함수를 사용한다면 array like 도 사용할 수 있다.
- length / key:value 형태만 만족하면 된다.
#
외부 다형성array_like, arguments, document.querySelectorAll
은 map 이나 filter 가 담당
#
내부 다형성우리가 만든 predi, iter, mapper
은 배열안에 어떤 값이든 들어있어도 무언가를 수행할 수 있게 만드는 역할을 하는 보조 함수
함수의 두번째 인자를 보통 callback 함수라고 부르는데, 사실 역할에 따라서 부르는 이름이 달라진다.
- callback 함수: 어떤 일을 다 끝난 후에 리턴하는 함수
- predicate : 조건을 리턴하는 함수
- iterator(?): 돌면서 반복적으로 실행되는 함수
- mapper: 무언가의 사이를 매핑하는 함수
보조 함수의 이름을 다르게 불러주자
#
커링 curry, curryr함수와 인자를 다루는 기법. 함수의 인자를 하나씩 적용해 나가다가, 필요한 인자가 모두 채워지면 함수본체를 실행한다.
JavaScript 는 커링을 지원하지 않지만, 일급함수가 지원되고 평가시점을 마음대로 다룰 수 있기 때문에 커링을 구현할 수 있다.
#
currycurry 가 아닌 예
curry 를 사용한 예
curry 의 변형
curry 를 이용한 빼기 함수
#
_curryr인자를 오른쪽에서 부터 채워나감
인자를 를 반대로 채워넣고 싶을때
#
_getobject 의 값을 안전하게 참조하는 함수
있는 값을 참조할 때
만약 없는 값을 참조하려 할 때
커링을 이용한 _get
name 을 꺼내는 함수를 만들어 재활용 할 수 있다.
이전의 _map 을 사용한 코드를 더 간결하게 할 수 있다.
after
#
_reduce리스트의 수만큼 iter 을 반복한다.
reduce 는 원래들어온 자료와 다른, 새로운 축약된 형태의 자료로 가공하기 위해 사용된다.
filter나 map 은 array 로 들어온 것을 array 로 다시 리턴한다.
reduce 는 array 로 들어온 것을 다른 형태로 만들 수 있다.
#
파이프라인 _pipe, _go, 화살표 함수- _pipe
- _go
함수를 연속적으로 실행하는 함수를 리턴한다.
앞서 작성한 함수들을 _go 를 이용해 작성해 보자.
- before
- after1
- after2
- 화살표 함수
_curryr 을 이용하여 한번 더 변형할 수 있다.
#
함수형 프로그래밍- 함수가 함수를 실행한다.
- 함수가 함수를 리턴한다.
- 함수의 평가시점, 함수의 인자들이 적용되어가는 과정에서 Side Effect 가 없고 순수함수들로 구성된다.
- 조합성을 강조한다.
- 추상화의 단위를 함수로 한다.
#
고차함수함수를 인수로 받는 함수 ex) map, reduce... 함수를 반환하는 함수 ex) bind
#
다형성 높이기, _keys, 에러함수형프로그래밍에서는, 예외적인 데이터가 들어오면,
- 다형성을 높이는 방법으로 해결할 수 있다.
_each
의 외부 다형성 높이기#
- _each 에 null 넣어도 에러 안나게
- _keys 만들기
- _each 외부 다형성 높이기
_each(null, console.log)
는 error 가 발생한다.
_each 함수 내부에서 list.length
length 를 참조하고자 할 때 list 가 null 이기 때문이다.
에러가 나지 않게 하기 위해서는
_get
함수는 null 체크를 해주고 있다._get
함수를 통하여list.length
에undefined
가 들어간다면 에러는 나지 않고i < undefined
가 false 이기 때문에 for 문을 수행하지 않게 된다.
함수형프로그래밍 에서는 예외적인 데이터가 들어와도 에러가 나지 않도록 유연하게 구현한다. (underscore.js 에서 구현하는 방법)
- if 로 타입을 체크 한다거나, try-catch 를 쓰지 않는다.
length 가 없어도 순회할 수 있게 만들어보자.
함수형 프로그래밍에서는 최대한 다형성을 높히게 끔 코드를 작성한다.