PLO:誰がイシュマエルを連れて行ったのですか?メソッドのオブジェクト所有権

この記事は、どのOOPオブジェクトが複数のエンティティ間で相互作用するメソッドを所有する必要があるかという問題の分析に専念しています。



これはホリバーの一般的なトピックです。例えば:

OOPは使用しないでください。決して。これは間違いです。



このトピックに関する資料はたくさんあります。たとえば、www.youtube.com / watch?v = QM1iUe6IofM



OOPがまだ良いアイデアだと思われる場合は、簡単な問題を解決してください。



猫、餌箱、人の3つのオブジェクトがあります。あなたは人がフィーダーを使って猫に餌をやることができる方法を書く必要があります。



質問:.feed()メソッドはどのクラスメソッドになりますか?



クラス階層およびその他のOOPのベストプラクティスに従って、合理的な回答を提供してください。



ここで、これを機能的な実装と比較します。引数として猫とフィーダーへの参照を受け取るfeedCat()関数があります。
holivarからの引用



この質問に答える方法は?



まず、物理学の例を見てみましょう。



ケース1(物理学から):オームの法則



オームの法則:I = U / R、ここでIは電流、Uは電圧、Rは抵抗です。



オームの法則は、他の3つの変数の式と同様に、I = U / R、R = U / I、U = IRの3つの方法で記述できることは容易に理解できます。単一の形式のレコードを一意に定義できるルールを開発するにはどうすればよいですか?非常に簡単です。左側に導出された量を書き留める必要があります。残りの量に応じて、特定の値になるもの。



I = U / R「電流強度は、導体の両端の電圧と導体の抵抗の比に等しくなります」-true。



U = IR「導体の両端の電圧は、その抵抗に導体を流れる電流を掛けたものに等しくなります」-正しくありません。



R = U / I「導体の抵抗は電流に対する両端の電圧の比率に等しくなります」-は真実ではありません。



ご覧のとおり、派生値が左側にあることに同意すると、オプションは1つしか残っていませんでした。



OOPでも同じことをします。メソッドが行動する人に属することに同意しましょう:



Who_Acts。Method(Action_Object);




ケース2:誰がイシュマエルを服用しましたか?



したがって、「誰がイシュマエルを連れて行ったのか」という質問に答えるとき。オブジェクト指向のプログラミングの観点から、そして「誰が影響を与えているのか」という立場からすると、正解はSuvorovです。要塞(Izmail、Turks):booleanを取ります。Turks.Pro *** tKrepost(Izmail、Suvorov)、Izmail.Change of Owner(Turks、Suvorov)、Abstract Fortress.To Be Captured(Ismail、Suvorov、Turks)などの他のすべてのオプション。-これらすべてのオプションは正しくありません。



ケース3:男、フィーダー、猫





「猫に餌をやる!」サイトcorchaosis.ruから



男がトラフに食べ物を注ぎました。この方法:

.(,)メソッドが実行されると、フードの量はフードパッケージのグローバル変数で減少し、フィーダーのグローバル変数に表示されます。



猫はどうですか?そして、猫は、それを呼び出すための条件として、PourFoodCatメソッドを呼び出す前に存在します。猫がその国にいる場合、PourFoodメソッドは猫に呼び出されません。



ケース4:DOOMプレーヤー、ショットガン、モンスター



モンスターを打つという問題には、ヒットするかヒットしないかのどちらかのグラデーションがないとしましょう。

正しい実装。それはすべてPlayerメソッドから始まります



(, _1 ).(_1)

。Shotメソッドの実装内では、プレーヤーの現在の武器がショットガンであることがわかります。

したがって、ネストされたオブジェクトのメソッド



_1.[_1.__].(_1)



Player_1を呼び出します。武器はTWeaponクラスです。



この場合、TWeaponの子であるTShotgunクラスのメソッドが呼び出されます。

つまり、.(_1)



ショットガンは、このアクションを実行すると、内部状態を変更します。ショットガンの場合、これはカートリッジの数です(別の種類の武器の場合、たとえば温度など)。また、ダメージの強さを決定します。たとえば、ショットガンは2ラウンドを撃ちますが、チャージに残っているラウンドが1つしかない場合は、1ラウンドを発射することもできます。



ロケットランチャーを発射すると、新しいオブジェクト、つまりロケットが表示されます。独自のTickメソッドを使用して、ゲーム時間の1ティックでアクションを処理します(ゲーム時間は、通常はティックで変化します)。しかし、遅滞なく攻撃できる武器を発射したので、発射されたラウンド数(1または2)、距離(Player.PositionとMonster_1.Positionを比較)、およびShotgunクラスメソッド内でダメージを計算します。



そして最後に_1.(_:Float)。これで、以前と同様に、ショットガンが内部状態(カートリッジの数)を変更し、Monster_1が内部状態 _1.と動作シナリオを変更します(特にヘルスがゼロ未満の場合)。



したがって、OOPのおかげで、新しい武器を簡単に追加できることがわかります。TWeaponの子クラスとして記述し、ショットを定義して、マップに配置するだけです。Playerクラスは、TWeaponオブジェクトを選択してプレイセットに追加する方法をすでに知っています。すべて。いいえ、すべてではありません。武器がモンスターに花を与え、プレイヤーに恋をさせる場合は、モンスターに:boolean方法と他の一連の方法を処方する必要があります-精巧さの程度に応じて、この場合、いくつかの新しいOOPオブジェクトとその方法が必要になる場合があります。



ケース5:処理は関数またはメソッドです



この質問への答えだけでなく、インタラクションインターフェイス自体は、明らかに、触れられているオブジェクトに依存します。



_::機能です。



ハンドピック::ラップトップはラップトップオブジェクトのメソッドです。インターフェイスを使用して、ラップトップメソッド「KeyDown、KeyUp、KeyPressed」を呼び出し、これらのメソッドに正しいデータを渡す必要があります。どのボタンが押されたか、どの時点でかなどです。



_::youオブジェクトのメソッドです。状態変化が手のやけどを正しく説明する「自己」オブジェクトが必要です。火は状態を変えません。



オブジェクト指向のプログラミングを実践するために、手で触れることができるオブジェクトインターフェイスのリストを自分で続けることができると思います。



All Articles