オブジェクト指向プログラミングが成功した理由は何ですか?[閉まっている]


17

オブジェクト指向プログラミングをこれほど成功させたあなたによると、その機能は何ですか?

  1. メッセージの受け渡し
  2. 継承
  3. 多型
  4. カプセル化

または紹介したい他の機能。

また、抽象データ型とオブジェクト指向プログラミングの関係は何ですか?


人気と成功は同義ではありません
ケビンクライン

回答:


76

オブジェクト指向プログラミングの最も重要な特性は複雑性管理の特性であることを提案します。

人間の脳は、一度に非常に多くの概念しか保持できません。7+/- 2個の独立したアイテムを記憶するという、しばしば引用されている制限が思い浮かびます。

職場で600klocシステムで作業しているとき、一度にすべてを頭に収めることはできません。それをしなければならなかった場合、私ははるかに小さなシステムでの作業に制限されるでしょう。

幸いなことに、私はする必要はありません。このプロジェクトで使用したさまざまなデザインパターンやその他の構造は、システム全体を一度に処理する必要がないことを意味します。明確に定義された方法で。

重要なオブジェクト指向の概念はすべて、複雑さを管理する方法を提供します。

カプセル化 -さまざまなサービスを提供する外部APIを、それらのサービスの実装方法を気にせずに処理させてください。

抽象化 -本質的な特徴に集中し、関係のないものは無視してください。

構成 -新しい組み合わせで既に構築されているコンポーネントを再利用させてください

ポリモーフィズム -さまざまなオブジェクトがさまざまな方法でどのように提供するかを心配せずに、サービスを要求させてください。

継承 -インターフェースまたは実装を再利用して、これまでとは異なる部分のみを提供します。

単一責任の原則 -各オブジェクトの目的を明確かつ簡潔に保つことができるため、理由を簡単に推論できます

Liskov Substitution Prinicple-奇妙な依存関係を導入することにより、お互いにトラップをかけないようにしましょう

Open / Closed Principle-既存のコードを壊すリスクを必要としない方法で拡張と変更を許可しましょう

依存性注入 -構成を次のレベルに上げて、コンポーネントを後で組み立てましょう。

インターフェイス指向の開発 -抽象化を次のレベルに進めましょう。抽象化のみに依存し、具体的な実装には決して依存しません。


6
+1。私は一度しか投票できませんが、これはもっと価値があることです。
リチャード

1
これには当然の結果があります。今は参照を見つけることができないのは残念ですが、参照してコメントを編集することを忘れないようにします。そのため、コードレビュープラクティスの研究では、フローがOOコードでより多くジャンプするため、コードレビューは手続き型コードよりもOOコードのバグを見つけるのに時間がかかる傾向があることがわかりました。TDDやペアプログラミングのようなプラクティスはそれを緩和しますが、それでもなお興味深い(そして私にとっては)予期しない結果です。

5
これは完璧な答えかもしれません-情報はいっぱいですが、読者が小説を読む必要がないように十分に短いです。ブラボー
ティムクラソン

@Graham Lee:私はその研究を読むことに興味があります。
フランクシェラー

2
@Frank @Bevan:portal.acm.org/citation.cfm

13

グラフィカルユーザーインターフェイス。80年代後半、90年代前半、Mac、Amigas、Atari ST、Windows、およびGEMが文字ベースのユーザーインターフェイスに置き換わり始めたとき、Cなどの言語がGUIプログラムを書くのに適していないことが明らかになりました。従来のデータ処理は「入力データ->処理->出力データ」スキーマと見なされますが、手続き型言語でも同様に実行できますが、OOの機能はGUIの固有の複雑さを処理するのに便利です。


1
GUIアプリケーションについて言及する場合は+1。オブジェクト指向は、GUIの実装を可能にするツールでしたが、GUIを実装しないと(手続き型コードでは)管理が非常に困難でした。
ジョルジオ

7

カプセル化によって提供されるデータ隠蔽。


これは答えですか?ADTはデータ隠蔽を提供します(これが「データ抽象化」と呼ばれる理由です)
フランクシェラー

@フランク、彼は特定の機能を求め、私がこの答えを書いたとき、他に1つだけがあり、私は複製しないようにしようとしていました。

十分に公平ですが、カプセル化はオブジェクト指向に固有のものではありません。これを自分で確認する必要がありますが、OOよりもずっと前にカプセル化を行っていたと確信しています。
フランクシェラー

1
@フランク、私はそれがオブジェクト指向に固有ではなく、主な機能の1つにすぎないことに同意します。

これはほとんどの OOPLに当てはまりますが、すべてではありません。CLOSは注目に値する例外です。
フランクシェラー

7

他の回答でまだ言及されていない機能:ドメインモデリング。人々はオブジェクトを使って、またはオブジェクトに対して何かをすることや、固有のプロパティを持つオブジェクトについて考える傾向があるため、オブジェクト指向ソフトウェアを使用して問題やワークフローをモデル化することは非常に簡単です。基本的に、コード内の名詞、動詞、形容詞を処理する既存の機能を使用できます。


6

継承はOOPの最も重要なポイントだと思います。

[ゲーム開発より]描画メソッドと属性を使用してDrawableクラスのようなものを作成し、Drawableを継承するSpaceshipクラスとPlanetクラスを作成できます。それら(および他のSprite子)からすべてのオブジェクトを取得し、drawableObjArrayをスローして、すべてのオブジェクトに対してdrawメソッドを呼び出すだけです。あなたはそれがDrawableであることを知る必要があります。


2
本当に??多態性は非常に重要であり、継承を必要としません(理論的な観点から)。
トーマスエディング

関数ポインタを使用するだけで仮想関数も必要ありません。
カルマリウス

1
Alan KayのOOの最初のコンセプトには、継承も含まれていませんでした。なぜなら、以前のシステムでの実装方法が気に入らなかったからです。
マイケルボルグワード


2

それは、オブジェクトへの人間の心の組織化の使用を促進するため、いくぶん成功しています。人々は一般的に物事の関係を見るのが得意です-違い、類似性、行動のようなもの。OOは、世界の人間の概念化を模倣するソフトウェアの開発を奨励しています。

ソフトウェア開発を世界の見方に似たものにすることで、私たちの心が複雑さを簡単に処理できるようになります。


たぶんそれは手続きに関するより多くの経験のためかもしれませんが、両方の方法を使用した後、私はまだ手続きがOOPよりも直感的であると思います。しかし、私はまだ両方のスタイルの良い部分が好きです。
ユハウンティネン

1

ここでは、「ADT対オブジェクト」が何度も尋ねられています。1行の答えは、「ADTとオブジェクトは互いに逆です。一方が他方をきちんと抽象化することはできません。それぞれがさまざまな方法で柔軟性を可能にします。」

より長い回答については、William Cookの「データ抽象化の理解について」を参照してください。簡単に言えば、オブジェクトを使用すると、いくつかのデータム(リストは配列、または自己バランスツリーのように見えるもの)の複数の実装/表現を簡単に使用できますが、新しい操作を追加することは困難です(なぜならその新しい操作を各表現に追加する必要があります)、ADTを使用するとデータ型に新しい操作を簡単に追加できますが、複数の実装を持つことは難しくなります。

編集:私は、メッセージの受け渡しがオブジェクト指向を成功に導いたと言っていました。Jonasのコメントに基づくと、それは正しくありません。なぜなら、OOとみなされるほとんどの言語はメッセージパッシングを使用しないからです。正しくないので、答えから選びました。


1
成功したOOP言語はどれもメッセージパッシングを使用しないため、メッセージパッシングはほとんど答えになりません。
ジョナス

あなたのオブジェクト指向は、必ずしも私のオブジェクト指向ではありません。そして、Alan Kayの定義では、OOと呼ばれるほとんどの言語はそうではありません。正確な引用は忘れてしまいましたが、Kay氏は、オブジェクトはSmalltalkにとって重要なものではなく、メッセージの受け渡しであると述べました(そして、この点を最も逃しました)。
フランクシェラー

@ジョナス私は、質問と私の答えを読み直したときに、「OOは成功しません。ほとんどの言語が正しくないからです」と言っていると思います。しかし、私は防炎スーツを着ているときだけそのようなことを言います。
フランクシェラー

0

私のトップ3機能。オブジェクト構成-オブジェクトの共同作業を可能にします。多態性-実行時の動的な動作をサポートします。継承-コードを再利用し、メソッドをオーバーライドして動作を変更する。

ADT-Pascalのようなオブジェクト指向ではない言語でも使用できます。スタックまたはキューは、ADTの例です。


「ADT-Pascalのような非オブジェクト指向言語でもそれを使用できます。スタックまたはキューはADTの例です。」:True。しかし、OOPを使用すると、ADTのインターフェイスを簡単に定義して、異なる互換性のある実装(インターフェイス/抽象クラス<--->サブクラス/具象クラス)を提供できます。私の知る限り、Pascalではそれほど簡単ではありません。
ジョルジオ

0

簡単な言葉で言えば、OOPは再利用性とカプセル化の鍵であり、APIを呼び出すだけで何曜日に何をしたいのかを問わず、この時代のプログラマーの生活を楽にする大規模なフレームワークを作成できます。

あなたの質問はOOPの4つの機能に関するものなので、あなたは言うことができます

  1. 継承と4.カプセル化は最も重要な機能であり、他の2つは最初の2つを達成するために非常に必要です。

so 1. Message Passingおよび3. Polymorphismは実際にサポートしています2.継承および4.カプセル化。

  1. 継承と4.カプセル化はOOPの成功の鍵です

ほとんどの場合、継承は必須ではなく、OOPの定義コンポーネントであるか、OOPの非常に望ましい部分ですらありません。カプセル化は、一般的なプログラミングに適した原則です。OOPによって発明されたのではなく、OOPだけで使用されるわけでもありません。
サラ

-1

私の意見では、最後の3つの機能は、OOPの広範な使用に影響を与えた最も重要なものです。

2. Inheritance
3. Polymorphism
4. Encapsulation

編集:もう1つのポイントは、IDEおよびVisual StudioやEclipseなどのグラフィカルインターフェイス開発環境です。OOP言語を採用するにつれて、より多くの設計がOOPに向かっている傾向がありました。

そしてもちろん、SOLID Principlesは、ソフトウェア製品を堅固な成果物にするものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.