Este artigo faz parte da série Writing Software sobre programação funcional e várias técnicas para escrever programas JavaScript ES6 +, começando com o básico. Fique conectado, muitas coisas novas estão por vir!
Composição: "Uma ação que consiste em fazer um todo a partir de partes ou elementos."
Em minha primeira aula de programação no colégio, fui informado que o desenvolvimento de software é "decompor problemas complexos em suas partes constituintes e, em seguida, combinar soluções simples em soluções complexas para resolver o problema original".
Acima de tudo na minha vida, lamento não ter entendido a importância total desta lição logo no início. A essência do desenvolvimento de software ficou clara para mim tarde demais.
Conduzi centenas de entrevistas com programadores e isso me trouxe a compreensão de que não estou sozinho. Muito poucos programadores realmente entendem a essência do processo de desenvolvimento de software. Eles não estão cientes das ferramentas mais importantes à nossa disposição, ou simplesmente não sabem como usá-las corretamente. Absolutamente todos tiveram dificuldade em responder uma ou ambas as perguntas sobre as coisas mais importantes no desenvolvimento:
O que é composição funcional (composição de função)?
O que é composição de objeto (composição de objetos)?
, , . - . , , , . . . , - , .
. - , . 2013 Toyota " " , .. "-" 10000 .
, , , , DDoS , .
.
, , . (, , ), , , .
, , .
. : f
g
, (f ∘ g)(x) = f(g(x))
. ∘
- . , " f
g
f
g
x
". , f
, g
, f
g
.
, , :
const g = n => n + 1;
const f = n => n * 2;
const doStuff = x => {
const afterG = g(x);
const afterF = f(afterG);
return afterF;
};
doStuff(20); // 42
, promise
, :
const g = n => n + 1;
const f = n => n * 2;
Promise.resolve(20)
.then(g)
.then(f)
.then(value => console.log(value)); // 42
, , (map
, filter
, etc), lodash
, observables
RxJS
, . - . - . - this
.
- . doStuff()
:
const g = n => n + 1;
const f = n => n * 2;
const doStuffBetter = x => f(g(x));
doStuffBetter(20); // 42
, "after g" trace()
:
const trace = label => value => {
console.log(`${ label }: ${ value }`);
return value;
};
:
const doStuff = x => {
const afterG = g(x);
trace('after g')(afterG);
const afterF = f(afterG);
trace('after f')(afterF);
return afterF;
};
doStuff(20); // =>
/*
"after g: 21"
"after f: 42"
*/
Lodash Ramda , . :
import pipe from 'lodash/fp/flow';
const doStuffBetter = pipe(
g,
trace('after g'),
f,
trace('after f')
);
doStuffBetter(20); // =>
/*
"after g: 21"
"after f: 42"
*/
, pipe
:
// pipe(...fns: [...Function]) => x => y
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
, , . . , , . , , . .
pipe()
, , . pipe()
( compose()
) . () . , , , , . , function
=>
( doStuffBetter).
, , .
:
. , . , , . 4 7 . 7, . , 3- , . . , , , , , , .
-. , " -". , . , . . , , . - , - . , , .
. . , . , , , .
" " - , " - . "
" - , . […] ." - Wikipedia
:
const firstName = 'Claude';
const lastName = 'Debussy';
:
const fullName = {
firstName,
lastName
};
Array
, Set
, Map
, WeakMap
, TypedArray
. , - .
, " " , "" (Composite), , . , "" . , .
" " : " ", , (, , "", "", ""), ( , , "", , , - ) ( , , "", , , DOM- ).
, . " " " ", " " , , .
, , , " : " (1989):
, "" .
" " (1975). , Amazon Ebay, .
. , . " " , , , . - :
: ,
: - , . , ,
: , ,
: , , . , .
: " - , , . , , " - , " ".
JavaScript ( ). , . (), . , , - .
:
class Foo {
constructor () {
this.a = 'a'
}
}
class Bar extends Foo {
constructor (options) {
super(options);
this.b = 'b'
}
}
const myBar = new Bar(); // {a: 'a', b: 'b'}
:
const a = {
a: 'a'
};
const b = {
b: 'b'
};
const c = {...a, ...b}; // {a: 'a', b: 'b'}
. , , :
, .
, , () - () , . , , , .. . Java , Haskell - , .. , , . .
, JavaScipt , .
, , , , . - . JavaScript , , .
, .
, , .
, , , , . .
Agora é a hora de simplificar, e a melhor maneira de fazer isso é entender a essência. O problema, porém, é que quase ninguém no setor entende o básico. Nós, a indústria, decepcionamos você como desenvolvedor. É nossa responsabilidade como setor educar melhor os programadores. Devemos nos consertar. Precisamos assumir mais responsabilidades. Tudo hoje depende de software, desde a economia até equipamentos médicos. Literalmente, não há lugares na vida humana que não sejam afetados pela qualidade do software. Precisamos saber o que estamos fazendo.
Agora é a hora de aprender a desenvolver software.