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