関数型プログラミングへの初めての入門 | 関数型プログラミング

こんにちは无言非影、私はここで私の学習の旅を共有できることをとても嬉しく思っています。関数型プログラミング
についてまとめられたいくつかのメモはすべて、関数型プログラミングのコラムに記録されています。


関数型プログラミングの利点は何ですか?

  • 関数型プログラミングではこれを放棄できます
  • パッケージ化プロセス中に、無駄なコードを除外するために 3 シャーキングを使用すると効果的です。
    • Tree-shaking は rollup.js から来ており、静的 ES モジュールを分析して未使用のコードを削除するという原理は同じです。
  • テストや並列処理に便利
  • 機能開発に役立つ多くのライブラリを使用できます: lodashunderscoreramda
  • React の人気に伴い、関数型プログラミングへの注目が高まっています。Vue3 は関数型プログラミングも採用し始めています。

一般的なプログラミング パラダイム

  • 手続き型プログラミング/命令型プログラミング
    • 手続き型言語は、線形アルゴリズムの問​​題を解決するのに適しており、「トップダウン」および「卓越性」の設計方法が強調されます。
  • イベント駆動型プログラミング
    • イベント駆動型は、グラフィカル ユーザー インターフェイス (マウス、キーボード、タッチパッド) を介したユーザーとプログラムの対話によく使用されます。もちろん、例外を処理したり、ユーザー定義のイベントに応答したりするためにも使用できます。
  • オブジェクト指向 OOP
    • オブジェクト指向プログラミングには、カプセル化、継承、ポリモーフィズムという 3 つの基本概念が含まれています。オブジェクト指向言語は、クラス、メソッド、オブジェクト、メッセージ パッシングを通じてオブジェクト指向プログラミング パラダイムをサポートします。
  • 関数型プログラミング
    • 関数型プログラミングとは、ソフトウェア開発プロジェクトにおける共有状態 (Shared State)、変更可能な状態 (Mutable Data)、および副作用 (Side Effects) の使用を避けることを意味します。

JS で一般的に使用される 2 つのプログラミング パラダイム

  • プロトタイプ継承 (OOP): プロトタイプ チェーン
  • 関数型プログラミング: クロージャ、ファーストクラス関数

関数型プログラミングの定義

関数型プログラミング (Functional Programming)、略称 はFP、オブジェクト指向と並行関係にあるプログラミング パラダイムおよびプログラミング スタイルです。
の一種と考えられます思维模式+实现方法
現実世界の物事や物事のつながりをプログラムの世界に抽象化する考え方です是对运算过程的一种抽象

  • 関数型プログラミングの中核は、I /O や状態遷移などの純粋な数学関数のみを使用したプログラミング函数的结果仅取决于参数,而没有副作用です。
    • I/O(英語:Input/Output)、つまり入出力とは、通常、メモリ(内部および外部)またはその他の周辺機器との間のデータの入出力を指し、情報処理システム(コンピュータなど)間の関係を指します。 )と外部世界(人間または別の情報処理システム間の通信である可能性があります)。入力はシステムが受信する信号またはデータであり、出力はシステムから送信される信号またはデータです。

関数型プログラミングとオブジェクト指向プログラミングの違い

オブジェクト指向プログラミング

  • 利点: 命令型コーディング スタイル。コードは、コンピューターが簡単に従うことができる直接の命令セットのように読みやすいです。
  • 短所: オブジェクト指向プログラミングでは共有状態が必要になることが多く、これにより競合状態の脆弱性が簡単に発生する可能性があります (たとえば、複数の関数がプロトタイプ チェーン上のリソースの同じバッチを呼び出すときに発生する可能性があるバグ)。

関数型プログラミング

  • 利点: 共有状態や副作用を心配する必要がなく、コードをより再利用可能なコードに結合する、「ポイントフリー スタイル」 (暗黙的プログラミングとも呼ばれる)、純粋な関数を使用する、スレッド リソースの競合を心配する必要がない、競合状態などの問題。
  • 短所: コードで関数型プログラミングの機能 (パラメーターのないスタイルや多数のメソッドの組み合わせなど) を過剰に使用すると、可読性に影響し、結果的には簡潔になりますが、可読性は低下します。

関数型プログラミングの考え方

  • プログラムの本質: 入力に基づいて何らかの操作を行って、対応する出力を得る プログラムの開発プロセスには、多くの入出力機能が関与します。
  • 関数プログラミングにおける関数は、プログラム内の関数を指すのではなく、数学における関数、つまりマッピング関係を指します。例: y=sin(x)、これは x と y の間の関係です。
  • 同じ入力が与えられた場合に同じ出力を取得する (純粋関数)
  • 関数型プログラミングはデータ (関数) 間のマッピングを記述します。
// 传统的过程式编程,可能这样写:
  let a = 1 + 2;
  let b = a * 3;
  let c = b - 4;
// 函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:
  let result = subtract(multiply(add(1,2), 3), 4);

関数型プログラミングの 5 つの特徴

  • 機能は「第一級市民」です
    • JS では、関数は通常のオブジェクトです。関数は変数/配列に格納できます。また、別の関数のパラメーターや戻り値として使用したり、コンストラクターを構築することによっても使用できますnew Function()
  • 「ステートメント」ではなく「式」のみを使用してください
    • 「式」(式)は常に値を返す単純な演算処理ですが、「ステートメント」(ステートメント)は特定の演算を実行し、戻り値はありません。
    • 関数型プログラミング では表达式"(expression)、各ステップは単純な操作であり、戻り値があります。
  • 副作用はありません」
    • いわゆる「副作用」とは、関数の内部と外部の間の相互作用 (最も一般的なケースはグローバル変数の値の変更) を指し、操作以外の結果が生じます。
    • 関数型プログラミングでは、「副作用」がないこと、つまり関数が独立した状態を維持する必要があることを強調します。すべての関数は新しい値を返し、他のアクションを持たず、特に外部変数の値は変更してはなりません。
      let list = ["a", "b"] 
      // 纯函数 - 没有副作用, 对于相同的函数,输出是一样的
      
      // slice方法,截取的时候返回截取的函数,不影响原数组
      list.slice(0, 2) // =>  ["a", "b"]
      list.slice(0, 2) // => ["a", "b"]
      
      // 不纯的函数 - 有副作用,对于相同的输入,输出是不一样的
      
      // splice方法,返回原数组,改变原数组
      list.splice(0, 2) // =>  ["a", "b"] 
      list.splice(0, 2) // => []
      
  • ステータスを変更しないでください
    • 関数型プログラミングは新しい値を返すだけで、システム変数は変更しません。
    • 関数型プログラミングではパラメータを使用して状態を保存します
    无状态其实就是不做数据持久化(写入数据库或缓存),一个功能模块的输入和输出应仅由函数的参数和返回值定义。因为如果你在这个函数里对数据做了持久化,那就相当于对系统做了个隐藏的输出,从函数定义上是看不出来的,无异于增加编码人员的心智负担,同时也可能出现各种数据并发引起的异常情况。
    
  • 参照透明性
    • 参照透明性(Referential Transparency)とは、関数の動作が外部変数や「状態」に依存せず、入力パラメータのみに依存することを意味し、パラメータが常に同じである限り、参照によって得られる戻り値は返されません。機能は常に同じです。

付録

おすすめ

転載: blog.csdn.net/weixin_40887836/article/details/118408673