ビデオ: Building Dynamic Web Apps with Laravel by Eric Ouyang 2024
C ++の継承とファクタリングの概念は、1つのクラスが基本クラスのプロパティを継承することを可能にします。継承には多くの目的があります。継承の主な利点は、クラス間の関係を指摘できることです。これはいわゆるIS_A関係です - MicrowaveOven IS_Aオーブンとそのようなもの。
因果関係は、あなたが正しい相関関係を作れば素晴らしいことです。例えば、マイクロ波対従来のオーブンの関係は自然なようです。電子レンジはトースターの特別な種類だと主張し、あなたは困っています。確かに、彼らは両方とも物事を暑いものにし、電気を使い、キッチンでも見つけられるが、類似性はそこで終わる。電子レンジはトーストできず、トースターはナチョーを作ることができない。
<! - 1 - >問題に固有のクラスを特定し、これらのクラス間の正しい関係を描くことは、 ファクタリングと呼ばれるプロセスです。 (単語は、あなたが小学校でやらなければならない算術に関連しています。たとえば、最小公約数を除外すると、12は2倍の2倍になります。)
継承は、銀行口座の例を使用してプログラムを単純化します。貯蓄口座と当座預金口座のコンセプトを実装した単純な銀行プログラムを書くように求められたとします。
<! - 2 - >オブジェクト指向のプログラマーは、図面のクラスの顕著な点を簡潔に記述する方法を思いつきました。この図には 小切手 と小切手 が示されています。 (これは、同じことを図式的に表現するためのいくつかの方法の1つに過ぎません。)
と 小切手の確認。 "> 独立クラス と 小切手の確認。 この図と他の図を読むには、次のことを覚えておいてください。<! - 3 - >
大きなボックスはクラスで、クラス名が一番上にあります。-
ボックス内の名前はメンバ関数です。
-
ボックスに入っていない名前はデータメンバーです。
-
箱から途中まで延びる名前は、一般にアクセス可能なメンバーです。つまり、これらのメンバーは、クラスまたはその子孫の一部ではない関数によってアクセスできます。箱の中に完全に入っているメンバーには、クラス外からアクセスすることはできません。
-
太い矢印はIS_A関係を表します。
-
細い矢印はHAS_A関係を表します。
-
A Car IS_A Vehicle
、 がCar HAS_A Motor です。 最初の図では、
検査 クラスと 貯蓄 クラスに共通点が多いことがわかります。たとえば、両方のクラスにはwithdrawal()およびdeposit()メンバー関数があります。ただし、2つのクラスは同一ではないため、別々のクラスとして残す必要があります。 (現実の銀行のアプリケーションでは、この2つのクラスはこの例よりもかなり異なるでしょう)。しかし、この繰り返しを回避する方法があるはずです。 これらのクラスの1つにもう一方のクラスを継承させることができます。
貯蓄 は 小切手 よりも会員数が多いので、 小切手 を 小切手から継承させることができます。 この配置を次の図に示します。
貯蓄 クラスはすべてのメンバーを継承します。クラスはデータメンバーnoWithdrawalsを追加し、関数withdrawal() をオーバーライドすることで完了します。 貯金口座からの引き出しのルールと当座預金からの引き出しのルールが異なるため、withdrawal()をオーバーライドする必要があります。 小切手
は 小切手のサブクラスとして実装されています。 "> 小切手 は 小切手のサブクラスとして実装されています。節約 を チェック から継承することは労力を要するものですが、それは完全に満足できるものではありません。主な問題は、運転免許証に記載されている重量のように、それは真実を偽っているということです。この継承関係は、普通預金口座が特殊な口座であることを意味します。 そのような誤った表現は、今日と明日の両方で、プログラマーにとって混乱します。いつか、プログラミングの習慣に慣れていないプログラマーは、コードが何をしているのかを理解して理解しなければなりません。誤解を招く表現は、調整し理解するのが難しいです。
また、このような誤った表現は、問題を引き起こす可能性があります。例えば、銀行が預金口座に関して政策を変更したとする。その月に最低残高が一定値を下回った場合にのみ、当座預金口座のサービス手数料を請求することを決定したとします。
このような変更は、クラス
チェックの変更を最小限に抑えて簡単に処理できます。 月の最低残高を記録するには、 チェック クラスに新しいデータメンバーを追加する必要があります。手足に出て、それを minimumBalanceと呼んでみましょう。 しかし、あなたには問題があります。
小切手 は 小切手から継承するため、貯蓄 はこの新しいデータメンバーも取得します。最低残高は貯蓄勘定に影響しないので、このメンバーには使用できません。すべての当座預金口座オブジェクトには、この余分な minimumBalance メンバーがあることに注意してください。 1人の余分なデータメンバーが大したことではないかもしれないが、それはさらに混乱を招く。 このような変更は蓄積されます。今日は余分なデータメンバーです - 明日は変更されたメンバー関数です。最終的には、普通預金口座クラスには、普通預金口座にのみ適用される余分な手荷物がたくさん載っています。
今すぐ銀行が戻って貯蓄口座の方針を変更することにします。これには、
チェックの一部の機能を変更する必要があります。 このような基本クラスの変更は、サブクラス 節約で関数がすでにオーバーライドされていない限り、サブクラスに自動的に伝播します。 たとえば、銀行がすべての預金に対して当座預金者を当座預金口座に引き渡すことを決定したとします。銀行(またはそのプログラマー)がそれを知ることなく、当座預金口座への預金は自動的にトースターの寄付につながります。あなたが非常に慎重でない限り、
Checking への変更は予期せず Savingsに表示されることがあります。 これらの問題をどうやって回避できますか?
は 貯蓄 の特別なケースですが、私たちの問題は解決しないと主張しています。必要なのは、ここに示すように 小切手 と 小切手 の間に共通する事項を具体化する第3のクラス(「口座」、「999」のみ)です。 一般的な アカウント クラスで
と 節約 をチェックします。一般的な アカウント クラスで、 基本 と 節約 をチェックします。 新しい口座の開設はどのように問題を解決するのですか?まず、新しい Account クラスを作成することは、現実世界(それが何であれ)をより正確に記述することです。もちろん、実際にアカウントとして知られているものがあります。貯蓄口座と当座預金口座は、このより基本的な概念の特殊なケースです。クラス 節減 クラスは、クラス
検査 (およびその逆)の変更から隔離されています。銀行がすべての口座に根本的な変更を加える場合、 口座、 を変更することができ、すべてのサブクラスは自動的に変更を継承します。しかし、銀行が口座の確認のみを行うポリシーを変更した場合、 節約に影響を与えずに 小切手 を変更することができます。 類似のクラスから共通プロパティを取り除くこのプロセスは、クラスファクタリングの本質である 。ファクタリングは、継承関係が現実に対応している場合にのみ合法です。どちらもハードウェアポインティングデバイスであるため、クラス マウス
と ジョイスティック
を組み合わせることは合法です。両方とも低レベルのオペレーティングシステム呼び出しを行うため、クラス マウス と 表示 を組み合わせることはできません。