31

私はプログラミングの初心者ですが、StackOverflow でさまざまなプログラミング アプローチに関する興味深い議論を読んでいます。手続き型プログラミングとオブジェクト指向プログラミングの違いについては、まだ 100% 明確ではありません。オブジェクト指向プログラミングはまだプロシージャ (メソッド) を使用しているように聞こえますが、オブジェクトがショーのスターであるため、すべてが異なって編成されています。しかし、手順を踏めば、同じことをすべて行うことができるように思えます。C の場合と同様に、同様の手続きをすべてライブラリに入れることができます。C のライブラリは C++ のオブジェクトに似ていると本当に言えませんか?

4

17 に答える 17

21

ほとんどの OO 言語で手続き型のプログラミングを行うことができますが、OO のパワーは、その手続き型ロジックを継承、カプセル化、および抽象化する機能から生まれます。ライブラリはクラスによく似ているはずです。独自のスコープを持ち、関数の背後にあるロジックを意味のある名前でカプセル化する必要があります。

于 2009-02-10T01:13:36.690 に答える
13

2つの違いは微妙ですが、重要です。

手続き型プログラムでは、モジュールは共有データ構造に格納されている状態の読み取りと書き込みによって相互作用します。

オブジェクト指向プログラムでは、オブジェクト形式のモジュールは、他のオブジェクトにメッセージを送信することによって相互作用します。

于 2009-02-10T06:51:12.980 に答える
7

[初心者のスタイルを許してください、遅くて疲れています]

プロシージャはデータを処理します - データを入力し、何らかの処理を適用し、データを取り出します

場合によっては、一部のデータ要素が他の一部のデータ要素に関連していることがあります。それらをデータ構造にグループ化すると便利です。これにより、単一のユニットとして操作およびアドレス指定できます。

これで、プロシージャはデータ構造を入力として取り、それを変更したり、出力として別のデータ構造を生成したりできます。

時折、特定の種類のデータ構造のみに関係するプロシージャがあることに気付くことがあります。これらのプロシージャをデータ構造と一緒にグループ化し、objectと呼ぶと便利です。

オブジェクトを作成するためのテンプレートはクラスと呼ばれます。オブジェクトはクラスのインスタンスであると言われます

あるクラスが別のクラスと非常によく似ていることに気付くかもしれません。そのため、コードをコピーして貼り付ける代わりに、あるクラスを別のクラスから継承させます。サブクラスはスーパークラスまたは「基本クラス」から継承します。このようにして、サブクラスはスーパークラスのすべてのデータ構造とプロシージャにアクセスでき、特定の方法でそれらを拡張またはオーバーライドできます。

オブジェクトのプロシージャを直接呼び出すのではなく、オブジェクトに何かを行うように丁寧に要求する場合、実際の「メッセージ」が送信されなくても、これはメッセージ パッシングと呼ばれます。ここでの喜びは、多くの異なる種類のオブジェクトが同じメッセージを理解できることであり、これがポリモーフィズムの概念につながります。たとえば、さまざまな種類のドキュメント自体に印刷を依頼すると、それぞれが適切に応答します。

メッセージの受け渡しと継承を使用して (クラスを介して、または介さずに) オブジェクトをサポートする言語は、オブジェクト指向と呼ばれます。継承がない場合、言語は単にオブジェクトベースです。

勉強頑張ってください!

于 2009-02-10T02:35:36.090 に答える
6

違いは、オブジェクトには手続きと関連データが同じ場所にあるということです。手続き型言語は「構造体」(関連データを一緒に保持するもの) を使用して、データを手続きとは別に保持します。事実上、オブジェクト指向言語で行うことはすべて、構造体と手続きを組み合わせた手続き型言語で可能になるはずです。

主な違いは、OO 言語がプログラマーに与えるマインド セットです。

于 2009-02-10T01:12:19.173 に答える
4

手続き型は、プログラムが何をすべきかを記述するさまざまな方法の間の手続き型/機能的/論理的 (または論理指向) の区別 (c、lisp、およびプロローグを比較) の一部です。

オブジェクト指向は、この別の考え方と直交しており、サブプログラムをデータでグループ化する手段を説明しています。C++ と Java は、オブジェクト指向機能を備えた手続き型言語です。fortran77 は、オブジェクト指向機能を持たない手続き型言語です。Common Lisp はオブジェクト指向をサポートしています。一部の古い Lisp はそうではありません。プレーンなバニラ プロローグはオブジェクトをサポートしていません。また、オブジェクトをサポートするロジック指向言語の名前を付けることもできません (私はロジック指向プログラミングを行っていません。時間に余裕あるときに行うことのリストに載っています。ほとんどサポートしていません)。関数型プログラミング)。

ただし、他の人が指摘しているように、適切なオブジェクト指向の考え方は、手続き型から関数型に切り替えるのと同じくらい、プログラミングの方法を変えます。


ところで、「手続き型」は、非オブジェクト指向の手続き型言語とオブジェクト指向の兄弟を区別するために多く使用されているようですが、「オブジェクト指向ではない」という明確な形容詞がないために、これは不適切な使用法だと思います。YMMV。

于 2009-02-10T01:19:12.323 に答える
2

コンテキストで理解しやすいので、言語間で導入された他の抽象化を見てください。

アセンブリ言語と、C や Pascal などの手続き型言語との主な違いは、「手続き」抽象化の導入です。アセンブリ コードを作成する人はプロシージャを作成しますが、それは困難でエラーが発生しやすいため、手続き言語はそれを簡単にするツールを提供します。

手続き型言語と C++ のようなオブジェクト指向言語の違いは、「オブジェクト」の抽象化です。「c」と書く人は概念的なオブジェクトを作成することがよくありますが、それは難しく、エラーが発生しやすいため、オブジェクト指向言語はそれを簡単にするツールを提供します。

Microsoft (または Erlang) のSing#のようなものは、メッセージ/プロセスの抽象化を言語に追加します。確かに、アセンブリ、C、または C++ でメッセージの受け渡しとプロセスの作成を行うことができますが、Sing# の方が簡単です。

それはすべて同じマシンコードに帰着します。これらの抽象化は純粋に私たちの脳のためであり、コンピューターのためではありません。

于 2009-02-10T02:48:46.463 に答える
2

違いは

手続き指向プログラミング - データよりもアルゴリズムを重視します。このプログラミング方法は手続き、つまり特定のタスクを実行し、データ構造を共有する方法に集中します。トップダウン構造に従います。

例:パスカルとC

オブジェクト指向プログラミング - アルゴリズムよりもデータを重視します。それはボトムアップ構造に従います。すべてのものはオブジェクトとして見られます。各オブジェクトには、独自のデータ構造とプロシージャがあります。データの隠蔽、ポリモーフィズム、カプセル化、メッセージ パッシングなどの機能が含まれています。ユーザーは、プログラムでそれらを使用している間、これらのオブジェクトの中身を気にする必要はありません。

例: C++ と Java

于 2013-02-09T07:42:39.567 に答える
2

手続き型プログラムでは、大きな問題を小さな問題に分割し、これらの小さな問題のそれぞれを手続きとして抽象化します。これは手続き的抽象化と呼ばれます。

オブジェクト指向プログラムでは、問題をいくつかのオブジェクトとして分析し、オブジェクト間の相互作用を分析します。これをオブジェクトの抽象化と呼びます。

于 2012-03-04T11:01:58.300 に答える
1

OOPの定義方法によって異なります。オブジェクトのメソッドを呼び出すJavaのようなOOPに関しては、手続き型プログラミングはほとんど同じです。私が知る限り、すべてのOOP原則(カプセル化、抽象化、ポリモーフィズム、継承)をCのような手続き型言語でエミュレートできます。これの証明はGObjectであり、ある程度はObjective-Cであり、Cを使用する他の多くのOOP言語の実装です。 cPythonのように。これは、構造体を使用し、関数を使用してそれらの構造体を操作することによって行われます。

typedef struct {
    Object *isa;
    String *name;
    Date *birthday;
} Person;

Person *Person_new();
String *Person_name(Person *self);
void Person_setName(Person *self, String *newName);
// ...

インターフェイスは非常にOOPに似ています。ポリモーフィズムは実際には許可されていませんが、可能です。属性が「メソッド」とは別であることを除けば、Pythonインターフェースと非常によく似ています。

class Person(object):
    def __init__(self):
        self._name = ""
        self._age = datetime.datetime.now()

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

Cの例のように「自己」が明示的であるため、この例ではPythonを選択しました。Javaのような多くのOOP言語は、これを抽象化します。

オブジェクトのメソッドを呼び出すのではなく、メッセージがオブジェクトに送信されるSmalltalkのようなOOPもあります。違いは一見微妙ですが、多くのパワーと柔軟性を提供します。これは、Objective-Cで証明されているように、手続き型言語で実装することもできます。

オブジェクト指向プログラミングは、必ずしも一種の言語ではなく、パラダイムです。Java、Python、Rubyなどのオブジェクト指向言語は、オブジェクトを簡単に操作するためのシンタックスシュガーを提供します。これが、「手続き型言語」と「オブジェクト指向言語」の主な違いです。

実際、ライブラリ、または構造体を操作する関数のセットは、C++のオブジェクトと同じです。実際、C++はまさにそのように実装されています。

于 2009-02-10T05:07:45.647 に答える
1

これは簡単な答えです。

  • 真の OO 言語では、手続き型コーディングのみがオブジェクト内で行われます。

  • C にはオブジェクトがなく、C++ はオブジェクトをサポートする言語です。一方、Javaはすべてオブジェクトです(プリミティブを除く)。すべてが入力されています。

  • オブジェクトの内部では線形の進行が発生しますが、オブジェクト自体はコードとデータの単なるコレクションです。
于 2009-02-10T01:12:31.827 に答える
0

手続き型と OO の違いの非常にわかりやすい例として、Smalltalk を学んでみてください。Smalltalk では、すべて、つまりすべてがオブジェクトです。if ステートメントや while ループはありません。他のオブジェクトにメッセージを送信する (メソッドを呼び出す) ことで、その機能を実現します。最初は本当に頭が回転しますが、OO がどうあるべきかすぐに理解できると思います。

于 2009-02-10T05:20:35.350 に答える