カプセル化の例として、ユーザーと携帯電話の間の相互作用について考えることができます。ユーザーは携帯電話の内部動作を知る必要がないため、これを抽象化と呼びます。しかし、カプセル化はこの例のどこに当てはまりますか?誰かがこれに光を当ててくれませんか?
18 に答える
カプセル化は「情報隠蔽」を実現する方法であるため、例に従って、カプセル化を使用して「携帯電話の内部動作を知る必要はありません」 。実装の詳細を知らなくても、デバイスの動作を使用するためのインターフェイスがあります。
反対側の抽象化は、異なるオブジェクトに同じインターフェースを使用する機能として説明できます。同じインターフェースの異なる実装が存在する可能性があります。詳細はカプセル化によって隠されています。
抽象化:「デバイス」を購入することは決してありませんが、常により具体的なものを購入します:iPhone、GSII、Nokia 3310 ...ここで、iPhone、GSII、N3310は具体的なものであり、デバイスは抽象的です。
カプセル化:いくつかのデバイスがあり、それらすべてにUSBポートがあります。どんな種類のプリント回路が戻っているのかわからないので、USBケーブルを接続できることを知っておく必要があります。
抽象化は、カプセル化によって許可される概念です。私の例は最良のものではありませんでした(2つのブロックの間に実際のリンクはありません)。
抽象化を使用せずにカプセル化を行うことはできますが、プロジェクトで抽象化を使用する場合は、カプセル化が必要になります。
一般的に、抽象化とは、特定のプロシージャの背後にある複雑なものを隠して、プロシージャを単純に見せることです。
例:モニターのオン/オフ::--ユーザーは、モニターがオンまたはオフに切り替えられたときに発生するすべてのチップの機能について多くを知る必要はありません。ユーザーが知る必要があるのは、オン機能オンです-モニターはオンおよびオンです。機能OFF-モニターがオフです...
または車をもっとよく探す-ギアを変更する特別なギアマシンがあることを誰もが知っています、ギアを変更するためにすべての機能が何を経験するかを誰もわざわざ知りません..だから、それは抽象化です(複雑さを防ぐために不要な実装を回避します)。
したがって、開発者が優れた抽象化を提供すれば、ユーザーはオブジェクトの内部メカニズムを覗き見たくなることはありません。
抽象化は、1つ以上のメソッドを持つクラスを抽象化することによって実現されます。これは、それを拡張するクラスによって実装されるべき本質的な特性に他なりません。
e.g.
車を発明/設計するときは、車に4つのドア、ブレーキ、ハンドルなどが必要であるなどの特性を定義します。したがって、この設計を使用する人は、この特性を含める必要があります。実装は抽象化のそれぞれの頭ではありません。含めるべき特性を定義するだけです。
カプセル化とは、ユーザーが特定の手順に従って特定のプロセスの制御にアクセスすることを制限することです。カプセル化は、安全性を提供し、システムの堅牢性を確保するだけです。
例:会社のHRは、カプセル化の原則に基づいて作業する人物と見なすことができます。.i.e.
他の部門と直接話すことはできず、HRを介して他の部門と通信する必要があります。これにより、会社の記録のセキュリティとより良い保守が保証されます。
一緒に、UNDER CONSTRUCTION BUILDING..
「いいえ」のようなことを言うことができる場所の例をとることができます。必要な管理者の数、材料の種類、労働者の数など、すべての建物の建設で必要な抽象化。
しかし同時に、労働者と建物投資家の間の仲介者として機能する請負業者にそのようなすべての分野を含めることは、カプセル化と見なすことができます。として、それは上記のすべてのプロパティを1つのエンティティに隠します。
したがって、これまで理解していたとしたら、抽象化はENCAPSULATIONのサブセットにすぎないと言えます。つまり、抽象化を実行するすべてのエンティティは内部でカプセル化されますが、カプセル化を示すすべてのものが常に抽象化である必要はありません。
たとえば.ToString()
、ほとんどすべてのクラスで定義されているメソッドAbstraction
は、機能がないための実装です。私たちが気にするのは、ほとんどすべてを文字列に変更することです。ユニットとして組み立てられると、カプセル化されます。基本的にデータのセキュリティを念頭に置いて行われるため、非表示にしてアクセスするProperties
のはカプセル化の例です。
これがあなたの質問に答えることを願っています..!!
カプセル化とは、クラス内の変数などを非表示にして、許可されていない第三者が使用するのを防ぐことです。したがって、getterやsetterなどのパブリックメソッドはそれにアクセスし、他のクラスはこれらのメソッドを呼び出してアクセスします
抽象化には、作業を実行し、その状態を報告および変更し、システム内の他のオブジェクトと「通信」できる抽象的な「アクター」を表すオブジェクトを定義する機能が含まれます。
以下のリアルタイムの例を考えてみましょう。
カプセル化: ドライバーとして、スタートボタンを押して車を始動する方法を知っていると、始動操作の内部の詳細が隠されます。したがって、開始プロセス全体がユーザーから隠されます。そうでない場合、開始操作がユーザーからカプセル化されていることがわかります。
また
駆動輪は、あなたから車輪を回転させるプロセスをカプセル化しています。
抽象化:
抽象化について言及する前に、ここで3人の異なるユーザーを取り上げることができます(私はそれらをエンティティと呼んでいます)
1)あなた2)地元の整備士3)専門家
あなたの実体:あなたはボタンを押すことによって車を始動することだけを知っているので、舞台裏の他のすべての操作はあなたから抽象化されます。
ローカルメカニックエンティティ:ローカルメカニックエンティティは、車の始動の実装の一部を知っています。つまり、車のボンネットを開いてバッテリーケーブルやチョックなどをチェックできます。つまり、ローカルメカニックエンティティは、車の実装の一部を知っています。
専門家:私たちの専門家(車の設計者)の整備士は私たちの車のすべての操作を知っているので、彼はそれを非常に迅速に修理することができます。つまり、ExpertEntityは車のすべての実装を知っています。
車の操作は完全に抽象化されており、ローカルメカニックエンティティに部分的に実装され、エキスパートエンティティに完全に実装されています。つまり、あなたは抽象メソッドのみを持つ抽象クラスであり、ローカルメカニックエンティティはあなたを拡張し(彼は通常のユーザーでもあるため)、彼はいくつかのメソッドを実装し、最後にローカルメカニックを拡張してすべてのメソッドを実装するエキスパートエンティティを実装しました。
これは良い例だと思います 。
すべてに多くのプロパティと動作があるので、テレビ、モバイル、車、人間など、好きなものを持っていきましょう。
抽象化:
- 本当に必要なオブジェクトのエッセンスを選ぶプロセス
- つまり、オブジェクトから必要なプロパティを選択します。例:
a。TV-サウンド、ビジュアル、電源入力、チャンネル入力。
b。モバイル-ボタン/タッチスクリーン、電源ボタン、音量ボタン、SIMポート。
c。車-ステアリング、ブレイク、クラッチ、アクセラレータ、キーホール。
d。人間-声、体、視力、聴覚、感情。
カプセル化:
- 不要なオブジェクトの詳細を非表示にするプロセス
- つまり、オブジェクトから不要であるが、オブジェクトが正しく機能するために必要なプロパティと操作を非表示にします。例:
a。TV-スピーカー、ディスプレイ、配電b / wコンポーネント、チャンネルメカニズムの内部および接続。
b。モバイル-入力の解析と処理の方法、ボタンのオン/オフまたはボリュームの変更の方法、simがサービスプロバイダーに接続する方法。
c。車-ステアリングを回すと車がどのように回転するか、どのように車が遅くなるか停止するか、どのようにクラッチが機能するか、どのようにアクセルが速度を上げるか、どのようにキーホールが車のオン/オフを切り替えるか。
d。人間-声がどのように生成されるか、体内に何があるか、視力がどのように機能するか、聴覚がどのように機能するか、感情がどのように生成され、私たちに影響を与えるか。
必要なものをすべて抽象化し、不要なものをすべてカプセル化します;)
あなたの質問の言い回しは奇妙です-抽象化とカプセル化?あるべきです-誰かが抽象化とカプセル化を説明します...
抽象化とは、物事の本質を理解することです。
実世界の例は抽象芸術です。このスタイルのアーティストは、それがまだ物であることができるものの本質をキャプチャ/ペイントしようとします。この4行の茶色の塗抹標本は、雄牛が何であるかの本質を捉えています。
カプセル化はブラックボックス化です。
携帯電話は良い例です。携帯電話が衛星やタワーなどの電話にどのように接続されているのかわかりません。いまいましいものが私のキーの押下をどのように理解するのか、それがどのように写真を撮って電子メールアドレスや別の電話番号に送信するのかわかりません。現代のスマートフォンがどのように機能するかについてのほとんどの複雑な詳細については、私にはわかりません。しかし、私はそれを使うことができます!電話には標準インターフェース(はい-文字通りのデザインとソフトウェアデザインの両方)があり、1つの基本を理解している人がほとんどすべてを使用できるようになっています。
2つはどのように関連していますか?
抽象化とカプセル化はどちらも、オブジェクト指向の思考と設計の基盤です。だから、私たちの携帯電話の例では。スマートフォンの概念は抽象化であり、その中に特定の機能とサービスがカプセル化されています。iPhoneとGalaxyは、より高いレベルの抽象化をさらに抽象化したものです。物理的なiPhoneまたはGalaxyは、カプセル化された機能とサービスを含む抽象化の複数のレイヤーの具体例です。
抽象化 とは、特定の例ではなく、あるものの本質的な性質に焦点を当て、重要でないものや無関係なものを自動的に破棄することを意味します。
例 銀行口座クラスを作成しています。銀行口座の基本的な品質は、開設日、口座名義、口座番号、残高などです。
カプセル化 コンテンツをまとめるだけでなく、外部からのフォームへのアクセスを保護および制限するために、カプセル化または何かを囲むという考えを意味します。機密性とともに、アプリケーションのさまざまな部分間の依存関係を減らすことを意味します。
例 私たちの銀行口座クラスで、誰かがBalanceの属性にアクセスしてそれを変更しようとすると、カプセル化がない場合に試行が成功する可能性があります。
カプセル化は情報を隠しています。
抽象化は機能の詳細を隠しています。
カプセル化は、クラスを構築することによって実行されます。抽象化は、クラスの上に抽象クラスまたはインターフェースのいずれかを作成することによって実現されます。
質問で与えられた例では、その機能のためにクラスを使用しており、デバイスがそれをどのように達成するかについては気にしません。したがって、電話の詳細は私たちから「抽象化」されていると言えます。
カプセル化は、電話が何をするのかを達成するために何を使用するかを隠しています。抽象化はそれがどのようにそれを行うかを隠しています。-
プログラミングで「すべきでないこと」を見ると、カプセル化について話し合うほうが理にかなっているように思います。たとえば、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クラス内のデータ変数を変更する方法を完全に制御できます。
何らかの動作をする具体的なエンティティは、カプセル化の例です。動作は、何かをラップしてクライアントから何かを隠すことによって提供されます。モバイルの場合、それは信号、チップ、回路、バッテリーなどです。
同じ例を抽象化するために、通常のユーザーは、電話をかけたり受けたりできるものなら何でも大丈夫だと言うかもしれません。この抽象化は、任意の具体的なモバイルで置き換えることができます。抽象化の例を確認してください。
カプセル化は単一責任の原則を順守するのに役立ち、抽象化はコード・トゥ・インターフェースを順守するのに役立ち、実装しないのに役立ちます。
車のクラス:サービスプロバイダークラスとドライバークラス:サービスコンシューマークラスがあるとします。
抽象化の場合:CARの抽象クラスを定義し、その中のすべての抽象メソッドを定義します。これらは、changeGear()、applyBrake()のように車で使用できる関数です。
現在、実際の車(コンクリートクラス、つまりメルセデスのように、BMWはこれらのメソッドを独自の方法で実装し、実行を抽象化します。エンドユーザーは特定のコンクリート車のインスタンスにブレークとチェンジギアを適用し、多形的に実行はコンクリートクラスで定義されたとおりに行われます。 。
カプセル化の場合:メルセデスが新しい機能/テクノロジーを思いついたとしましょう:アンチスキッドブレーキング、applyBrake()を実装しながら、この機能をapplyBrake()メソッドにカプセル化して、凝集度を提供し、サービスコンシューマーは引き続き同じメソッドapplyBrakeでアクセスします車のオブジェクトの()。したがって、カプセル化により、同じ具象クラスの実装がさらに可能になります。
私の2セントの実例-ITに近いアナロジーを挙げましょう。
サブスクリプションサイト、たとえばワードプレスサイトがあるとしましょう
各ユーザーには、管理者、サブスクライバーなどの役割があります。多くのユーザーは、管理者、サブスクライバーなどです。
したがって、ここでの抽象化は、管理者ロールを持つすべてのユーザーが一連のことを実行できるという事実に反映されています。これがどの特定のユーザーであるかは関係ありません(これは抽象化の例です)。
一方、サブスクライバーユーザーはサイトの特定の設定にアクセスできないため、アプリケーションの一部の内部はプレーンサブスクライバー用にカプセル化されます(これはカプセル化の例です)
抽象化とカプセル化は相対的な概念であることがわかるように、それらは特定の何かに関して適用されます。
この推論の線をたどって、多形性と継承を説明することができます。
たとえば、スーパー管理者ユーザーは、管理者ユーザーが実行できるすべてのことに加えて、さらにいくつかのことを実行できます。さらに、管理者の役割が機能の更新を取得した場合、スーパー管理者も同じ更新を取得します。したがって、ここで継承の例を見ることができます。スーパー管理者の役割は、管理者の役割のすべてのプロパティを継承し、それらを拡張します。サイトのほとんどの部分で、管理者はスーパー管理者と交換可能であることに注意してください(つまり、スーパー管理者ユーザーは管理者ユーザーの代わりに簡単に使用できますが、一般的にはその逆はできません)。
卵の殻はカプセル化と内容の抽象化と見なすことができると思います。シェルは情報を保護します。殻なしでは卵の中身は持てません。,,LOL
重要なテレビ機を見たことがある場合、テレビ接続とテレビカラーチューブは、私たちのような視聴者には公開されず、テレビチャンネルキー、テレビ音量キー、オン/オフスイッチなどのテレビの必要なものだけが公開されているテレビケースの中に隠されています、ケーブルスイッチと視聴者が使用するテレビリモコン。これは、テレビ機、テレビ接続、テレビカラーチューブが不要なデータであり、視聴者が見る必要のないものが世界の外から隠されていることを意味します。
したがって、カプセル化とは、クラスの外部に公開する必要のないクラスの重要な機能を非表示にし、クラスの必要なものだけを公開することを意味します。ここで、クラスの非表示部分はカプセル化のように機能し、クラスの公開部分は抽象化のように機能します。
抽象化はキーパッドと表示画面の詳細を非表示にすること、 カプセル化はそれらをバインドする内部回路を非表示にすることと考えてください。
たとえば、クラスの1つである電卓のようにクラスを作成しますが、最終的にはクラスのオブジェクトを提供します。オブジェクトの助けを借りて、彼らは再生して操作を実行します。彼は何を認識していません。メカニズムのタイプは内部で使用されます。抽象形式のクラスのオブジェクト。
カプセル化は、クラス内のフィールドをプライベートにし、パブリックメソッドを介してフィールドへのアクセスを提供する手法です。フィールドがプライベートとして宣言されている場合、クラス外の誰もそのフィールドにアクセスできないため、クラス内のフィールドが非表示になります。このため、カプセル化はデータの非表示とも呼ばれます。たとえば、プライベートメソッドgetAdd、getMultiplyを含むクラス計算機です。
上記のMybeの回答は、概念を理解するのに役立ちます。
抽象化
これは、OOPの複雑さを管理するために使用されます。このプロパティを使用することで、背景の説明を含めずに、オブジェクトの重要な機能をユーザーに提供できます。たとえば、友達にメッセージを送信するときは、「hiiii」と言って「送信」を押すだけで、メッセージが宛先(彼女、友達)に配信されます。ここでは、抽象化が機能していることがわかります。つまり、メッセージの送受信を担当するモバイルの内部動作にはあまり関心がありません。
抽象化
私たちは日常生活の中で多くの抽象化を使用しています。車を考えてみてください。私たちのほとんどは、車がどのように機能するかについて抽象的な見方をしています。ガスを入れ、キーを回し、いくつかのペダルを押すなど。しかし、私たちは車を動かすために車の中で何が起こっているのかを必ずしも理解しているわけではなく、そうする必要はありません。私たちの何百万人もが、車の仕組みの詳細を理解せずに毎日車を使用しています。抽象化は、学校や仕事に行くのに役立ちます。
プログラムは、相互作用する抽象化のセットとして設計できます。Javaでは、これらの抽象化はクラスにキャプチャされます。車の運転手がエンジンの動作を知らなくても車両を使用できるのと同じように、クラスの作成者は明らかにそのインターフェースを知っている必要があります。
カプセル化
銀行システムを考えてみましょう。銀行システムには、口座番号、口座タイプ、残高などのプロパティがあります。誰かがアカウントの残高を変更しようとしている場合、カプセル化がなければ、試行は成功する可能性があります。したがって、カプセル化により、クラスはプロパティを完全に制御できます。
あなたが携帯電話について与えた例の助けを借りて、抽象化とカプセル化の両方を説明しましょう。
抽象化
携帯電話の内部作業はユーザーから隠されています。ユーザーは画面/ボタンを介してモバイルと対話しています。これは、オブジェクトを介してクラスと対話することと同じです。ここで、クラスはモバイルであり、オブジェクトは画面/ボタンです。
カプセル化
携帯電話では、バッテリー、CPU、RAM、カメラなどが箱/容器の中に一緒に含まれていることがわかります。これは、クラスがすべてのメソッドと変数をカプセル化する方法に似ています。メソッドと変数はクラス内に含まれています。
また、携帯電話の内部部品にアクセスできませんよね?そのためには特別なドライバーが必要です。携帯電話内の部品は固定されています。同様に、クラス内のコンポーネントまたは変数を保護できます。プライベートアクセス修飾子で保護します。プライベートアクセス修飾子は、携帯電話のコンテナです。セッターとゲッターの助けを借りて、プライベートフィールドにアクセスできます。これらのゲッターとセッターは、特別なドライバーのようなものです。