OOPの「抽象化」の定義について混乱している


16

OOPの「抽象化」の定義を理解しようとしています。

私はいくつかの主要な定義に出会いました。それらはすべて有効ですか?それらの1つは間違っていますか?よくわかりません。(定義を自分の言葉で書き直しました)。

定義1:

抽象化とは、現実世界からオブジェクトを取り出し、それをプログラミング用語に変換する概念です。そのような作成などのHumanクラスを、それを与えint healthint ageString name、などの性質、およびeat()等の方法。

定義2:

より一般的な定義。抽象化は、「物事をより一般的/単純化/抽象化する」ことが関係するソフトウェアシステムのどこでも起こる概念です。いくつかの例:

  • 継承階層。上位クラスがより単純またはより一般的であり、より一般的で抽象的な実装を定義します。階層の下位クラスはより具体的であり、より詳細な実装を定義します。

  • カプセル化を使用して、クラスの実装の詳細を他のクラスから隠すことにより、クラスを外部ソフトウェアの世界により「抽象化」(単純化)します。

定義3

別の一般的な定義:抽象化とは、物事の詳細や具体的な実装から、物事の種類(クラス)、利用可能な操作(メソッドなど)にフォーカスを移動する概念です。より抽象的な。(これは、ソフトウェアシステム内の任意のコンテキストで実行できます)。カプセル化は実装の詳細を隠し、物の種類とそれらのより一般的かつ抽象的な定義のみを表示することを意味するため、例えばカプセル化するときに行われます。Anotehrの例ではList、Javaでオブジェクトを使用します。このオブジェクトは実際にArrayListaまたはaの実装詳細を使用しますLinkedListが、この情報はより一般的な名前を使用して抽象化されListます。

これらの定義は正しいですか?(私は最も一般的で受け入れられている定義に言及しています)。


抽象化とは、「もの」を特定の種類の物(動物=>犬)として定義して、さらに絞り込む(犬=>プードル)ことです。
クリスティーン

回答:


22

抽象化は、オブジェクト指向プログラミング(OOP)の3つの柱の1つです。文字通り、特定の観点からシステムまたはコンテキスト内のエンティティを知覚することを意味します。不必要な詳細を取り除き、検討中のコンテキストまたはシステムに必要な側面のみに焦点を当てます。

ここにいくつかの良い説明があります:

人としてのあなたは、異なる役割で異なる関係を持っています。あなたが学校にいるとき、あなたは「学生」です。あなたが仕事をしているとき、あなたは「従業員」です。政府機関にいるとき、あなたは「市民」とみなされることができます。つまり、エンティティ/オブジェクトをどのコンテキストで見ているのか、ということになります。したがって、給与システムをモデル化する場合、従業員(PRN、フルタイム/パートタイム、指定)としてみなします。コース登録システムをモデル化する場合、私はあなたのアスペクトと特性を学生と見なします(ロール番号、年齢、性別、コース登録)。そして、私が社会保障情報システムをモデリングしている場合市民としてあなたの詳細を見ていきます(DOB、性別、出生国など)

抽象化(必要な詳細に焦点を当てる)は、カプセル化(外界から詳細を隠す)とは異なることに注意してください。カプセル化とは、オブジェクトの詳細を隠し、外界のエンティティがそのオブジェクトまたはエンティティと対話するための適切なインターフェイスを提供することを意味します。たとえば、誰かが私の名前を知りたい場合、その人は私の脳細胞に直接アクセスして私の名前を知ることはできません。代わりに、その人は私の名前を尋ねます。ドライバーが車両の速度を上げたい場合は、その目的のためのインターフェース(加速ペダル、ギアなど)があります。

最初の定義はあまり明確ではありません。Def 2は優れていますが、抽象化とカプセル化および継承をリンクしようとするため、初心者を混乱させる傾向があります。Def 3は、抽象化とは何であるかを明確に定義しているため、3つの定義の中で最高のものです。


3
それで、あなたはそれが仕様の代わりに一般化のようであると言うでしょうか?
ロバートロシャ

1
@samyismyheroまさに!抽象化のために、オブジェクトの一般的な属性と動作を探します。
Maxood

[Animal => Dog]は抽象化です。「動物」が「犬」を作成するために必要な部分を定義します。(尾、足、毛皮など)。次に、「犬」クラスを使用してプードル、ピットブルなどを定義できます。したがって、「動物」ではなく「犬」クラスに基づいて犬種を宣言します。
クリスティーン

3

定義1は絶対に抽象化ではありません。それはモデリングをより密接に説明しています

定義2と3は同じことを説明しています。そして、どちらも抽象化のかなり良い説明です。


私もそう思っていました!abstract class Shape笑!
ロバートロシャ

2

これらの定義はそれぞれ問題ありません。

抽象化では、目的に重要な詳細のみに焦点を当てます。

最初のケースでは、(現時点では)実際の人をコードに含めることはできません。目的にかなう人の特定の詳細に焦点を当てます。別のプログラムでは、異なる詳細に集中する必要がある場合があります。これらは人の異なる抽象化であり、それぞれがその文脈において等しく有効であり得る。

2番目と3番目の定義はこの考え方を継続し、ソフトウェアエンティティに適用します。

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