3

stackoverflow の回答と質問を読んでいると、オブジェクト指向は本質的に必須であるために区分化されているという印象を受けています。

しかし、オブジェクト指向は、コードとデータを現実世界のオブジェクトに区分化するための単なる方法ではありませんか?

もしそうなら、なぜそのようなプラットフォームで動作する他の下位レベルのパラダイムを放棄するのでしょうか?

デフォルトで不変のオブジェクトベースのジェネリック型システムであるIOWは、関数型の第一言語が機能する方法であり、デフォルトで可変のオブジェクトベースのジェネリック型システムは命令型言語の世界です。

それとも、何かが完全に欠けていますか?

4

7 に答える 7

14

いいえ。OOと命令は2つの直交する概念です。

例えば:

  • Common Lisp Object Systemは、Lisp OOの例であり、おそらく最も複雑なオブジェクトシステムです。
  • OCamlは、オブジェクト指向組織をサポートするオブジェクトシステムとモジュールシステムを備えた関数型言語です。
  • Scalaは、非常に柔軟なオブジェクト指向システムを備えた関数型言語です
  • Haskellを使用すると、より高度なポリモーフィズムを使用してオブジェクト指向コードを記述できます

オブジェクト指向になるには、さまざまな方法があります。

于 2009-02-16T15:07:03.573 に答える
6

ほとんどの OO 言語は命令型ですが、ある程度機能的なスタイルで使用できます。一部の関数型言語は、オブジェクト指向フレームワーク (.NET 上の F# が最も明白な例です) の上に位置し、適切な場所で使用する大規模なフレームワークを取得するために、いくつかの「純粋性」をトレードオフします。

関数型スタイルでのプログラミングを支援するために、「主にオブジェクト指向」言語には多くの余地があると思います。不変性のサポートの改善が最も明白な機能であり、その後に型推論の改善が続く可能性があります。(少なくとも C# について話すときは、関数型のドアに足を踏み入れようとしている伝統的な言語のおそらく最も重要な例です。)

于 2009-02-16T14:59:35.013 に答える
4

はい。オブジェクト指向は、プログラマーがプログラムを動作し相互作用する一連のステートフル オブジェクトとして表現できるようにするプログラミング スタイルです (通常、動的型付け言語ではメッセージ パッシングを使用し、静的型付け言語ではメソッド呼び出しを使用します)。そして、特定の順序でそれを行います。

状態、アクション、およびシーケンスは、手続き型プログラミングの概念であり、非モナド関数型プログラミングには存在しません (モナドは、純粋な関数型言語 Haskell で状態、アクション、およびシーケンスを実装するために使用されます。そうでなければ、これらの概念はありません)。

于 2009-02-16T15:15:49.577 に答える
2

別の観点から見ると、ほとんどの人は (再帰や RPN ではなく) 命令的に考えるのが好きです。このことから、ほとんどの言語は命令型になります。

もちろん、多くの問題は、非命令型のアプローチ (ユーザー インターフェイスなど) を使用した方がはるかに簡単に表現 (または解決) できますが、ほとんどの人はこのアプローチに慣れていません。人里離れた道を離れたくない人もいれば、こちら側から問題にアプローチするために必要な精神的な変化を実際に行うのに苦労している人もいます (変数やループの代わりにメソッド呼び出しや再帰を考える)。

于 2009-02-16T15:20:14.527 に答える
2

私は今でも、オブジェクト指向は本質的に不可欠な概念であると固く信じています。ただし、 最近の質問により、プログラミングパラダイム全般についてもう少し考えさせられたので、より包括的な回答をまとめました。これはややトピックから外れていますが、偶然にもあなたの質問にも答えています。

2 つの主要なプログラミング パラダイムは、プログラマーが抽象的な関係を書き留める (コンパイラーに必要なものを伝える)宣言型パラダイムと、プログラマーがアルゴリズムを書き留める (コンピューターに必要なものを取得する方法を伝える)命令型パラダイムです。 .

パラダイムはアプリオリに言語にとらわれないものです。それは、プログラムについてどのように考え、構造化するかについての方法です。ただし、パラダイムを簡単に使用できるようにする言語には違いがあります。言語のセマンティクスと構文により、慣用的なコードの記述方法が生まれます。

宣言型言語の例は Prolog であり、命令型言語の例は Fortran です (そして、本物のプログラマーは FORTRAN プログラムを任意の言語で記述できます)。

命令型であると同時に宣言型でもあるコードの例として、Perl6 でのフィボナッチ数列の次の実装を考えてみましょう。

my @fibonacci-sequence := 0, 1, * + * ... *;

これは明らかにシーケンスの宣言的な記述です。ただし、*...は有効な Perl6 演算子であるため (whatever-star はラムダ式を作成するために使用でき、sequence 演算子は遅延リストを作成するために使用できます)、これはランタイム組み込みコードを呼び出す命令ステートメントでもあります。

他のプログラミング パラダイム、特に関数型プログラミングとオブジェクト指向プログラミングについて考えてみましょう。

機能パラダイムは、セット間の関係として計算をモデル化するため、本質的に宣言的です。

オブジェクト指向パラダイムは、メッセージ パッシングと呼ばれるステートフル オブジェクト間の通信として計算をモデル化するため、本質的に必須です。

一部の言語は純粋です。つまり、すべての計算がパラダイムに準拠しています。たとえば、Haskell は純粋な関数型言語であり、Smalltalk は純粋なオブジェクト指向言語です。

ただし、これは関数型言語がそれぞれ異なるという意味ではありません。オブジェクト指向言語は命令型の resp を防ぎます。宣言型プログラミング。実際には、関数を命令的に使用することがよくあります。つまり、入力値を入力して出力値を取得します。オブジェクト指向プログラミングでは、逆のことが当てはまります。オブジェクトが受け入れるメッセージのセットは、そのインターフェイスを宣言します。

于 2011-02-01T11:09:06.117 に答える
0

OOが必須の概念であることに同意しない人もいるので、ここに私の理由があります。

オブジェクト指向の必需品:

  1. オブジェクトは状態を保持します(つまり、他のオブジェクトへの参照)
  2. オブジェクトはメッセージを受信(および処理)します
  3. メッセージを処理すると、結果が生じる可能性があります
    • オブジェクト自体または他のオブジェクトに送信されるメッセージ
    • オブジェクトの状態の変化

これは、オブジェクト指向プログラミングには、オブジェクト(!)によって保持される可変状態が必要であることを意味します。一連のオブジェクトを作成して状態の変化をシミュレートすると、これらの不変条件を簡単に破ることになります。

Flamebait:このオブジェクト指向の定義に同意できない場合は、AlanKayに相談してください。

于 2009-02-16T17:48:16.480 に答える
0

オブジェクト指向プログラミングの概念には、さまざまな概念が貢献しています。ウィキペディアにはそれらのほとんどがリストされています。

OOP の本質は、オブジェクトと Behaviorsの使用によって特徴付けられます。

ウィキペディアでは、次の 3 つのプロパティによってオブジェクトを特徴付けています。

  1. Identity : 他のオブジェクトと区別するオブジェクトのプロパティ
  2. State : オブジェクトに格納されているデータを記述します
  3. Behavior : オブジェクトを使用できるオブジェクトのインターフェースのメソッドを記述します

多くのオブジェクト指向言語にはクラスという概念がありますが、実はJavaScript のようなプロトタイプベースの言語もあります。

関数型言語もクラスを使用する場合があります (Haskell の型クラスなど)。しかし、クラスがあるからといって、それらがオブジェクト指向であることや、オブジェクト指向プログラミングが可能であることを意味するわけではありません。Haskell の例にとどまるには: オブジェクトすらありません! 「アイデンティティ」という概念はありません!できることは、純粋な関数を作成することだけです!

誰かが「クラス」という用語を使用しているからといって、オブジェクト指向プログラミングを行っているわけではありません!

OOP は、動作を伴うステートフル オブジェクトに関するものです。代わりに新しいオブジェクトを作成できるため、オブジェクトの動作はそのオブジェクトを変更する必要はありませんが、オブジェクトの必要性は完全に失われます。もう変更はないため、1 つのオブジェクトへの変更が同じオブジェクトへの他の参照によって反映されても問題にならないため、ID はもう必要ありません。必要なのは、値 (ID なし) と、データの隠蔽とカプセル化のためのモジュールおよび/またはクラスだけです。

はい、命令型プログラミングはOOPに固有のものです。

于 2009-08-21T10:01:13.387 に答える