Oracle CorporationがJava SE 8でいくつかの機能的な構造を導入したため、最近ではほとんどの面接官が関数型プログラミングに関する質問をする傾向にあります。Java/Groovy/Scalaの開発者や他の関数型プログラミングの開発者として、面接をクリアするために以下の質問と回答を学ぶべきです。
- 関数型プログラミングとは何ですか?
- 関数型プログラミングの利点と欠点は何ですか?
- 関数型プログラミングと命令型プログラミングの違いは何ですか?
- 関数型プログラミングとオブジェクト指向プログラミングの違いは何ですか?
- 関数型プログラミング、命令型プログラミング、オブジェクト指向プログラミングの主な違いは何ですか?
- 関数型プログラミングの主な利点は、命令型プログラミングやオブジェクト指向プログラミングに比べて何ですか?
- いつ関数型プログラミングを使用するべきですか?
- いつオブジェクト指向プログラミングを使用するべきですか?
- オブジェクト指向プログラミングの欠点は何ですか?
- オブジェクト指向プログラミングの継承の欠点は何ですか?… など
この投稿では、以下の3つの人気のあるプログラミングパラダイムについて、それぞれ詳しく説明し、上記の質問にも回答します:
- 関数型プログラミング(FP)
- 命令型プログラミング(IP)
- オブジェクト指向プログラミング(OOP)
関数型プログラミングとは何ですか?
単純に言えば、関数型プログラミング(FP)は、数学的関数のように計算を行い、状態の変更やデータの変異を行いません。関数型プログラミングでは、関数が第一級の候補となります。我々は一連の関数と不変のデータを定義してプログラムを記述します。関数型プログラミングの例:Scala、Haskell、Earlangなどが人気のある関数型プログラミング言語です。Java SE 8にもいくつかの関数的構造があります(詳細はJava 8の投稿を参照してください)
FPの特性は何ですか?
Scalaなどの関数型プログラミング言語には、以下の特性があります。
- 状態は存在しません。
FPプログラムには状態が含まれていません。つまり、すべてのデータは不変のデータであり、関数は状態を変更できません。実行順序の低い重要性
FP言語では、一連の独立した関数でプログラムを記述します。関数には一連の文が含まれています。FPでは、これらの関数の実行順序はあまり重要ではありません。なぜなら、状態がないため、すべての関数が独立して動作し、実行順序を変更しても結果が同じであるからです。状態を持たないプログラミングモデル
すべてのFPプログラムは、変更できないデータと関数を使用します。これは、FP言語が状態を持たないプログラミングモデルをサポートしていることを意味します。関数は第一級市民です
FP言語では、関数は第一級のオブジェクトです。関数は独立した単位であり、任意の順序で実行できます。主要な操作単位
FP言語では、主要な操作単位は関数とデータ構造です。すべてのプログラムはこれらの単位を使用して構築されています。モジュラープログラミング
FP言語では、状態を持たないプログラミングモデルをサポートするために、より小さな独立した単位、つまり純粋な関数を記述する必要があります。これは、FPがOOPよりも優れたモジュール性をサポートしていることを意味します。高階関数と遅延評価
関数型プログラミング言語は、高階関数と遅延評価の機能をサポートする必要があります。主要なフロー制御
FP言語は、For…ループ、Do…Whileループ、While…ループなどのフロー制御や、If…ElseやSwitch文などの条件文を使用しません。すべてのFP言語は、以下のものを使用してプログラムを記述します:
- 関数
- 関数呼び出し
- 再帰を伴う関数呼び出し
- 抽象化、カプセル化、継承、および多様性
OOPのように、FP言語はすべての4つの概念をサポートしています:抽象化、カプセル化、継承、および多様性。FP言語は、型クラスまたは暗黙の型変換を使用して継承をサポートしています。彼らはジェネリックスの助けを借りて多様性をサポートしています。これは、パラメトリック多様性としても知られています。
FPの主な焦点は何ですか?
OOP言語とは異なり、すべてのFP言語プログラムは主に「何をしているか」または「何をする必要があるか」に焦点を当てています。彼らは主に以下のことに焦点を当てています:
- 望ましい情報は何ですか、それが入力です。
- 必要な変換は何ですか、それが実際のロジックです。
つまり、FPは主に「何をする必要があるか」に焦点を当てています。それはあまり「どのようにすべきか」にはあまり焦点を当てません。そのため、問題領域の説明として関数型プログラミングを記述できます。そのため、開発者だけでなく、他の人々もFPコードを非常に簡単に理解することができます。次に、関数型プログラミングの「利点と欠点」(利点と欠点)について説明します。
関数型プログラミングの利点は何ですか?
関数型プログラミング言語には、以下の利点があります:
- バグのないコード
関数型言語は状態をサポートしていないため、副作用を引き起こしません。これはエラーフリーなコード、またはバグのないコード、またはエラーが少ないコードを書くことができることを意味します。効率的な並列プログラミング
関数型言語は可変な状態を持たないため、状態の変更の問題が発生しません。これは不変なデータのみを使用することを意味します。プログラムを書くための独立した単位である「関数」を使用して、非常に効率的な並列または同時プログラミングを記述できます。パフォーマンスの向上
関数型プログラムはすべての独立したユニットで構成されているため、並列または同時に実行できます。この理由から、関数型アプリケーションはより優れたパフォーマンスを得ることができます。より良いカプセル化
OOPとは異なり、FPは純粋な関数によるより良いカプセル化をサポートしています。純粋な関数は副作用がないことを意味します。ネストした関数のサポート
ネストした関数は問題を解決するために他の関数内で関数を構築することを意味します。FPはネストした関数をサポートしています。再利用性の向上
FPプログラムは「関数」と呼ばれる独立したユニットで構成されているため、それらを非常に簡単に再利用できます。より良いモジュラリティ
関数型言語では、ステートレスプログラミングモデルをサポートするために、小さな独立したユニットである純粋な関数を書く必要があります。これはOOPよりも優れたモジュラリティをサポートしています。簡単な遅延評価
関数型言語では、遅延評価を簡単に書くことができます。遅延リスト、遅延マップなど、遅延関数構造をサポートしています。可読性と保守性の向上
関数型プログラミング(FP)は、独立して動作し、状態を変更しないため、可読性と保守性を向上させます。テストの向上
FPプログラムは「関数」と呼ばれる独立したユニットを使用して書かれているため、それらを単体テストすることが非常に簡単です。動作に対する抽象化のサポート
OOPとは異なり、FPは「データに対する抽象化」と「動作に対する抽象化」の両方をサポートしています。実際の世界には両方が含まれています。BigDataへのサポート
FPは並列プログラミングと優れたパフォーマンスをサポートしているため、BigDataアプリケーションの開発に非常に適しています。堅牢で信頼性のあるコード
FPは不変なデータを使用しているため、FPを使用して堅牢で信頼性のあるコードを簡単に開発することができます。
関数型プログラミングの欠点?
優れた利点に加えて、関数型プログラミング言語には非常に少数または無視できる欠点しかありません。次のような欠点しかありません:
- 多くのメモリを必要とします
FPは状態を持ちません。常に既存のオブジェクトを変更する代わりに、アクションを実行するために新しいオブジェクトを作成します。そのため、FPアプリケーションは多くのメモリを使用します。- リスコフの置換に焦点を当てていません
関数型プログラミングの主要な概念は何ですか?
次の概念は、関数型プログラミングの主要で重要な概念です。
- ファーストクラス関数。
- 遅延評価。
- 高階関数。
- 不変性(変更不可データ)。
- モジュラリティ。
- 副作用なし。
- 遅延評価。
- 再帰的な関数呼び出し。
命令型プログラミングとは何ですか?
命令型プログラミング(IP)は、一連の手順/命令/文をある順序で実行する、人気のあるプログラミングパラダイムの1つです。IP言語の例:-Java、C、C++など
命令型プログラミングの主な特徴は何ですか?
どの命令型プログラミング(IP)言語も、次の特徴を含むことができます:
- 文の順序。
- 文の実行順序が非常に重要です。
- 状態を持っています。
- 不変データと可変データの両方を使用します。
- 状態を変更できます。
- 副作用を持つ可能性があります。
- 状態を持つプログラミングモデル。
- プログラムの状態を直接変更します。
- データフィールドで状態を表します。
オブジェクト指向プログラミングとは何ですか?
オブジェクト指向プログラミングは、別の種類のプログラミングパラダイムです。すべてをオブジェクトとして表現します。それぞれのオブジェクトには、いくつかのデータフィールドとメソッドが含まれています。すべてのOOPプログラムには状態が含まれています。可変データとデータ構造を使用します。関数型プログラミングのように、不変のデータを使用して完全なプログラミングを書くことができますが、このルールを強制しません。オブジェクト指向プログラミング(OOP)は、命令型プログラミングのスーパーセットです。いくつかの追加機能を備えたIPのすべての特性に従います。これらの追加機能は次のとおりです:
- すべてがオブジェクトです。
- それぞれのオブジェクトには、いくつかのデータフィールドとメソッドが含まれています。
- OOPの概念:抽象化、カプセル化、継承、ポリモーフィズム
関数型プログラミング言語とは異なり、OOP言語は主に「どのように行うか」に焦点を当てています。つまり、開発者としては、「あなたがどのように行っているか」に焦点を当てています。さらに、OOPは「何をしているか」と「どのように行っているか」の両方を組み合わせています。そのため、簡潔でより読みやすいコードを書くことができません。開発者だけがコードを理解でき、他の人はアプリケーションコードを理解するのに混乱する可能性があり、理解できません。
オブジェクト指向プログラミング(OOP)の欠点は?
OOPは多くのリアルタイムの問題を解決していますが、次の欠点があります(FPと比較した場合):
- 完全な再利用をサポートしていません。
- それは完全なモジュラリティではありません。
- それはカプセル化の概念を壊します。
- 継承には多くの欠点があります。
継承の主な欠点:
- カプセル化の原則を破る
- 継承レベルが増加すると、オブジェクトのメンテナンスと作成が非常に難しくなります。
いつ関数型プログラミングを使用するか?
次のシナリオで関数型プログラミング(FP)を使用する必要があります:
- データに対して多くの異なる操作を実行する予定があり、それが固定されている場合。
- 言い換えると、操作が多いものがある場合。
いつオブジェクト指向プログラミングを使用するか?
次のシナリオでオブジェクト指向プログラミング(OOP)を使用する必要があります:
- 共通の振る舞いを持つ多くの異なるバリアントで少数の操作を実行する予定の場合。
- つまり、操作が少ない場合に、より多くのものを持つことになります。
注: ここでのものとは現実世界のオブジェクトであり、操作とは現実世界のアクションです。たとえば、Javaでは、これらの現実世界のものを「クラス」として、現実世界のアクションをメソッド(操作)として表します。
FPとOOP(IP)の違いは何ですか?
Functional Programming | OOP |
---|---|
Does not exist State | Exists State |
Uses Immutable data | Uses Mutable data |
It follows Declarative Programming Model | It follows Imperative Programming Model |
Stateless Programming Model | Stateful Programming Model |
Main Fcous on: “What you are doing” | Main focus on “How you are doing” |
Good for Parallel (Concurrency) Programming | Poor for Parallel (Concurrency) Programming |
Good for BigData processing and analysis | NOT Good for BigData processing and analysis |
Supports pure Encaspulation | It breaks Encaspulation concept |
Functions with No-Side Effects | Methods with Side Effects |
Functions are first-class citizens | Objects are first-class citizens |
Primary Manipulation Unit is “Function” | Primary Manipulation Unit is Objects(Instances of Classes) |
Flow Controls: Function calls, Function Calls with Recursion | Flow Controls: Loops, Conditional Statements |
It uses “Recursion” concept to iterate Collection Data. | It uses “Loop” concept to iterate Collection Data. For example:-For-each loop in Java |
Order of execution is less importance. | Order of execution is must and very important. |
Supports both “Abstraction over Data” and “Abstraction over Behavior”. | Supports only “Abstraction over Data”. |
We use FP when we have few Things with more operations. | We use OOP when we have few Operations with more Things. For example: Things are classes and Operations are Methods in Java. |
これはすべて、3つの人気のあるプログラミングパラダイムについての話です。注:私は基本的にOOPから来ていますが、ちょうど1年前にFPに取り組み始めました。ですので、もし関数型プログラミングの専門家がこの投稿で何か間違いを見つけた場合は、貴重なご意見をお寄せください。私の投稿が気に入ったり、疑問や提案がある場合は、コメントを残してください。