この質問を理解するには、抽象化とは何かを理解する必要があると思います。(私は正式な定義を見つけるのが面倒なので、私はうんざりしようとしていると確信していますが、ここに行きます...)抽象化は、複雑な主題または実体を取り、その詳細のほとんどを隠すときですそのオブジェクトの本質をまだ定義している機能を公開します。
この本があなたに与えた例は家だったと思います。家を非常に詳細に見ると、それは板、釘、窓、ドアでできていることがわかります...しかし、写真の隣の家の漫画の絵は、たとえ欠けていても家ですそれらの詳細の多く。
ソフトウェアについても同じです。本がアドバイスするように、プログラムを作成するときはいつでも、ソフトウェアをレイヤーとして考える必要があります。与えられたプログラムは、100以上のレイヤーを簡単に持つことができます。下部には、CPUで実行されるアセンブリ命令があります。より高いレベルでは、これらの命令を組み合わせてディスクI / Oルーチンを形成できます。さらに高いレベルでは、ディスクI / Windowsの関数を使用して、ファイルを単純に開く/読み取り/書き込み/シーク/閉じることができるため、O。これらはすべて、アプリケーションコードに到達する前であっても抽象化されています。
コード内で、抽象化レイヤーは継続します。下位レベルの文字列/ネットワーク/データ操作ルーチンがある場合があります。上位レベルでは、これらのルーチンを組み合わせて、ユーザー管理、UIレイヤー、データベースアクセスを定義するサブシステムにすることができます。これらのサブシステムをさらに別のレイヤーにまとめて、より大きなエンタープライズシステムの一部となるサーバーコンポーネントに統合することもできます。
これらの各抽象化レイヤーの鍵は、それぞれが前のレイヤーで公開された詳細を隠し、次のレイヤーで使用される非常にクリーンなインターフェースを提示することです。ファイルを開くには、個々のセクターの書き込み方法や処理するハードウェア割り込みを知る必要はありません。ただし、抽象化レイヤーチェーンをたどり始めると、Write()関数呼び出しから、ハードドライブコントローラーに送信される正確な命令に至るまで、確実にトレースできます。
著者が行うように言っているのは、クラスまたは関数を定義するときに、自分がどのレイヤーであるかを考えることです。サブシステムとユーザーオブジェクトを管理しているクラスがある場合、同じクラスが低レベルの文字列操作を実行したり、ソケット呼び出しを行うためだけの変数を含んだりしないようにしてください。それは、抽象化レイヤーを横断する違反であり、1つのクラス/関数が1つのことだけを行うという違反でもあります(SRP-単一責任原則)。