カプセル化vs抽象化?


137

カプセル化と抽象化の簡単な定義を次に示します。

抽象化:

Javaでの抽象化のプロセスは、特定の詳細を隠し、オブジェクトの本質的な機能のみを表示するために使用されます。つまり、オブジェクト(インターフェース)の外側のビューを扱います。さまざまなサイトでこれについて私が見る唯一の良い例は、インターフェースです。

カプセル化:

基本的には、private、public、protectedなどの修飾子を使用してオブジェクトの状態を非表示にすることです。必要な場合にのみ、publicメソッドを通じて状態を公開します。

どのように我々は修飾子を達成privatepublicまた何もなく、抽象概念ではありませんアウト側の世界から不必要な詳細を隠します

したがって、上記の説明から、カプセル化は抽象化の一部であるか、抽象化のサブセットであると言えます。しかし、抽象化のみを扱うことができるのに、なぜカプセル化用語が発明されたのでしょうか。私はそれらを区別するいくつかの大きな違いがあるはずだと確信していますが、ネット上のほとんどの資料は、両方ともほとんど同じことを言っています。

この質問は以前にもこのフォーラムで提起されていますが、私は具体的な疑問を持って再度投稿しています。一部の回答では、抽象化は概念であり、カプセル化は実装であるとも述べています。しかし、私はこれを購入しません。それが真実であれば、これら2つの異なる概念が私たちを混乱させるために提供されていると考えることができます。

更新:- 5年後、私は自分の答えを思いつきました。これは、この投稿と以下の答えに基づく要点です。

  1. 抽象化とカプセル化の違いは?
  2. カプセル化と抽象化の実際の例

上記で定義されたカプセル化は抽象化のツールですが、私はそれをクラスがカプセル化するもの(機能/データはアクセスに関係なく)として考える傾向があります。それが行われ、正確に何が行われるかはウィキペディアから実行可能An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

カプセル化は、コンテキストに関連する関連する詳細(データとデータを操作する動作)をバインドするものです。またprivate public、インスタンスのデータを保護することをお勧めするため、のようなアクセス指定子を使用しても実現できます。アクセス指定子は、情報/データの非表示のみを提供するためです。
user3227986 2016年

回答:


98

カプセル化は、抽象化の一部として使用される戦略です。カプセル化とは、オブジェクトの状態を指します-オブジェクトはその状態をカプセル化し、外部から隠します。クラスの外部ユーザーは、そのメソッドを通じてクラスと対話しますが、クラスの状態に直接アクセスすることはできません。したがって、クラスはその状態に関連する実装の詳細を抽象化します。

抽象化はより一般的な用語であり、(とりわけ)サブクラス化によって実現することもできます。たとえばList、標準ライブラリのインターフェイスは、アイテムのシーケンスを抽象化したものであり、それらの位置によってインデックスが付けられます。aの具体例Listは、ArrayListまたはLinkedListです。List使用しているリストの種類の詳細を抽象化してやり取りするコード。

抽象化は、カプセル化によって基礎となる状態を隠すことなしには不可能であることがよくあります。クラスがその内部状態を公開する場合、その内部動作を変更できないため、抽象化できません。


8
カプセル化とは、関連するプロパティ、メソッド、およびその他のメンバーのグループが単一のユニットまたはオブジェクトとして扱われることを意味します。 msdn.microsoft.com/en-us/library/dd460654.aspx
raberana

1
カプセル化は抽象化につながります。
マーティン、

124

抽象化は、重要なことに焦点を当てるために、詳細を抽象化して抽象化して何かを説明する概念です(これは、たとえば、芸術家が次のような画像の構成要素に焦点を合わせる抽象芸術でも見られます色または形状)。同じ概念が継承階層を使用してOOPに変換されます。より抽象的な概念が上部にあり、より具体的な概念が下部にあり、それらの抽象化に基づいています。最も抽象的なレベルでは、実装の詳細はまったくなく、おそらく抽象化が減少するにつれて追加される共通性はほとんどありません。

例として、最上位は単一のメソッドとのインターフェースであり、次のレベルはいくつかの抽象クラスを提供します。これらのクラスは、最上位レベルに関する詳細の一部を埋めるかどうかはわかりませんが、独自の抽象メソッドを追加することで分岐します次に、これらの各抽象クラスには、残りのすべてのメソッドの実装を提供する具象クラスがあります。

カプセル化テクニックです。それは抽象化を支援するための場合もそうでない場合もありますが、それは確かに情報の隠蔽や組織化に関するものです。データと関数を何らかの方法でグループ化する必要があります。もちろん、優れたOOPプラクティスでは、抽象化によってグループ化する必要があります。ただし、保守性などを支援する用途は他にもあります。


13
あなたの抽象化の定義は私がこれまでに見た中で最高であり、私は初めて、それが実際に私の頭の中でクリックされ、理にかなっているように感じています。投稿してから3年以上経過していることは承知していますが、よろしくお願いします。
Casey Crookston、2015年

1
うわー...抽象化....アートで表現...赤は怒りかもしれません、それだけが私たちが知る必要がありました!コンセプトのこのビューをありがとう:-)
SlowLearner

カプセル化は、「ルーズカップリングと高凝集性」を実現するために使用されます。
ソーター2018年

28

カプセル化は抽象化の一部であるか、抽象化のサブセットと言えます

それらは異なる概念です。

  • 抽象化は、オブジェクトのすべての不要な/重要でない属性を絞り込み、ドメインに最適な特性のみを保持するプロセスです。

    たとえば、個人の場合:姓名とSSNを保持することにします。年齢、身長、体重などは無関係として無視されます。

    抽象化はあなたのデザインが始まるところです。

  • カプセル化は、抽象化プロセス中に保持することを受け入れた属性に適した操作を認識する次のステップです。それらに作用する操作とデータの関連付けです。
    つまり、データとメソッドは一緒にバンドルされています。

抽象化は一種の設計概念であり、カプセル化は抽象化中に合意した設計の実装に関する主な懸念と言えますか?
M Sach

1
カプセル化では、データに適用できる、またはデータに適用する必要がある操作を定義します。これは、設計の一部にすることもできます。たとえば、SSNを取得しますが、変更はしません
Cratylus

25

カプセル化により、不要なデータがカプセルまたはユニットに隠さ れている

抽象化はオブジェクトの本質的な特徴を示し ています

カプセル化を使用して、メンバーをクラスおよびインターフェースの外部から隠します。c#.like public、private、protectedなどで提供されるアクセス修飾子を使用します。例:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

ここでは、ユニットまたはカプセル、つまりクラスにラップデータがあります。

抽象化はカプセル化とは正反対です。

抽象化は、重要で関連性のあるデータをユーザーに示すために使用されます。最高の現実の例携帯電話では、カメラ、MP3プレーヤー、通話機能、録音機能、マルチメディアなど、さまざまなタイプの機能が表示されます。内部エンジニアリングではなく関連情報のみが表示されるため、抽象化されています。

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }

同意する。これらの男はちょっと反対です。good oopは、変化しないものを抽象化し、[変化するものをカプセル化する] [1]傾向があります。[1]:principles-wiki.net/...
レイTayek

15

抽象化は非常に一般的な用語であり、ソフトウェアの抽象化はオブジェクト指向言語に限定されません。辞書の定義:「具体的な現実、特定のオブジェクト、または実際のインスタンスは別として、何かを一般的な品質または特性と見なす行為」。

アセンブリ言語は、マシンコードの抽象化と考えることができます-アセンブリは、マシンコードの本質的な詳細と構造を表現しますが、使用されるオペコード、メモリ内のコードのレイアウト、ジャンプを考える必要がなくなります正しい住所など

オペレーティングシステムのAPIは、基盤となるマシンを抽象化したものです。コンパイラーは、アセンブリー言語の詳細からユーザーを保護する抽象化レイヤーを提供します。オペレーティングシステムに組み込まれたTCP / IPスタックは、ネットワークを介してビットを送信する詳細を抽象化します。生のシリコンに至るまで、CPUを設計した人々は、電子が半導体結晶をどのように通過するかを抽象化した「ダイオード」と「トランジスタ」で記述された回路図を使用して設計しました。

ソフトウェアでは、すべてが抽象的です。私たちは現実のいくつかの側面をシミュレートまたはモデル化するプログラムを構築しますが、必然的に私たちのモデルは常に「実物」の一部の詳細を抽象化します。抽象化のレイヤーの上にレイヤーを重ねて構築します。なぜなら、それが私たちが何かを成し遂げる唯一の方法だからです。(たとえば、数独ソルバーを作成しようとしていて、半導体結晶のみを使用して設計しなければならなかったとします。「OK、ここにN型シリコンが必要です...」)

これに対して、「カプセル化」は非常に具体的で限定的な用語です。この質問に対する他の回答のいくつかは、すでに適切な定義を与えています。


14

まだ詳細が必要だと思って5年後に自分の質問に答える

抽象化:

技術定義:- 抽象化は、不要な詳細(複雑または単純)を隠し、オブジェクトの本質的な機能のみを表示するための概念です。ここには実装はなく、単なる概念です

実際の意味:-従業員が顧客に連絡できるように、会社が何らかの媒体/デバイスを必要としていると言います。これは、そのデバイス/メディアが電話、インターネット、スカイプ、または直接、電子メールなどの場合があるため、abstactionの最も純粋な形式(Javaのインターフェイスのような)です。

従業員が顧客と音声通話でつながることができるように、会社が何らかの媒体/デバイスを必要としていると言っても、それから私も抽象的な話をしていますが、デバイス/メディアは電話やスカイプなどの何かである可能性があるため、少し低いレベルです

従業員が音声通話で顧客に接続できるようにするために、会社に電話が必要だと言ったところです。それから私も抽象的な話をしていますが、電話はiphoneやsamsungやnokiaなどのどの会社のものでもかまいません。

カプセル化:- 基本的に、プライベート、パブリック、保護などの修飾子を使用してオブジェクトの状態(情報)を非表示にします。必要な場合にのみ、パブリックメソッドを通じて状態を公開します。

それが実際に何を意味するのか:- 従業員が音声通話を介して顧客に接続できるように、会社にいくつかのiphoneが必要だと言ったときに、具体的なオブジェクト(iphoneなど)について話しています。ここでもiphoneの要点には入りませんが、iphoneには、デバイス/メディアにはない状態/コンクリート情報/実装が関連付けられています。具体的なオブジェクトとは、実際には、Java抽象クラスのように完全ではない実装/情報が関連付けられているオブジェクトを意味します。

したがって、iphoneは実際に、カプセル化をその状態/情報を非表示にし、公開する必要があると考えられるもののみを公開するための戦略として使用しました。したがって、抽象化とカプセル化の両方でいくつかの不要な詳細が隠されますが、概念レベルでの抽象化と実際の実装レベルでのカプセル化

これは、この投稿の回答と以下の回答に基づく要点です

  1. 抽象化とカプセル化の違いは?
  2. カプセル化と抽象化の実際の例

5

カプセル化 -クラスのコンポーネントを非表示にして、外部から直接アクセスできないようにするプロセス。これは、 "private"修飾子を使用して、他のクラスまたはオブジェクトから一部のクラスメンバー(データフィールドまたはメソッド)への直接アクセスを防止する一方で、パブリックメンバー(インターフェイス)によるこれらのプライベートメンバーへのアクセスを提供することによって実現されます。これにより、クラスのメンバーは、人間の臓器が皮膚やシールドの下に隠れたりカプセル化されたりするので保護されます。

抽象化 -OOPプログラムの作成では、「プログラムのタスクで興味深いコンポーネントのみをクラスに含める必要があります」という原則に従う必要があります。例:オブジェクトの学生には、名前、年齢、体重、髪の色、目の色など、人間としての多くの文字があります。ただし、OOPでクラスを作成して学生と一緒に作業するときは、実際にそれらの文字のみを含める必要があります。学生データベースの問題:名前、年齢、専門、レベル、マークなどC ++では、クラス内のメソッドで修飾子「virtual」を使用して抽象クラスを作成できます。これにより、クラスを直接使用できなくなりますが、それから他のクラスを派生させ、タスクに基づいて必要なメンバーを追加して、そのメンバーの実装を作成します。


4

これは私がそれを理解した方法です:

オブジェクト指向プログラミングでは、クラスと呼ばれるものがあります。それらは何のため?それらはいくつかの状態を保存し、その状態を変更するいくつかのメソッドを保存することです。つまり、それらは状態とそのメソッドをカプセル化しています。

それ(クラス)は、それ自体またはその内容の可視性を気にしません。状態またはいくつかのメソッドを非表示にすることを選択した場合、それは情報の非表示です。

さて、継承のシナリオを考えてみましょう。基本クラスと、いくつかの派生(継承)クラスがあります。それで、基本クラスはここで何をしていますか?それは抽象派生クラスからいくつかのことを行います。

全部違うんだよね?しかし、それらを混合して、優れたオブジェクト指向プログラムを作成します。それが役に立てば幸い :)


3

抽象化は、コンテキスト固有の単純化された表現を描写します。文脈的に重要でない詳細は無視され、文脈的に重要な詳細が含まれます。

カプセル化は、外部へのアクセスを制限し、その状態を使用するプロシージャにその状態をバンドルします。


たとえば、人を取り上げます。手術の文脈では、有用な抽象化は人の宗教的信念を無視し、人の体を含みます。さらに、人々はそれらの記憶を使用する思考プロセスで記憶をカプセル化します。抽象化はカプセル化する必要はありません。たとえば、人物の絵はその部分を隠したり、手順をその状態に束ねたりしません。また、カプセル化には関連する抽象化は必要ありません。たとえば、現実の人々(抽象的なものではない)は、器官を代謝でカプセル化します。


1

注:私はこれを共有しています。ここが良い答えではないという意味ではなく、理解しやすいからです。

回答:

クラスが概念化されている場合、コンテキストに基づいてクラスに含めることができるプロパティは何ですか。動物園のコンテキストで動物クラスを設計している場合、家畜または野生動物を表すために、animalTypeとして属性を持つことが重要です。別のコンテキストでクラスを設計する場合、この属性は意味をなさない場合があります。

同様に、クラスで行う予定の動作は何ですか?ここでは抽象化も適用されます。ここに何が必要で何が過剰になるのでしょうか?次に、クラスから一部の情報を切り取ります。このプロセスは抽象化を適用しています。

カプセル化と抽象化の違いを尋ねると、カプセル化は抽象を概念として使用します。それで、それはカプセル化だけです。いいえ、抽象化は継承と多態性の一部として適用される概念ですらあります。

行くこのトピックの詳細説明はこちら。


1

別の方法で理解してみましょう。

抽象化が存在しない場合に起こり得ることと、カプセル化が存在しない場合に起こり得ること。

抽象化が存在しない場合、オブジェクトの使用量は少ないと言えます。オブジェクトを識別したり、その機能にアクセスしたりすることはできません。テレビの例を挙げます。電源を入れる、チャンネルを変更する、音量を上げるまたは下げるなどのオプションがない場合、テレビの用途は何ですか、またどのように使用しますか?

カプセル化が存在しないか、適切に実装されていない場合、オブジェクトを誤用する可能性があります。データ/コンポーネントによって誤用される可能性があります。TVの同じ例を見てください。TVのボリュームに対してカプセル化が行われていない場合、ボリュームコントローラは、その制限(0-40 / 50)を下回ったり超えたりすることによって誤用される可能性があります。


1

カプセル化は、外部エンティティからのオブジェクト/インスタンスの内部動作を崩壊から保護します。そのため、提供されているデータがインスタンス/オブジェクトの内部システムに悪影響を与えて、その存在を存続させないようにするためのコントロールを提供する必要があります。

良い例として、Dividerは2つのインスタンス変数配当と除数、およびメソッドgetDividedValueを持つクラスです。

除数が0に設定されている場合、内部システム/動作(getDivided)が機能しなくなります。

したがって、メソッドを介して例外をスローすることにより、オブジェクトの内部動作を保護できます。


0

簡単な文で、私はこう言います:抽象化の本質は、本質的でない詳細を省きながら本質的な特性を抽出することです。しかし、なぜ本質的でない詳細を省略する必要があるのでしょうか。重要な動機は、変化のリスクを防ぐことです。抽象化はカプセル化と同じだと考えるかもしれません。ただし、カプセル化とは、詳細を隠すのではなく、1つまたは複数のアイテムをコンテナ内に含めることを意味します。「カプセル化されたものもすべて隠されている」という主張をすると、これは明らかに本当ではありません。たとえば、情報がレコード構造および配列内にカプセル化されている場合でも、この情報は通常は隠されていません(他のメカニズムで隠されている場合を除く)。

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