回答:
オブジェクト指向プログラミングの最も重要な特性は複雑性管理の特性であることを提案します。
人間の脳は、一度に非常に多くの概念しか保持できません。7+/- 2個の独立したアイテムを記憶するという、しばしば引用されている制限が思い浮かびます。
職場で600klocシステムで作業しているとき、一度にすべてを頭に収めることはできません。それをしなければならなかった場合、私ははるかに小さなシステムでの作業に制限されるでしょう。
幸いなことに、私はする必要はありません。このプロジェクトで使用したさまざまなデザインパターンやその他の構造は、システム全体を一度に処理する必要がないことを意味します。明確に定義された方法で。
重要なオブジェクト指向の概念はすべて、複雑さを管理する方法を提供します。
カプセル化 -さまざまなサービスを提供する外部APIを、それらのサービスの実装方法を気にせずに処理させてください。
抽象化 -本質的な特徴に集中し、関係のないものは無視してください。
構成 -新しい組み合わせで既に構築されているコンポーネントを再利用させてください
ポリモーフィズム -さまざまなオブジェクトがさまざまな方法でどのように提供するかを心配せずに、サービスを要求させてください。
継承 -インターフェースまたは実装を再利用して、これまでとは異なる部分のみを提供します。
単一責任の原則 -各オブジェクトの目的を明確かつ簡潔に保つことができるため、理由を簡単に推論できます
Liskov Substitution Prinicple-奇妙な依存関係を導入することにより、お互いにトラップをかけないようにしましょう
Open / Closed Principle-既存のコードを壊すリスクを必要としない方法で拡張と変更を許可しましょう
依存性注入 -構成を次のレベルに上げて、コンポーネントを後で組み立てましょう。
インターフェイス指向の開発 -抽象化を次のレベルに進めましょう。抽象化のみに依存し、具体的な実装には決して依存しません。
グラフィカルユーザーインターフェイス。80年代後半、90年代前半、Mac、Amigas、Atari ST、Windows、およびGEMが文字ベースのユーザーインターフェイスに置き換わり始めたとき、Cなどの言語がGUIプログラムを書くのに適していないことが明らかになりました。従来のデータ処理は「入力データ->処理->出力データ」スキーマと見なされますが、手続き型言語でも同様に実行できますが、OOの機能はGUIの固有の複雑さを処理するのに便利です。
他の回答でまだ言及されていない機能:ドメインモデリング。人々はオブジェクトを使って、またはオブジェクトに対して何かをすることや、固有のプロパティを持つオブジェクトについて考える傾向があるため、オブジェクト指向ソフトウェアを使用して問題やワークフローをモデル化することは非常に簡単です。基本的に、コード内の名詞、動詞、形容詞を処理する既存の機能を使用できます。
継承はOOPの最も重要なポイントだと思います。
[ゲーム開発より]描画メソッドと属性を使用してDrawableクラスのようなものを作成し、Drawableを継承するSpaceshipクラスとPlanetクラスを作成できます。それら(および他のSprite子)からすべてのオブジェクトを取得し、drawableObjArrayをスローして、すべてのオブジェクトに対してdrawメソッドを呼び出すだけです。あなたはそれがDrawableであることを知る必要があります。
不要なものを隠す必要なサービスを提供します。ここで私の説明を参照してください- 抽象化とは何ですか?
ここでは、「ADT対オブジェクト」が何度も尋ねられています。1行の答えは、「ADTとオブジェクトは互いに逆です。一方が他方をきちんと抽象化することはできません。それぞれがさまざまな方法で柔軟性を可能にします。」
より長い回答については、William Cookの「データ抽象化の理解について」を参照してください。簡単に言えば、オブジェクトを使用すると、いくつかのデータム(リストは配列、または自己バランスツリーのように見えるもの)の複数の実装/表現を簡単に使用できますが、新しい操作を追加することは困難です(なぜならその新しい操作を各表現に追加する必要があります)、ADTを使用するとデータ型に新しい操作を簡単に追加できますが、複数の実装を持つことは難しくなります。
編集:私は、メッセージの受け渡しがオブジェクト指向を成功に導いたと言っていました。Jonasのコメントに基づくと、それは正しくありません。なぜなら、OOとみなされるほとんどの言語はメッセージパッシングを使用しないからです。正しくないので、答えから選びました。
私のトップ3機能。オブジェクト構成-オブジェクトの共同作業を可能にします。多態性-実行時の動的な動作をサポートします。継承-コードを再利用し、メソッドをオーバーライドして動作を変更する。
ADT-Pascalのようなオブジェクト指向ではない言語でも使用できます。スタックまたはキューは、ADTの例です。
簡単な言葉で言えば、OOPは再利用性とカプセル化の鍵であり、APIを呼び出すだけで何曜日に何をしたいのかを問わず、この時代のプログラマーの生活を楽にする大規模なフレームワークを作成できます。
あなたの質問はOOPの4つの機能に関するものなので、あなたは言うことができます
so 1. Message Passingおよび3. Polymorphismは実際にサポートしています2.継承および4.カプセル化。
私の意見では、最後の3つの機能は、OOPの広範な使用に影響を与えた最も重要なものです。
2. Inheritance
3. Polymorphism
4. Encapsulation
編集:もう1つのポイントは、IDEおよびVisual StudioやEclipseなどのグラフィカルインターフェイス開発環境です。OOP言語を採用するにつれて、より多くの設計がOOPに向かっている傾向がありました。
そしてもちろん、SOLID Principlesは、ソフトウェア製品を堅固な成果物にするものです。