MENUCLOSE
twitter ツイッターfeedlyRSS

オンスタでは、オンラインで学習するために役立つコンテンツを掲載しています。そのほか、UdemyをはじめとしたEラーニングサービスの紹介も行っています。

オンスタ | オンラインで学習するための近道になるサイト
JSでのFunctional Programmingの原則と書き方

JSでのFunctional Programmingの原則と書き方

公開日:2021年10月04日
最終更新日:2021年10月04日
t.yoshioka
テクノロジー
プログラミング
ホーム > 全記事一覧 > 制作 > エンジニア > プログラミング > JSでのFunctional Programmingの原則と書き方

Warning: Undefined variable $_cat_enginieer_flag in /home/growgroup/online-study.jp/public_html/wp-content/themes/online-study-wp/views/object/components/related-posts-inline.php on line 37
このエントリーをはてなブックマークに追加
JSでのFunctional Programmingの原則と書き方
【PR】Udemyならスマホでもタブレットでも、いつでも気軽に学べます。

こんにちは!初めまして。エンジニアのTYです。

この度、初めてのブログ執筆と言うことで、僕が好きなJS関連のことを共有したいと思いました!

そこで、最近興味のある、JavascriptによるFunctional Programming(関数型プログラミング)をアウトプットも含め、知識をシェアしたいと思います。

 

Functional Programmingとは

「そもそもFunctional Programmingって何?」と思われた方も多いかと思います。もしかすると、「Object Oritented Programming(オブジェクト指向)は聞いたことある、もしくは、理解している。」方もいるかと思います。

Functional Programming(以下、FP)とは、プログラミングパラダイム(プログラミングの考え方と記述方法の枠組みを規定するもの)の一つです。

Javascriptといえば、Object Oriented Programming(以下、OOP)が有名だと思いますが、OOPもプログラミングパラダイムの一つです。ただ、オブジェクトを中心にプログラムを書くOOPとは違い、FPでは名前の通り、関数が中心になってきます。

少し具体的に言うと、

Pure Function(純粋関数)でソフトウェアを構成し、Shared State(グローバルスコープ、またはクロージャースコープにある変数)、Mutable Data(ミュータブルデータ)、Side-effects(副作用)を避けてプログラムすること。

 

FPにおいて、絶対に覚えておかなければいけないことは、

 

・Functions are pure(関数が純粋であること。)

・Variables are Immutable(変数はイミュータブルであること。)

 

文章による説明だと、「、、、 どう言うこと?」ってなるので、実際に手を動かしながら勉強していきたいと思います!

Functional Programmingの必須知識

FPを書く上で、必要な知識、実装の仕方があります。ここでは実際に手を動かしながら解説していきます。

 

Pure Functions(純粋関数)

FPにおいて関数がPure Functionsであることが前提となってきます。

Pure Functionsとは、 

・同じ引数の場合、戻り値はいつも同じになる。

・副作用が発生しない。(データベース、ファイルの書き換え等々)

関数です。

Pure FunctionとImpure Function(Pure Functionではない関数)を書いてみると、

 

Impure Function

Pure Function

 

Pure Functionsの条件は

 

・同じ引数の場合、戻り値はいつも同じになる。

・副作用が発生しない。(データベース、ファイルの書き換え等々)

 

でした。

Impure Functionの例では、グローバルスコープの impureCar オブジェクトに依存しているため、副作用が発生しています。(値を直接変えている)

一方、Pure Functionの場合直接 pureCar オブジェクトには触れておらず、引数として受けとり、それをコピーして新たなオブジェクトを生成しています。(値はそのまま)

このように、FPでは、副作用をうまないPure Functionsを組み合わせてプログラムしていきます。

Immutability 

immutableとは日本語で「不変」と言う意味で、FPにおいて一度定義したデータは変えません。

ただ、実際にデータを変えたい時はどうすればいいのか。ここでは、オブジェクト、配列のデータの変え方を見ていきます。

オブジェクトのデータ変更

配列のデータ変更

 

どちらも直接もとのデータを変更していません。

また、配列を操作するときに直接配列を操作するpush, pop, shift, unshiftなどは使われません。

代わりにmap, filter, reduceがよく用いられます。

 

Currying (カリー化)

カリー化とは、簡単に表すと、関数に渡した引数が足りない場合、それを補う関数を返すこと指します。

わかりすく表記で表すと、f(a, b, c) を f(a)(b)(c) にすることです。

例えば、「引数を二つ取りたいけど、一つしか渡せない」ときは、f(a, b) を f(a)(b) の形にします。

例にあるgreet関数はgreetingとnameの引数が必要です。しかし、配列のmap関数で引数に渡せるのはnameだけなので、greet(greeting, name) から greet(greeting)(name) に変更する必要があります。

最終的にmap関数に渡されてる関数はgreet("hello")(name)となります。

Higher Order Functions(高階関数)

高階関数とは関数を引数としてとる関数、もしくは引数を返す関数を指します。

FPでは高階関数が至る所で使われ、実際に先程のカリー化の例でも使われています。

 

Functional Composition(関数合成)

関数合成とは他の関数と組み合わせて新しい関数を作ることです。

例えば、文字列の並びを反対にしたい場合2つの関数を用いて実行できます。

const split = (str) => str.split(" ");

const reverse = (arr) => arr.reverse().join(""); 

関数合成で一つにまとめると

spritとreverseを組み合わせて、reverseStringと言う新たな関数を作っています。

reverseStringに渡した引数はsplitの引数として渡され、その戻り値がreverseの引数として渡されます。reverseの戻り値が最終的にreverseStringの戻り値となります。

R.composeの関数は、Ramdaと言うlibraryからインポートしています。

実はRamdaのように、FPのlibraryも数多く存在します。それらを用いることで、開発がしやすくなります。

Functional Programmingのメリット

ここまで記述方法を勉強しましたが正直、「書き方が決められていてめんどくさい、わかりにくい。」って思うますよね。なので最後にFPのメリットを紹介します。

 

・戻り値が決まっているので、テストがしやすい

・イミュータブルなので、バグがへる

・関数の使い回しができる(リユーザブル)

・関数の組み合わせがしやすい(コンポーザブル)

・キャッシュがしやすい

 

関数はPure Functions、変数はImmutableにするメリットはたくさんあります。

関数を書くときに、副作用がないに越したことはないですね。バグが生まれにくくなります。関数を組み合わせたり、使いまわすことも出来ます。また、同じ引数の場合、戻り値も同じになるので、テストがしやすくなります。

まとめ

以上、JavascriptでFunctional Programmingのコアな部分を解説しましたが、

OOPとFPはどっちが良いというものは無く、何を開発するのかによって使い分ける必要がありそうです。

僕自身、まだ表面的な部分しか学べておらず、勉強するたびに奥の深さを感じます。

この記事が勉強の役に立てれば幸いです。

ありがとうございました。

 

 

参考文献、資料、素材 

 


【PR】Udemyならスマホでもタブレットでも、いつでも気軽に学べます。

Udemyを実際に体験した方の感想記事もぜひご覧ください♪

関連コンテンツ


Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
Web業界で欠かせないスキル!HTML5プロフェッショナル認定資格とは?
オンライン学習
プログラミング
公開日: 2019年06月25日
最終更新日: 2022年01月17日
Web業界で欠かせないスキル!HTML5プロフェッショナル認定資格とは?
  • # HTML5プロフェッショナル認定資格
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
独断と偏見で選ぶ Chrome DevToolsの便利な機能 8選!
テクノロジー
公開日: 2018年04月07日
最終更新日: 2018年04月07日
独断と偏見で選ぶ Chrome DevToolsの便利な機能 8選!
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
年末だしwebサイトで使われるアニメーション技術の移り変わりを追ってみた
その他
プログラミング
公開日: 2016年12月20日
最終更新日: 2016年12月20日
年末だしwebサイトで使われるアニメーション技術の移り変わりを追ってみた
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
コーダーはCSS設計に夢を見る
テクノロジー
マークアップ
公開日: 2017年02月10日
最終更新日: 2022年01月17日
コーダーはCSS設計に夢を見る
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
AMP (Accelerated Mobile Pages) HTML のおさらい
テクノロジー
公開日: 2016年11月14日
最終更新日: 2022年01月17日
AMP (Accelerated Mobile Pages) HTML のおさらい
  • # AMP HTML
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
【JSプラグイン】スクロール連動型アニメーション!jQuery不要のJSプラグイン「AOS」!
Webデザイン
プログラミング
公開日: 2017年07月17日
最終更新日: 2022年01月17日
【JSプラグイン】スクロール連動型アニメーション!jQuery不要のJSプラグイン「AOS」!
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
[JavaScript_中級者への道]  プロトタイプについて – [2] クラスを定義して呼び出す
プログラミング
公開日: 2020年02月18日
最終更新日: 2022年01月17日
[JavaScript_中級者への道] プロトタイプについて – [2] クラスを定義して呼び出す
  • # ES6
  • # JavaScript
  • # クラス
  • # プロトタイプ
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
Google Chromeが2020年2月から混在コンテンツを完全にブロック?影響範囲はどこまでなの?
システム
テクノロジー
公開日: 2019年10月21日
最終更新日: 2019年10月21日
Google Chromeが2020年2月から混在コンテンツを完全にブロック?影響範囲はどこまでなの?
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
コピペ実装!CSSだけでフォームのUI改善**サンプルコード7選
テクノロジー
デザイン
マークアップ
公開日: 2021年04月22日
最終更新日: 2021年04月22日
コピペ実装!CSSだけでフォームのUI改善**サンプルコード7選
オンスタ運営

Warning: Trying to access array offset on value of type bool in /home/growgroup/online-study.jp/public_html/wp-content/plugins/wp-word-count/public/class-wpwc-public.php on line 123
制作者への影響を探る!Gutenberg (グーテンベルグ) – WordPress 5.0 搭載予定の新エディタ
テクノロジー
プログラミング
公開日: 2017年11月29日
最終更新日: 2017年11月29日
制作者への影響を探る!Gutenberg (グーテンベルグ) – WordPress 5.0 搭載予定の新エディタ
オンスタ運営
全記事一覧

web制作者にオススメのオンライン学習サイト「Udemy」

世界最大級のコースがラインナップ!電子書籍サイト「Udemy」

世界最大級のコースがラインナップ!オンライン学習サイト「Udemy」

「Udemy」ではいつでもどんなトピックでも、専門家が教える何千ものコースを用意されており、無料で学べるコースも多数あります。もうちょっと勉強したいな。スキルアップしたいな。と思ったら是非チェックしてみてください。