web-dev-qa-db-ja.com

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

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

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

定義1:

抽象化とは、実世界からオブジェクトを取得し、それをプログラミング用語に変換するという概念です。たとえば、Humanクラスを作成し、_int health_、_int age_、_String name_などのプロパティとeat()などのメソッドを指定します。

定義2:

より一般的な定義。抽象化は(anywhereがソフトウェアシステムで行われる概念です '物事をより一般的/単純/抽象化する'が関係しています。いくつかの例:

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

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

定義

別の一般的な定義:抽象化は、物事の詳細と具体的な実装から、物事のタイプ(つまりクラス)、使用可能な操作(つまりメソッド)などにフォーカスを移動することで、プログラミングをよりシンプルでより一般的なものにする概念です。そしてより抽象的な。 (これは、ソフトウェアシステムのどこでも、どのような状況でも発生する可能性があります)。カプセル化は、実装の詳細を隠し、物事のタイプとそれらのより一般的で抽象的な定義のみを表示することを意味するため、たとえばカプセル化の際に行われます。 Anotehrの例では、JavaでListオブジェクトを使用します。このオブジェクトは実際にはArrayListまたはLinkedListの実装の詳細を使用しますが、この情報はより一般的な名前Listを使用して抽象化されています。

これらの定義のいずれかが正しいですか? (私は最も一般的で受け入れられている定義を参照しています)。

18
Aviv Cohn

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

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

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

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

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

23
Maxood

定義1は抽象概念ではありません。 modeling をより詳しく説明しています。

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

3
Euphoric

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

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

最初のケースでは、(現在のところ)コードに実際の人を含めることはできません。あなたはあなたの目的を果たす人の特定の詳細に焦点を当てます。別のプログラムでは、さまざまな詳細に焦点を合わせる必要がある場合があります。これらは人の異なる抽象化であり、それぞれが等しく有効である彼らのコンテキストにおいてである可能性があります。

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

2
andy256