#1 안전한 함수 합성
map으로 합성하기
다음과 같은 합성함수를 선언했다.
const f = x => x + 10;
const g = x => x - 5;
const fg = x => f(g(x));
위와 같이 함수를 선언했을 때, 아래와 같이 인자값 없이 값을 실행하면 'NaN'으로 에러가 난다.
console.log(fg(10)); // 15
console.log(fg()); // NaN - 에러가 난다.
잘못된 값이 들어왔을때, 아무 동작도 하지 않게끔 하려면 어떻게 해야될까? 바로 모나드와 map함수를 통해 안전한 합성을 이룰 수 있다.
위와 똑같은 동작을 하는 함수를 go 함수를 통해 나타내보자.
_.go(
10,
fg,
console.log); // 15
이제, 이것을 안전한 함수 합성을 위해여 모나드와 map을 통해 코드를 구성할 것이고, 이것들의 값이 있을때와 없을때 동작을 확인하여보자.
_.go(
[],
L.map(fg),
_.each(console.log)); //
_.go(
[10],
L.map(fg),
_.each(console.log)); // 15
위 처럼 모나드와 map을 통해 선언했을때, 인자값으로 잘못된 값이 들어왔을때, 아무동작을 하지 않음을 알 수 있고, 이로 안전한 함수합성이 이루어졌음을 알 수 있다.
find 대신 L.filter 사용하기
다음과 같은 데이터가 있다.
const users = [
{ name: 'AA', age: 35 },
{ name: 'BB', age: 26 },
{ name: 'CC', age: 28 },
{ name: 'CC', age: 34 },
{ name: 'EE', age: 23 },
];
이 데이터에서 유저를 찾을때, 만약 찾는 유저가 없을 경우에는 다음과 같은 에러가 난다.
const user = _.find(u => u.name == 'FF', users);
console.log(user); // undefined
이 때는, if문을 이용해서 유저가 없을땐 출력하지 않도록 아래와 같이 구성할 수 있다.
const user = _.find(u => u.name == 'FF', users);
if(user) console.log(user); //
하지만, 위와 같이 에러가 발생했을때, 따로 if문을 통해 처리할 필요 없이 안전하게 출력이 되게끔 하려면 어떻게 해야될까? 바로 L.filter를 이용해서 안전한 함수 합성을 이루면 된다.
/* 찾는 값이 있을 경우 */
_.go(users,
L.filter(u => u.name == 'BB'),
L.take(1),
_.each(console.log)); // {name: "BB", age: 26}
------------------------------------------------
/* 찾는 값이 없을 경우 */
_.go(users,
L.filter(u => u.name == 'FF'),
L.take(1),
_.each(console.log)); //
'Web[웹] > ES6+ 함수형 언어' 카테고리의 다른 글
[ES6+: 응용] 사용자 정의 객체를 이터러블 프로그래밍으로 다루기 (0) | 2019.11.01 |
---|---|
[ES6+: 응용] 객체를 이터러블 프로그래밍으로 다루기 (0) | 2019.10.29 |
[ES6+: 응용] reduce함수를 통해보는 명령형 습관을 지우기 (0) | 2019.10.25 |
[ES6+: 응용] 명령형에서 함수형으로 변환시키기 (0) | 2019.10.24 |
[JS: ES6+] 비동기: 동시성 프로그래밍 (2) (0) | 2019.10.21 |