この記事は、基本から始めて、JavaScript ES6 +プログラムを作成するための関数型プログラミングとさまざまなテクニックに関するWritingSoftwareシリーズの一部です。接続を維持し、多くの新しいことが来ます!
構成:「部分または要素から全体を作ることからなる行動」。
高校での最初のプログラミングレッスンで、ソフトウェア開発は「複雑な問題を構成要素に分解し、単純なソリューションを複雑なソリューションに組み合わせて元の問題を解決する」と言われました。
何よりも、最初からこのレッスンの重要性を十分に理解していなかったことを後悔しています。ソフトウェア開発の本質が明らかになったのは遅すぎました。
私はプログラマーに何百ものインタビューを行ってきましたが、これは私が一人ではないという理解をもたらしました。ソフトウェア開発プロセスの本質を実際に理解しているプログラマーはほとんどいません。彼らは私たちが自由に使える最も重要なツールを知らないか、単にそれらを正しく使用する方法を知りません。絶対に誰もが開発で最も重要なことについての一方または両方の質問に答えるのに苦労しました:
機能構成(機能構成)とは?
オブジェクトコンポジション(オブジェクトコンポジション)とは何ですか?
問題は、あなたがそれについて知らないという理由だけであなたが作曲を避けることができないということです。あなたはとにかくそれをするでしょう-そしてそれをひどくします。膨大な数のエラーを含むコードを作成しますが、その上、他の人が理解するのは困難です。これは非常に深刻な問題です。結果は非常に高価です。私たちは新しいものを作成するよりも既存のソリューションをサポートすることに多くの時間を費やしており、私たちの過ちは世界中の何十億もの人々に影響を与えています。
. - , . 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 , , .
, .
, , .
, , , , . .
今こそ単純化の時であり、これを行う最良の方法は本質を理解することです。しかし、問題は、業界のほとんどの人が基本を理解していないということです。私たち業界は、開発者としてあなたを失望させました。プログラマーをよりよく教育することは、業界としての私たちの責任です。私たちは自分自身を直さなければなりません。私たちはもっと責任を取る必要があります。今日の周りのすべては、経済から医療機器まで、ソフトウェアに依存しています。ソフトウェアの品質に影響されない場所は文字通り人間の生活の中にありません。私たちは自分たちが何をしているのかを知る必要があります。
今こそ、ソフトウェアの開発方法を学ぶときです。