質問に答えます。今朝仕事に行ったとき(実際に仕事をしたと思います)、燃料と空気の混合物を入れるためにエンジンがバルブを開く方法を正確に気にしましたか?いいえ。道路を走行しているとき、車のエンジンがどのように機能するかは気にしません。あなたはそれが機能することを気にします。
ある日、あなたの車が機能しなくなったとします。開始せず、ロッドを投げ、ベルトを破り、あなたがテキストメッセージで忙しい間、あなた自身の過失なしに不可解にそのコンクリートの障壁に耕します。今、あなたは(少なくとも一時的に)新しい車が必要です。この新しい車の仕組みを正確に気にしますか?いいえ。まず気にするのは、それが機能することです。次に、古い車を運転するのに使用したのと同じ知識とスキルを使用して新しい車を運転できることです。理想的には、運転している車に変化はなかったように見えるはずです。現実的には、この新しい車が機能する方法は、可能な限り少ない「驚き」を与えるはずです。
これらの基本原則は、カプセル化と抽象化の背後にある中核となる原則です。オブジェクトがそれを行う方法を知っていることは、それを使用してそれを行うための必須条件ではありません。コンピュータープログラミングでも、プログラムを実行しているCPU内の電気経路の詳細は、少なくとも半ダースのI / O命令、ドライバー、OSソフトウェア、およびランタイムのレイヤーの背後で抽象化されます。非常に成功している多くのソフトウェアエンジニアは、それを実行する正確なハードウェアアーキテクチャやOSビルドについても心配することなく、完全に優れたコードを記述します。私を含む。
カプセル化/情報の隠蔽により、「どうするかは気にせず、気にするだけ」という考え方ができます。オブジェクトは、消費者が簡単に消費できるように、消費者にとって有用なものを公開する必要があります。さて、現実の世界に戻って、これは車がユーザーに内部の仕組みに関する情報を与えてはならないという意味ではなく、車はユーザーにイグニッション、ハンドル、とペダル。すべての車には、スピードメーターと燃料計、タコメーター、馬鹿灯、その他のフィードバックがあります。事実上すべての車には、ヘッドライト、方向指示器、ラジオ、座席調整などのさまざまな独立したサブシステム用のスイッチもあります。すべての場合において、十分な知識があれば、それを開いて、少し異なる方法で動作するように変更することができます。しかし、ほとんどの場合、多分、たぶん、ユーザーはキャビン内から燃料ポンプを直接かつ独立して制御することはできませんか?たぶん、たぶん、ユーザーは実際にブレーキペダルを踏まなければブレーキライトを作動させるべきではないでしょうか?
抽象化により、「これはそれと同じではありませんが、どちらもXIなので、Xと同じように使用できます」という考え方が可能です。オブジェクトが抽象化を継承または実装する場合、コンシューマーは、実装が抽象化の他の既知の実装と同じまたは同様の結果を生成することを期待する必要があります。トヨタカムリとフォードフュージョンはどちらも「車」です。そのため、ステアリングホイールなど、予想される機能の共通セットがあります。左に回すと左に曲がります。時計回りに回すと、車は右に進みます。米国のどの車にも乗ることができ、車にはハンドルと少なくとも2つのペダルがあります。右側の1つは「車が行く」ペダルで、中央の1つは「車が止まる」ペダルです。
抽象化の帰結は「最小限の驚きの理論」です。試乗のために新しい車のハンドルを握り、ハンドルを時計回りに回し、車が左に曲がった場合、控えめに言ってもかなり驚くでしょう。ディーラーがPOSを行商していると非難し、新しい振る舞いが以前よりも「良い」理由、またはこの振る舞いが「文書化されている」または「どのように」制御システムは透明です。この新しい車とあなたが運転した他のすべての車はまだ「車」ですが、この車を運転するときは、新しい車をうまく運転するために、車の運転方法に関する基本的な概念を変更する必要があります。それは通常悪いことです、そして、それは新しいパラダイムに直感的な利点がある場合にのみ起こります。おそらく、シートベルトの追加が良い例です。50年前、あなたは乗り込んだばかりでしたが、今は腰を据える必要があります。直観的な利点は、事故に遭ってもフロントガラスや助手席に行かないことです。それでも、ドライバーは抵抗しました。多くの自動車所有者は、使用を義務付ける法律が可決されるまで、自動車からシートベルトを切り取りました。