함수형 코딩
좋은 설계에 관한 글을 찾다보면 꼭 나오는 키워드였던 것 같다. 이전부터 함수형 코딩의 공부에 대한 갈망은 있었는데 바쁘다는 이유로 미루곤 했었다.
이번에 좋은 기회로 함수형 코딩의 스터디에 참여하게 되었고, ‘쏙쏙 들어오는 함수형 코딩’ 이라는 책으로 스터디를 진행하기로 했다.
이번 주는 3. 액션과 계산 데이터의 차이를 알기, 4. 액션에서 계산 빼내기, 5. 더 좋은 액션 만들기 까지가 범위였고, 스터디를 통해 배운 것들을 정리하는 겸, 새로 알게된 사실을 기록하고자 블로그를 작성하기로 했다.
배운 내용들을 간단하게나마 꾸준히 적고, 알차게 완독까지 마무리 하는 것이 목표!
아래는 함수 체이닝을 사용한 함수형 코드의 예제이다.
함수 체이닝은 함수형 프로그래밍의 기법 중 하나로 객체 자체를 반환하는 메서드를 연속적으로 호출할 수 있는 기법이다. 배열 메서드 체이닝을 통해 순수 함수와 불변성을 지킬 수 있게 된다.
// 함수형 코드
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const isOdd = (num) => num % 2 !== 0;
const cube = (num) => num * num * num;
const sum = (acc, current) => acc + current;
const sumOfCubes = numbers
.filter(isOdd)
.map(cube)
.reduce(sum, 0);
console.log(sumOfCubes);
그리고 아래는 명령형 코드로 작성되어 있다.
// 명령형 코드
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sumOfCubes = 0;
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 !== 0) {
const cube = numbers[i] * numbers[i] * numbers[i];
sumOfCubes += cube;
}
}
console.log(sumOfCubes);
두 함수를 비교했을 때 함수형 코드가 더 좋지! 라고 생각했는데 조금 더 찾아보니, 함수형 코딩만이 정답만은 아닌 것 같았다. (은탄환은 없다)
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = myGenerator();
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
console.log(gen.next().value); // undefined
function*, 내부에서 값을 반환하고 실행을 중지할 때 yield, 함수의 실행을 다시 시작하고 yield 값을 반환할 때 next() 를 사용한다.혼자서는 100페이지까지도 읽기 힘들었던 걸 스터디 날이 다가올 수록 점점 초조해지더니 (?) 한번에 2챕터를 다 읽어버렸다.
다른 분들도 책 읽었나 궁금해서 봤는데 스터디 시작 직전 열심히 독서 중인 분도 계셨다. (나만 벼락치기 우르릉쾅쾅 한 거 아니구나ㅋㅋㅋ)
완독하면 맛있는 디저트를 먹어야겠다
끝!