例付きのOOP(パート2)

運命では、大学でデザインパターンに関する特別なコースを読む必要があります。 特別なコースが必要であるため、生徒たちは私とはまったく違った方法でやって来ます。 もちろん、その中には実践的なプログラマーがいます。 しかし、残念なことに、ほとんどは基本的なOOP用語を理解することすら困難です。



これを行うために、OOPの基本概念(クラス、オブジェクト、インターフェイス、抽象化、カプセル化、継承、およびポリモーフィズム)を説明するために、多かれ少なかれ実例に挑戦しました。



最初の部分は 、クラス、オブジェクト、およびインターフェース専用です。

以下に示す2番目の部分は、カプセル化、ポリモーフィズム、および継承を示しています。





カプセル化



ヘンリー・フォードがまだ組み立てラインを思い付かなかった世紀の終わりに、私たちが少しの間想像してみてください。そして、車を作る最初の試みは、これらの喫煙モンスターが空気を汚染し、馬を怖がらせるという当局からの批判に遭遇しました。 最初の蒸気エンジンを制御するには、蒸気ボイラーがどのように配置されているかを知り、絶えず石炭を投げ、温度、水位を監視する必要があったと想像してください。 この場合、車輪を回すには、2つのレバーを使用します。各レバーは1つの車輪を個別に回します。 当時の車を運転するのは非常に不快で困難だったという事実に同意できると思います。



自動ギアボックスを備えた自動車産業の現代の驚異に戻りましょう。 実際、実際には何も変わっていません。 ガソリンポンプは依然としてガソリンをエンジンに供給し、差動装置は異なる角度でホイールを回転させ、クランクシャフトはピストンの並進運動をホイールの回転運動に変えます。 進捗状況は異なります。 現在、これらすべてのアクションはユーザーから隠されており、この時点でインジェクター、スロットル、カムシャフトに何が起こるかを考えることなく、ハンドルを回してアクセルペダルを踏むことができます。 車で行われる内部プロセスの隠蔽が、20年の経験を持つプロの自動車整備士ではない人でも効果的に使用できるようにします。 OOPでのこの隠蔽はカプセル化と呼ばれます。



カプセル化はシステムのプロパティであり、データとメソッドを組み合わせてクラス内で操作し、詳細を非表示にすることができます

ユーザーからの実装。



カプセル化は、クラスインターフェイスの概念と密接に関連しています。 実際、インターフェイスに含まれていないものはすべてクラスにカプセル化されています。



抽象化



ドライバーが混雑した交通エリアを車で運転しているところを想像してください。 現時点では、彼は車の塗料の化学組成、ギアボックス内のギアの相互作用の特性、または速度に対する体の形状の影響については考えないことは明らかです(車が死んで渋滞していて、ドライバーがまったく何の関係もない場合を除く)。 ただし、彼は定期的にハンドル、ペダル、方向指示器(および場合によっては灰皿)を使用します。



抽象化は、オブジェクトの重要な特性のセットを強調表示する方法であり、重要でない特性を考慮から除外します。 したがって、 抽象化は、このようなすべての特性のコレクションです。



車の挙動をモデル化するためにボディペイントの化学組成と室内電球の比熱を考慮する必要がある場合、NFSが何であるかはわかりません。



多型



たとえば、VAZ 2106を運転することを学んだ人がVAZ 2110またはBMW X3を運転できなかった場合、運転のトレーニングは意味がありません。 一方、ブレーキペダルの左側にアクセルペダルがあり、ハンドルの代わりにジョイスティックが付いている車を通常運転できる人を想像することは困難です。



問題は、車の主なコントロールが同じ設計と動作原理を持っていることです。 ドライバーは、そこにパワーステアリングがあるかどうかに関係なく、左に曲がるにはステアリングホイールを回さなければならないことを確信しています。

仕事から家に帰る必要がある場合、使用する車の種類に関係なく、車を運転して同じアクションを実行します。 実際、すべての車には同じインターフェースがあり、ドライバーは車の本質から抽象化されており、このインターフェースで動作していると言えます。 ドライバーがドイツのアウトバーンに沿って運転しなければならない場合、彼はおそらく着陸の遅い高速車を選択し、雨の後にゴルニーアルタイのリモートマラニックから戻らなければならない場合、おそらく陸軍橋のあるUAZが選択されます。 しかし、機械の動きと内部機能がどのように実装されるかに関係なく、インターフェースは同じままです。



ポリモーフィズムは、オブジェクトのタイプと内部構造に関する情報なしで、同じインターフェースを持つオブジェクトを使用するシステムのプロパティです。



たとえば、ファイルからデータを読み取る場合、明らかに、ファイルストリームを実装するクラスには、次のようなメソッドがあります。byte [] readBytes(int n);

ソケットから同じデータを読み取る必要があるとします。 ソケットを実装するクラスには、 readBytesメソッドもあります。 システム内で、あるクラスのオブジェクトを別のクラスのオブジェクトに置き換えるだけで十分です。結果が得られます。



さらに、データがファイルから読み取られるか、ネットワーク経由で受信されるかに関係なく、システムロジックを実装できます。 したがって、データ収集の特定の専門分野から抽象化し、インターフェイスレベルで作業します。 唯一の要件は、使用される各オブジェクトにreadBytesメソッドがあることです。



継承



自動車工場のエンジニアとして、自分を一瞬想像してみてください。 私たちの仕事は、現代の車を開発することです。 すでに以前のモデルがあり、長年の使用で実証されています。 すべてがうまくいきますが、時代と技術は変化しており、私たちの近代的な工場は、その製品の利便性と快適性を高め、現代の基準を満たすよう努力する必要があります。



セダン、ステーションワゴン、サブコンパクトハッチバックの全車種をリリースする必要があります。 明らかに、私たちはゼロから新しい車を設計するつもりはありませんが、前世代を基礎として、多くの設計変更を導入します。 たとえば、パワーステアリングを追加して、翼とボンネットの間の隙間を減らし、フォグライトを配置します。 さらに、ボディの形状は各モデルで変更されます。



明らかに、3つの変更はすべて、以前のモデル(1970年の古き良きエンジン、国内の道路、ギアボックスなどで優れていることが証明された侵入不可能なシャーシ)のほとんどの特性を備えています。 さらに、各モデルはいくつかの新しい機能または設計機能を実装します。 この場合、継承を扱っています。

継承はシステムのプロパティであり、機能を部分的または完全に借用した既存のクラスに基づいて新しいクラスを記述することができます。 継承の派生元のクラスは、ベースまたは親と呼ばれます。 新しいクラスは、子孫、子孫、または派生クラスです。



派生クラスは親の仕様を完全に満たしていますが、追加の機能がある場合があることに注意してください。 インターフェイスに関しては、各派生クラスは親クラスのインターフェイスを完全に実装します。 その逆は真実ではありません。



実際、この例では、新しい車でも古い車と同じアクションを実行できます。つまり、速度を上げたり下げたり、方向を変えたり、方向指示器をオンにしたりできます。 ただし、さらに、たとえばフォグライトをオンにすることもできます。



後方互換性の欠如は、フォグライト(単にこのモデルにはない)を含めるなどのアクションに対する正しい反応を古いモデルから期待すべきではないことを意味します。



All Articles