web-dev-qa-db-ja.com

カプセル化と抽象化の実世界の例

カプセル化の例として、ユーザーと携帯電話の間の相互作用を考えることができます。ユーザーは、動作するために携帯電話の内部動作を知る必要がないため、これは抽象化と呼ばれます。しかし、カプセル化はこの例のどこに当てはまりますか?誰かがこれに光を当ててください。

40
crowso

Encapsulationは、 "information hiding" を達成する方法ですあなたの例では、あなたは「それを操作する携帯電話の内部動作を知る必要はありません」。実装の詳細を知らなくてもデバイスの動作を使用するinterfaceがあります。

反対側の抽象化は、異なるオブジェクトに同じインターフェイスを使用する機能として説明できます。同じインターフェースの異なる実装が存在する可能性があります。詳細はencapsulationによって隠されます。

68
davioooh

Abstraction:「デバイス」を購入することはありませんが、より具体的なものを常に購入します。iPhone、GSII、Nokia 3310 ...

カプセル化:複数のデバイスがあり、それらすべてにUSBポートがあります。どんな種類のプリント回路が戻っているのかはわかりません。USBケーブルを接続できることを知っている必要があります。

抽象化は、カプセル化によって許可される概念です。私の例は最良のものではありませんでした(2つのブロック間に実際のリンクはありません)。

抽象化を使用せずにカプセル化を実行できますが、プロジェクトで抽象化を使用する場合は、カプセル化が必要になります。

61
zessx

一般的な言葉で言えば、抽象化とは、特定のプロシージャの背後にある複雑なものを隠して、プロシージャを単純に見せることです。
例:モニターのオン/オフ :: ---ユーザーは、モニターをオンまたはオフに切り替えたときに発生するすべてのチップ機能についてあまり知る必要はありません。知っていることは、オン機能オンモニターはオンで、オン機能オフモニターはオフです...

または、車をもっとよく見る-ギアを変更する特別なギアマシンがあることを誰もが知っています。ギアを変更するためにすべての機能が受けることを誰もわからないので、それは抽象化です(複雑さを防ぐために不要な実装を避ける)。

そのため、開発者が適切な抽象化を提供すれば、ユーザーはオブジェクトの内部メカニズムを覗き見したくなることはありません。

抽象化は、1つ以上のメソッドを抽象化するクラスを抽象化することで実現されます。これは、それを拡張するクラスによって実装される必要がある本質的な特性に他なりません。 e.g.車を発明/設計するとき、車には4つのドア、ブレーキ、ハンドルなどが必要であるという特性を定義します。したがって、この設計を使用する人はこの特性を含める必要があります。実装は、それぞれの抽象化の頭ではありません。含めるべき特性を定義するだけです。

カプセル化は、特定のプロセスの制御にアクセスするための特定の手順に従うことをユーザーに制限します。安全性を提供し、システムの堅牢性を保証します。

例:会社のHRは、Encapsulation.i.e.の原則に基づいて働く人と見なすことができます。HRを介して通信する必要がある他の部門と直接話をすることはできません。

一緒にUNDER CONSTRUCTION BUILDING..の例を挙げることができます。管理者が必要とする、材料の種類、労働者の数など、すべての建築工事で必要な抽象化として。

しかし、同時に、労働者と建物投資家の間の仲介者として機能する請負業者にそのようなすべての分野を含めることは、カプセル化と見なすことができます。として、上記のすべてのプロパティを1つのエンティティに隠します。

したがって、これまで理解していた場合、抽象化はENCAPSULATION.i.eのサブセットにすぎないと言うことができます。つまり、抽象化を実行するすべてのエンティティは内部でカプセル化されますが、カプセル化を示すものはすべて抽象化である必要はありません。

例えば.ToString()ほぼすべてのクラスで定義されているメソッドはAbstractionの実装です。なぜなら、機能を内部に持たないため、ほとんどすべてを文字列に変更するだけです。そして、ユニットとしてアセンブルするときにカプセル化されます..しかし、Propertiesを介して非表示およびアクセスするプライベートメンバーは、基本的にデータセキュリティを念頭に置いて行われるカプセル化の例です。

これがあなたの質問に答えることを願っています.. !!

21
Rahul Ranjan

Encapsulationは、変数またはクラス内の何かを非表示にして、不正なユーザーが使用できないようにします。そのため、getterやsetterなどのパブリックメソッドがアクセスし、他のクラスはこれらのメソッドを呼び出してアクセスします

Abstractionは、作業を実行し、その状態を報告および変更し、他のオブジェクトと「通信」することができる抽象的な「アクター」を表すオブジェクトを定義する機能を含みますシステム内。

以下のリアルタイムの例を検討してください。

カプセル化ドライバーとして、スタートボタンを押すことで車を始動する方法を知っており、始動操作の内部詳細は表示されません。したがって、開始プロセス全体はあなたから隠されます。さもなければ、開始操作があなたからカプセル化されていることがわかります。

または

駆動輪はあなたから車輪を回転させるプロセスをカプセル化しています

抽象化

抽象化について言及する前に、ここで3人の異なるユーザーを取り上げます(エンティティーと呼びます)。

1)あなた2)ローカルメカニッ​​ク3)エキスパート

あなたのエンティティ:ボタンを押すだけで車を始動することを知っているので、舞台裏のその他すべての操作はあなたから抽象化されます。

ローカルメカニッ​​クエンティティ:私たちのローカルメカニッ​​クは、車を始動する実装の一部を知っています。つまり、車のボンネットを開けて、バッテリーケーブルやチョックなどを確認できます。つまり、ローカルメカニッ​​クエンティティは、自動車の実装の一部を知っています。

エキスパートエンティティ:私たちの専門家(車の設計者)メカニックは私たちの車のすべての操作を知っているので、彼は非常に迅速に修理することができます。要するに、エキスパートエンティティは自動車のすべての実装を知っています。

車の操作は完全に抽象化され、Local Mechanic Entityに部分的に実装され、Expert Entityに完全に実装されます。あなたは抽象メソッドのみを持つ抽象クラスです、Local Mechanic EntityはYouを拡張しました(彼は普通のユーザーでもあるので)そして彼はいくつかのメソッドを実装し、最後にLocal Mechanicを拡張しすべてのメソッドを実装する私たちのエキスパートEntity

これは良いことだと思う

15
Sameer Kazi

すべてには多くのプロパティと動作がありますので、TV、モバイル、車、人間など何でも好きなオブジェクトを取ります。

抽象化:

  1. 本当に必要なオブジェクトの本質を選ぶプロセス
  2. つまり、必要なプロパティをオブジェクトの例から選択します。
    a。 TV-サウンド、ビジュアル、電源入力、チャンネル入力。
    b。モバイル-ボタン/タッチスクリーン、電源ボタン、音量ボタン、SIMポート。
    c。車-ステアリング、ブレーキ、クラッチ、アクセル、キーホール。
    d。人間-声、身体、視力、聴覚、感情。

カプセル化:

  1. 不要なオブジェクトの詳細を非表示にするプロセス
  2. 言い換えれば、オブジェクトからは必要ないが、オブジェクトが適切に機能するために必要なプロパティと操作を非表示にします。例:
    a。 TV-スピーカー、ディスプレイ、配電b/wコンポーネント、チャンネルメカニズムの内部と接続。
    b。モバイル-入力の解析および処理方法、ボタンのオン/オフまたはボリュームの変更方法、simがサービスプロバイダーに接続する方法。
    c。車-ステアリングを回して車を回す方法、車をゆっくりと停止または停止させる方法、クラッチの動作方法、アクセルを上げる方法、車のキーホールスイッチの方法。
    d。人間-音声の生成方法、体内の内容、視力の仕組み、聴覚の仕組み、感情の生成と影響の仕方。

必要なものはすべて要約し、不要なものはすべてカプセル化します;)

12
Sandeep Kumar

あなたの質問の文言は奇妙です-抽象化vsカプセル化?それはあるべきです-誰かが抽象化とカプセル化を説明します...

抽象化とは、物の本質を理解することです。

実世界の例は抽象芸術です。このスタイルのアーティストは、それが物になることを可能にするものの本質をキャプチャ/ペイントしようとします。この4行の茶色のスミアは、雄牛の本質を捉えています。

カプセル化はブラックボクシングです。

携帯電話は素晴らしい例です。携帯電話が衛星、タワー、または別の電話にどのように接続するかわかりません。私は、いまいましいものが私のキーの押下をどのように理解するのか、それがどのように電子メールアドレスや別の電話番号に写真を撮って送信するのかわからない。現代のスマートフォンがどのように機能するかについての大部分の複雑な詳細についてはわかりません。しかし、私はそれを使用できます!電話機には標準インターフェイス(はい-文字通りの設計とソフトウェア設計の両方)があり、1つの基本を理解している人はほとんどすべてを使用できます。

この2つはどのように関連していますか?

抽象化とカプセル化の両方が、オブジェクト指向の思考と設計の基礎となります。したがって、携帯電話の例では。スマートフォンの概念は抽象化であり、その中には特定の機能とサービスがカプセル化されています。 iPhoneとGalaxyは、高レベルの抽象化をさらに抽象化したものです。物理的なiPhoneまたはGalaxyは、カプセル化された機能とサービスを含む抽象化の複数のレイヤーの具体例です。

7
mson

Abstraction手段1つの特定の例ではなく、あるものの本質的な品質に焦点を当て、重要でないものや無関係なものを自動的に破棄します。

銀行口座クラスを作成しています。銀行口座の本質的な性質は、開設日、口座名、口座番号、残高などです。

カプセル化コンテンツをまとめるだけでなく、外部からのフォームアクセスを保護および制限するために、カプセル化または何かを囲むという考え方を意味します。

Bankアカウントクラスで、Balanceの属性にアクセスして変更しようとすると、カプセル化がない場合に試行が成功する可能性があります。

5
Shan

カプセル化は、単一責任の原則を順守するのに役立ち、抽象化は、実装ではなくインターフェースへのコードの順守に役立ちます。

Carのクラスがあります:サービスプロバイダークラスとドライバークラス:サービスコンシューマークラス。

抽象化の場合:CARの抽象クラスを定義し、その中にあるすべての抽象メソッドを定義します。

現在、実際の車(具体クラス、つまりメルセデスのように、BMWはこれらのメソッドを独自の方法で実装し、実行を抽象化し、エンドユーザーは特定の具体的な車インスタンスにブレイクとチェンジギアを適用し、具体的なクラスで定義されたように実行が行われます) 。

カプセル化の場合:メルセデスは新しい機能/技術を考案したと言います:Anti Skid Braking、applyBrake()の実装中に、この機能をapplyBrake()メソッドにカプセル化し、凝集性を提供し、サービス消費者は同じメソッドapplyBrakeでアクセスします()車オブジェクトの。したがって、カプセル化により、同じ具象クラスの実装をさらに進めることができます。

4
user3576978

カプセル化は情報を隠しています。

抽象化は機能の詳細を隠しています。

カプセル化は、クラスを構築することにより実行されます。抽象化は、クラスの上に抽象クラスまたはインターフェイスを作成することで実現されます。

質問で与えられた例では、その機能にクラスを使用していますが、デバイスがそれをどのように達成するかは気にしません。したがって、電話の詳細は私たちから「抽象化」されていると言えます。

カプセル化は、電話が何を達成するために使用するかを隠しています。抽象化は、それがそれを行う方法を隠しています。

3
Navin Israni

プログラミングでHOW NOT TO DOを見ると、カプセル化について議論する方が理にかなっていると思います。たとえば、以下のようにCarクラスを考えます。

 class Car{
   public float speed =0;
   public boolean isReverse = false;
   public boolean isStarted = false;
 }

クライアントコードでは、以下のように上記の車クラスを使用できます。

class Main{
  public static void main(args String[]){
   Car car = new Car();
   // No need to start??
   car.speed = 100; // Turbo mode directly to 100
   car.speed = 0; // Turbo break
  }
}

詳細は http://brevitaz.com/encapsulation-example-benefits-Java/

これは、車の速度やその他の変数への無制限のアクセスです。カプセル化により、Carクラスはcarクラス内のデータ変数を変更する方法を完全に制御できます。

何らかの動作を持つ具体的なエンティティは、カプセル化の例です。この動作は、何かを包み込み、クライアントから何かを隠すことによって提供されます。モバイルの場合、それは信号、チップ、回路、バッテリーなどです。

同じ例を抽象化するために-通常のユーザーは、電話をかけたり電話をかけたりできるものなら何でもいいと言うかもしれません。この抽象化は、具体的なモバイルに置き換えることができます。 抽象化の例 をご覧ください。

2
Vishal Shukla

ITに近い現実世界の例のアナロジーの2セントを教えてください。

wordpressサイトなどのサブスクリプションサイトがあるとします

各ユーザーには、管理者、サブスクライバーなどのロールがあります。多くのユーザーは、管理者、購読者などです。

したがって、ここでの抽象化はreflectedですadminロールを持つユーザーは一連のことを実行できますが、どの特定のユーザーでも構いませんこれは(これはabstractionの例です)。

一方、サブスクライバーユーザーはサイトの特定の設定にアクセスできないため、アプリケーションの一部の内部はプレーンサブスクライバー用にカプセル化されています(これはカプセル化の例です) )

抽象化とカプセル化は相対的な概念であることがわかるように、それらは特定の何かに関して適用されます。

この推論の行に従い、polymoprhismおよびinheritanceを説明できます。

たとえば、スーパー管理者ユーザーは、管理者ユーザーが実行できるすべての操作に加えて、さらにいくつかを実行できます。さらに、管理者ロールが機能の更新を取得した場合、スーパー管理者も同じ更新を取得します。したがって、スーパー管理者ロールinheritのすべてのプロパティで、継承の例を見ることができます。それら。 サイトのほとんどの部分で、管理者はスーパー管理者と交換可能です(つまり、スーパー管理者ユーザーは管理者ユーザーの代わりに簡単に使用できますが、一般的にはそうではありません)。

1
Nikos M.

重要なテレビマシンを見た場合、テレビ接続とテレビのカラーチューブはテレビケース内に隠されており、私たちのような視聴者には公開されておらず、テレビチャンネルキー、テレビボリュームキー、オン/オフスイッチなどのテレビの必要なものだけが公開されています、視聴者が使用するためのケーブルスイッチとテレビのリモコン。これは、テレビマシン、テレビ接続、テレビのカラーチューブが不要なデータであり、視聴者が見るために必要ではないことを世界の外から隠していることを意味します

したがって、カプセル化とは、クラスの外部に公開する必要のないクラスの重要な機能を隠し、クラスの必要なものだけを公開することを意味します。ここで、クラスの隠された部分はカプセル化のように機能し、クラスの公開された部分は抽象化のように機能します。

0
Biju kalanjoor

抽象化

OOPの複雑さを管理するために使用されます。このプロパティを使用することにより、背景の説明を含めずに、オブジェクトの重要な機能をユーザーに提供できます。たとえば、友人にメッセージを送信するとき、「hiiii」と発声して「送信」を押すだけで、メッセージが宛先(彼女、友人)に配信されます。ここでは、抽象化が機能していることを確認します。つまり、メッセージの送受信を担当するモバイルの内部動作にはあまり関心がありません。

0
Akash Singh

抽象化はキーパッドを隠し、画面の詳細を表示すると考えてください。カプセル化はそれらをバインドする内部回路を隠すと考えてください。

0
user3757331

抽象化

私たちは日々の生活で多くの抽象化を使用しています。車を考えてください。私たちのほとんどは、車がどのように機能するかについての抽象的見解を持っています。ガスを入れ、キーを回し、いくつかのペダルを押すなど。しかし、車を動かすために車内で何が起こっているのかを必ずしも理解しているわけではないので、その必要はありません。私たちの何百万人もが、彼らがどのように機能するかの詳細を理解することなく、毎日車を使用しています。

プログラムは、相互作用する抽象化のセットとして設計できます。 Javaでは、これらの抽象化はクラスでキャプチャされます。車の運転手がエンジンの動作を知らなくても車両を使用できるように、クラスの作成者はそのインターフェイスを知っている必要があります。

カプセル化

銀行システムについて考えます。銀行システムには、口座番号、口座タイプ、残高などのプロパティがあります。誰かがアカウントの残高を変更しようとしている場合、カプセル化がなければ試行は成功します。したがって、カプセル化により、クラスはプロパティを完全に制御できます。

0

Egg Shellはカプセル化と内容を抽象化と見なすことができると思います。シェルは情報を保護します。あなたは、シェルなしで卵の内容を持つことはできません。、、 LOL

0
Humberto

たとえば、クラスを作成します(クラスの1つである電卓のような)。しかし、最終使用のために、クラスのオブジェクトを提供します。内部的に使用するメカニズムのタイプ。抽象形式のクラスのオブジェクト。

カプセル化は、クラス内のフィールドをプライベートにし、パブリックメソッドを介してフィールドへのアクセスを提供する技術です。フィールドがプライベートとして宣言されている場合、クラス外の誰もアクセスできないため、クラス内のフィールドは非表示になります。このため、カプセル化はデータ隠蔽とも呼ばれます。たとえば、プライベートメソッドgetAdd、getMultiplyを含むクラス計算機。

答えの上のMybeは、概念を理解するのに役立ちます。

0
Apurva