[解決済み] 関数型プログラミング言語と命令型プログラミング言語の違いは何ですか?
質問
C#、Visual Basic、C++、Javaなどのオブジェクト指向プログラミング(OOP)言語を含む主流の言語は、主に命令型(手続き型)プログラミングをサポートするように設計されているのに対し、Haskellやgoferなどの言語は純粋に関数型である。この2つのプログラミング方法の違いは何なのか、どなたか詳しく教えてください。
プログラミングの方法を選択するのはユーザーの要件によると思いますが、なぜ関数型プログラミング言語を学ぶことが推奨されるのでしょうか。
どのように解決するのですか?
定義 命令型言語では、ある目標に到達するための方法を決定するために一連のステートメントを使用します。これらの文は、それぞれが順番に実行されることによって、プログラムの状態を変化させると言われています。
例 Javaは命令型言語である。例えば、数字の羅列を足すプログラムを作ることができる。
int total = 0;
int number1 = 5;
int number2 = 10;
int number3 = 15;
total = number1 + number2 + number3;
各変数に値を代入するところから、最終的に値を足すところまで、各ステートメントでプログラムの状態を変化させる。5つのステートメントを使って、5、10、15を足し算する方法を明示的に指示しています。
関数型言語。 関数型プログラミングパラダイムは、問題解決への純粋な関数的アプローチをサポートするために明示的に作られました。関数型プログラミングは宣言型プログラミングの一種です。
純粋な関数の利点。 関数型変換を純粋関数として実装する最大の理由は、純粋関数がComposable、つまり自己完結型でステートレスであることです。これらの特性は,以下のような多くの利点をもたらします. 可読性と保守性が向上する.これは,各関数が引数から与えられた特定のタスクを達成するように設計されているためです.この関数は、外部の状態には一切依存しない。
繰り返しの開発が容易になる。コードのリファクタリングが容易なため、設計の変更も容易に行えることが多い。例えば、複雑な変換を書いた後、いくつかのコードが変換の中で何度も繰り返されていることに気付いたとする。純粋なメソッドを通してリファクタリングすれば、副作用を気にすることなく、純粋なメソッドを自由に呼び出すことができます。
テストとデバッグが容易になる。純粋関数はより簡単に分離してテストできるので、典型的な値、有効なエッジケース、および無効なエッジケースで純粋関数を呼び出すテストコードを書くことができます。
OOPな人向けや 命令型言語。
オブジェクト指向言語は、物事に対する操作のセットが決まっていて、コードが進化するにつれて、主に新しいものを追加していくような場合に適しています。これは、既存のメソッドを実装した新しいクラスを追加し、既存のクラスはそのままにしておくことで実現できる。
関数型言語が適しているのは、固定された物事のセットがあり、コードが進化するにつれて、主に既存の物事に対する新しい操作を追加していく場合である。これは、既存のデータ型を使って計算する新しい関数を追加し、既存の関数はそのままにしておくことで実現できる。
短所
プログラミングの方法を選択するのはユーザーの要件に依存するので、ユーザーが適切な方法を選択しない場合にのみ弊害が生じます。
進化が間違った方向に進むと、問題が発生するんですね。
- オブジェクト指向のプログラムに新しい操作を追加する場合、新しいメソッドを追加するために多くのクラス定義を編集する必要がある場合があります。
- 関数型プログラムに新しい種類のものを追加するには、新しいケースを追加するために多くの関数定義を編集する必要があるかもしれません。
関連
-
[解決済み] Lua スクリプトがエラー "nil値(フィールド 'deposit')を呼び出そうとした" をスローします。
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み】type()とisinstance()の違いは何ですか?)
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み】Goのコンストラクタ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン