Use function composition in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Use function composition in JavaScript μλ°μ€ν¬λ¦½νΈ ν¨μ μ»΄ν¬μ§μ μ¬μ©
μ μ 쑰건 :μ΄ κ²μλ¬Όμμ currying(컀λ§)
μ μ¬μ©νλ―λ‘ μ΄μ λν΄ λͺ¨λ₯΄λ κ²½μ° μ΄μ κ²μλ¬Ό μΈ Javascriptμ Curryingμ μ½μ΄ 보μκΈ° λ°λλλ€.
ν¨μ μ»΄ν¬μ§μ μ΄λ 무μμ λκΉ?
ν¨μ μ»΄ν¬μ§μ
μ μ¬λ¬ κ°λ¨ν ν¨μλ₯Ό κ²°ν©νμ¬ λ 볡μ‘ν ν¨μλ₯Ό λ§λλ λ©μ»€λμ¦μ
λλ€. κ° ν¨μμ κ²°κ³Όλ λ€μ ν¨μλ‘ μ λ¬λ©λλ€. μνμμ μ°λ¦¬λ μ’
μ’
λ€μκ³Ό κ°μ΄ μλλ€ : f(g(x))
. μ΄κ²μ f
λ‘ μ λ¬ λ g(x)
μ κ²°κ³Όμ
λλ€. νλ‘κ·Έλλ°μμ λΉμ·ν κ²μ μ°λ©΄μ κ·Έ μ»΄ν¬μ§μ
μ λ¬μ±ν μ μμ΅λλ€.
κ°λ¨ν μλ₯Ό λ€μ΄ λ΄
μλ€. 2 + 3 * 5
μ°μ°μ μννμ¬ μ°μ μν΄μΌνλ€κ³ κ°μ ν©μλ€. μμλ€μνΌ κ³±μ
μ λ§μ
λ³΄λ€ μ°μ μ
λλ€. λ°λΌμ 3 * 5
λ₯Ό κ³μ° ν λ€μ κ²°κ³Όμ 2
λ₯Ό μΆκ°νλ©΄λ©λλ€. μ΄κ²μ JavaScriptλ‘ μμ±ν΄ λ΄
μλ€. κΈ°λ³Έμ μ΄κ³ κ°μ₯ κ°λ¨ν λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
const add = (a, b) => a + b;
const mult = (a, b) => a * b;
add(2, mult(3, 5))
μ΄κ²μ add
ν¨μμ μ λ¬ λ κ³±μ
μ κ²°κ³Όμ΄κΈ° λλ¬Έμ ν¨μ μ»΄ν¬μ§μ
μ ν ννμ
λλ€.
ν κ±Έμ λ λμκ°μ ν¨μ μ»΄ν¬μ§μ
μ΄ λ§€μ° μ μ©ν μ μλ λ€λ₯Έ μ¬λ‘λ₯Ό 보λλ‘ ν©μλ€. μ΄μ , μ¬μ©μ λͺ©λ‘μ κ°μ§κ³ μκ³ κ·Έμ€μμ λͺ¨λ μ±μΈμΈ μ¬μ©μμ μ΄λ¦μ μΆμΆν΄μΌ νλ€κ³ κ°μ ν΄λ΄
μλ€. λλ κ°μΈμ μΌλ‘ λ€μκ³Ό κ°μ΄ μΈ κ²μ
λλ€.
const users = [
{ name: "Jeff", age: 14 },
{ name: "Jack", age: 18 },
{ name: "Milady", age: 22 },
]
const filter = (cb, arr) => arr.filter(cb);
const map = (cb, arr) => arr.map(cb);
map(u => u.name, filter(u => u.age >= 18, users)); //["Jack", "Milady"]
μ’μ λ°©λ²μ΄μ§λ§, μ»΄ν¬μ§μ μ μλννλ©΄ λ μ’μ μ μμ΅λλ€. μ μ΄λ λ μ½κΈ° μ¬μΈ μ μμ΅λλ€.
ν¨μ μ»΄ν¬μ§μ μλν
λ°λΌμ μ΄ μΉμ
μ λͺ©νλ λ μ΄μμ ν¨μλ₯Ό κ°μ Έμμ compose
κ³ μ°¨ ν¨μλ₯Ό μμ±νλ κ²μ
λλ€. λ―Έλ ν¨μμ μ΅μ’
μλͺ
μ μ μν΄ λ΄
μλ€ :
compose(function1, function2, ... , functionN): Function
μλ₯Ό λ€μ΄ λ€μκ³Ό κ°μ΄ ν¨μλ₯Ό νΈμΆνλ €κ³ ν©λλ€.
compose(add1, add2)(3) //6
λ°λΌμ μ΄λ¬ν ν¨μμ ꡬνμ λ€μκ³Ό κ°μ΅λλ€.
const compose = (...functions) => args => functions.reduceRight((arg, fn) => fn(arg), args);
κ΅μ₯νμ§ μμ΅λκΉ?
μ΄ λ¨ ν μ€μ ν¨μλ§μΌλ‘ 볡μ‘ν λ³νμ μμ±ν μ μλ ν¨μλ₯Ό ꡬμ±ν μ μμ΅λλ€. μ¬κΈ°μ μΌμ΄λλ μΌμ μ€λͺ
νκ² μ΅λλ€.
-
compose
λ κ³ μ°¨ ν¨μμ λλ€. λ€λ₯Έ ν¨μλ₯Ό λ°ννλ ν¨μμ λλ€. -
compose
λ μ¬λ¬ ν¨μλ₯Ό μΈμλ‘ μ·¨ν΄μ spread opeartor:...
λ₯Ό μ¬μ©νμ¬ ν¨μμ λ°°μ΄λ‘ λ³νν©λλ€. -
κ·Έλ° λ€μ ν΄λΉ ν¨μμ κ°λ¨ν
reduceRight
λ₯Ό μ μ©ν©λλ€. μ½λ°±μ 첫 λ²μ§Έ λ§€κ° λ³μλ νμ¬ μΈμμ λλ€. λ λ²μ§Έ μΈμλ νμ¬ ν¨μμ λλ€. κ·Έλ° λ€μ νμ¬ μΈμλ‘ κ° ν¨μλ₯Ό νΈμΆνκ³ κ²°κ³Όλ λ€μ νΈμΆμ μ¬μ©λ©λλ€.
μ΄μ μ΄μ μμ μμ μ°λ¦¬λ μ΄ ν¨μλ₯Ό μ¬μ©ν μ μμ΅λλ€. λ μ½κΈ° μ½κ² mapκ³Ό filter κΈ°λ₯μ μ 리νμ΅λλ€.
const filter = cb => arr => arr.filter(cb);
const map = cb => arr => arr.map(cb);
compose(
map(u => u.name),
filter(u => u.age >= 18)
)(users) //["Jack", "Milady"]
λ§μ§λ§ μμ λ₯Ό μ μν©λλ€. μ ν΅μ μΈ MapReduce
λ₯Ό ꡬνν΄ λ΄
μλ€.
ν¨μ μ»΄ν¬μ§μ μ κ°μ§ MapReduce
MapReduceμ μ리λ κ°λ¨ν©λλ€. λ°μ΄ν° μ μ 맡μ μ μ©νκ³ κ²°κ³Όλ₯Ό μ€μ¬ λ¨μΌ κ²°κ³Όλ₯Ό μμ±ν©λλ€. μ΄κ²μ΄ μΌλ°μ μΌλ‘ ν¨μ μ»΄ν¬μ§μ μ μ리μ λλ€. μλ₯Ό λ€μ΄, μ°λ¦¬λ μ¬λ¬ λ¨μ΄λ€μ μΈκΈ° μν΄ μ ν΅μ λ¨μ΄ μΉ΄μ΄ν°λ₯Ό ꡬνν μ μμ΅λλ€. mapμ κ°μ λ§λλ©΄ 1μ 보λ΄μΌνλ©° reduceλ μ΅μ’ λ°°μ΄μ μμ½νμ¬ κ²°κ³Όλ₯Ό μμ±ν©λλ€.
const reduce = cb => arr => arr.reduce(cb); //Just currify the reduce function
const mapWords = map(() => 1);
const reduceWords = reduce((acc, curr) => acc += curr)(0)
compose(reduceWords, mapWords)(['foo', 'bar', 'baz']); //3
Pipe or composition?(νμ΄ν νΉμ μ»΄ν¬μ§μ )
Yeiner Canoκ° λ¨Όμ compose
λμ pipe
λ‘ κ΅¬ννλ€κ³ μΈκΈ ν μ΄νμ΄ λΆλΆμ μΆκ°νμ΅λλ€. μ΄ κΈ°μ¬ λ°λ‘ μλμμ κ·Έμ μ견μ μ½μ μ μμ΅λλ€.
λ°λΌμ compose
μ pipe
μ μ£Όμ μ°¨μ΄μ μ μ»΄ν¬μ§μ
μμμ
λλ€. Pipeλ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μ»΄ν¬μ§μ
μ μννλ©° Composeλ μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ ν¨μ μ»΄ν¬μ§μ
μ μνν©λλ€. pipe
κ³ μ°¨ ν¨μλ₯Ό μμ±ν΄ λ΄
μλ€ :
const pipe = (...functions) => args => functions.reduce((arg, fn) => fn(arg), args);
λ°λΌμ μ΄ κ²½μ° reduceRight
λμ reduce
λ₯Ό μ¬μ©νμ¬ μ»΄ν¬μ§μ
μ μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ μνν©λλ€.
κ·Έλ° λ€μ μλ‘ λ§λ ν¨μλ₯Ό μ΄μ μμ μ μ μ© ν μ μμ΅λλ€.
pipe(
filter(u => u.age >= 18),
map(u => u.name),
)(users) //["Jack", "Milady"]
pipe(mapWords, reduceWords)(['foo', 'bar', 'baz']);
μ΄λ€ μ¬λλ€μ compose
λ³΄λ€ pipe
λ₯Ό μ¬μ©νλ κ²μ΄ λ μ½κΈ° μ½μ΅λλ€. μ μ΄λ μ°λ¦¬λ λ μμ°μ€λ½λ€λ κ²μ λμ ν μ μμ΅λλ€!
κ²°λ‘
μ΄ μμ λ μ¬μν μμ΄μ§λ§ λ 볡μ‘ν μμ μμλ μ¬μ©ν μ μμ΅λλ€. compose
ν¨μλ lodash
λλ ramda
μ κ°μ κ°μ₯ κΈ°λ₯μ μΈ λΌμ΄λΈλ¬λ¦¬μμ ꡬνλ©λλ€. ν¨μ μ»΄ν¬μ§μ
μ λν λ³νμ μ°Ύμ μλ μμ΅λλ€. μλ₯Ό λ€μ΄ Ramda
λ promises
λ₯Ό 리ν΄νλ ν¨μλ₯Ό μμ±ν μμλcomposeP
ν¨μλ₯Ό μ μν©λλ€. http://ramdajs.com/docs/#composeP
λ²μ μ£Όμ : https://www.codementor.io/michelre/use-function-composition-in-javascript-gkmxos5mj