情報隠蔽による効果的なカプセル化の素晴らしい例ですか?
-
10-07-2019 - |
質問
&quot; 抽象化とカプセル化は補完的な概念です。抽象化はオブジェクトの観察可能な動作に焦点を当てます...カプセル化は、この動作...カプセル化は、ほとんどの場合、情報の隠蔽によって達成されます。これは、本質的な特性に寄与しないオブジェクトの秘密をすべて隠蔽するプロセスです。-< strong> Grady Booch オブジェクト指向分析および設計
情報隠蔽によるカプセル化の利点の強力な説得力のある例をいくつか教えていただけますか?
解決
最初のオブジェクト指向クラスでの例:
メディアプレーヤーを想像してください。再生、一時停止、早送りなどの概念を抽象化します。ユーザーはこれを使用してデバイスを操作できます。
VCRはこのインターフェイスを実装し、メカニカルドライブとテープの詳細を非表示またはカプセル化しました。
メディアプレーヤーの新しい実装が到着すると(たとえば、テープではなくディスクを使用するDVDプレーヤーなど)、メディアプレーヤーのカプセル化の実装を置き換えて、ユーザーはVCRで行ったのと同じように(再生、一時停止などの同じ操作)、引き続き使用できます。
これは、抽象化から情報隠蔽の概念です。ユーザーが知らなくても実装の詳細を変更でき、カップリングコード。
他のヒント
文字ストリーム(ディスクファイル、パイプ、ソケット、ttyなど)を1つのエンティティ(「すべてがファイル」)モデルに* nix抽象化されているため、幅広いツールを幅広いツールに適用できます。カプセル化なしでは単純に不可能な範囲のデータソース/シンクの範囲。
同様に、さまざまな言語のストリームの概念、リスト、配列、ファイルなどの抽象化
また、数値のような概念(整数の抽象化、半ダースの浮動小数点数、有理数など)は、より高いレベルのコードに仮数形式などが与えられ、それ自体を守るために残された場合、これが悪夢であると想像します。
すでに受け入れられている答えがあることは知っていますが、もう1つ、OpenGL / DirectXを投げ出したかったのです
これらのAPIはどちらも完全な実装ではありませんが(DirectXは確かにその点で少し重い)、代わりにグラフィックカードにレンダーコマンドを伝達する一般的な方法です。
特定のカードの実装(ドライバー)を提供するのはカードベンダーです。多くの場合、これは非常にハードウェア固有ですが、ユーザーはGeForce ABCを実行し、他のユーザーがRadeon XYZは、正確な実装が高レベルAPIの背後に隠されているためです。それ以外の場合は、サポートする市場のすべてのカードのゲームにコードパスが必要になります。これは1日目からは完全に管理できなくなります。このアプローチのもう1つの大きな利点は、Nvidia / ATIがドライバーのより新しい、より効率的なバージョンとあなたの側の努力なしで自動的に利益を得ます。
サウンド、ネットワーク、マウス、キーボードなど、基本的にコンピューターのすべてのコンポーネントに同じ原理が適用されます。カプセル化がハードウェアレベルまたはソフトウェアドライバーで行われるかどうかにかかわらず、ある時点ですべてのデバイス仕様が隠され、たとえばキーボードをMicrosoft Ergonomic Media Explorer Deluxe Revision 2ではなく単なるキーボードとして扱うことができます。
そのように見ると、今日のように何らかのカプセル化/抽象化コンピューターがないと、今日はまったく機能しないことがすぐに明らかになります。それはあなたにとって十分に素晴らしいですか?
世界のほぼすべてのJava、C#、およびC ++コードベースには、情報隠蔽があります。クラスのprivate:セクションと同じくらい簡単です。
外部の世界はプライベートメンバーを見ることができないので、開発者は他のコードがコンパイルされないことを心配する必要なく、プライベートメンバーを変更できます。
なに?まだ納得していませんか?
反対を表示する方が簡単です。誰がその実装の詳細にアクセスできるかを制御できないコードを書くために使用していました。そのため、どのコードが変数を変更したかを判断することがほとんど不可能になりました。
また、世界中のすべてのコードが特定の具象クラスの実装に依存している可能性がある場合、実際に何かを抽象化することはできません。