PLO: Wer hat Ishmael genommen? Objekteigentum an Methoden

Dieser Artikel befasst sich mit der Analyse der Frage, welches OOP-Objekt eine Methode besitzen soll, die zwischen mehreren Entitäten interagiert.



Dies ist ein häufiges Thema für Holivars. Zum Beispiel:

Verwenden Sie kein OOP. Noch nie. Das ist ein Fehler.



Zu diesem Thema gibt es viele Materialien, zum Beispiel: www.youtube.com/watch?v=QM1iUe6IofM



Wenn OOP für Sie immer noch eine gute Idee ist, lösen Sie ein einfaches Problem.



Es gibt drei Objekte: eine Katze, einen Futterautomat und eine Person. Sie müssen eine Methode schreiben, mit der eine Person eine Katze mit einem Futterautomaten füttern kann.



Frage: Welche Klassenmethode wird die .feed () -Methode sein?



Bitte geben Sie eine begründete Antwort gemäß der Klassenhierarchie und anderen Best Practices für OOP.



Vergleichen Sie dies nun mit einer funktionalen Implementierung: Sie haben eine feedCat () -Funktion, die einen Verweis auf eine Katze und einen Feeder als Argument verwendet.
Zitat aus holivar



Wie beantworte ich diese Frage?



Schauen wir uns zunächst ein Beispiel aus der Physik an.



Fall 1 (aus der Physik): Ohmsches Gesetz



Ohmsches Gesetz: I = U / R, wobei I der Strom ist, U die Spannung ist, R der Widerstand ist.



Es ist leicht zu erkennen, dass das Ohmsche Gesetz wie jede andere Formel von drei Variablen auf drei Arten geschrieben werden kann: I = U / R, R = U / I, U = IR. Wie kann eine Regel entwickelt werden, mit der Sie eine einzelne Datensatzform eindeutig definieren können? Es ist sehr einfach: Sie müssen die abgeleitete Menge auf der linken Seite notieren, d. H. derjenige, der einen bestimmten Wert annimmt, abhängig von den übrigen Mengen.



I = U / R "Der Strom WIRD gleich dem Verhältnis der Spannung an den Enden des Leiters zum Widerstand des Leiters" - wahr.



U = IR "Die Spannung an den Enden des Leiters wird gleich seinem Widerstand multipliziert mit dem Strom durch den Leiter" - nicht wahr.



R = U / I "Der Widerstand des Leiters WIRD gleich dem Verhältnis der Spannung an den Enden zum Strom" - ist nicht wahr.



Sie sehen - als wir uns einig waren, dass der abgeleitete Wert links ist, war nur noch eine Option übrig.



Wir werden das gleiche in OOP tun. Lassen Sie uns zustimmen, dass die Methode zu derjenigen gehört, die handelt:



Who_Acts . Method (Action_Object);




Fall 2: Wer hat Ishmael genommen?



Daher bei der Beantwortung der Frage "Wer hat Ishmael genommen?" Aus der Sicht der objektorientierten Programmierung und aus der Sicht von "Wer beeinflusst?" lautet die richtige Antwort Suworow. Take Fortress (Izmail, Turks): Boolean. Alle anderen Optionen, wie z. B.: Turks.Pro *** tKrepost (Izmail, Suworow), Izmail.Änderung des Besitzers (Türken, Suworow), Abstrakte Festung. Gefangen genommen werden (Ismail, Suworow, Türken) usw. - Alle diese Optionen sind falsch.



Fall 3: Mensch, Futterautomat und Katze





"Die Katze füttern!" von der Stelle corchaosis.ru



Ein Mann goss Essen in den Trog. Diese Methode :

.(,). Wenn die Methode ausgeführt wird, verringert sich die Lebensmittelmenge in der globalen Variablen des Lebensmittelpakets und wird in der globalen Variablen des Feeders angezeigt.



Was ist mit der Katze? Und die Katze existiert VOR dem Aufrufen der PourFoodCat-Methode als Bedingung für den Aufruf. Wenn sich die Katze auf dem Land befindet, wird die Gießfuttermethode nicht zur Katze aufgerufen.



Fall 4: DOOM-Spieler, Schrotflinte und Monster



Nehmen wir an, die Frage, ein Monster zu treffen, hat keine Abstufungen: entweder getroffen oder nicht getroffen.

Richtige Implementierung. Alles beginnt mit der Player-Methode:



(, _1 ).(_1)

In der Implementierung der Shot-Methode sehen wir, dass die aktuelle Waffe des Players eine Schrotflinte ist.

Daher nennen wir die Methode des verschachtelten Objekts:



_1.[_1.__].(_1)



Player_1 . Die Waffe ist die TWeapon-Klasse.



In diesem Fall wird die Methode der TShotgun-Klasse aufgerufen, die ein Kind von TWeapon ist.

Wir haben also: .(_1)



Schrotflinte ändert bei Ausführung dieser Aktion den internen Status: Bei Schrotflinte ist dies die Anzahl der Patronen (und bei einem anderen Waffentyp kann beispielsweise Temperatur herrschen). Außerdem bestimmen wir die Stärke des Schadens - zum Beispiel schießt die Schrotflinte 2 Runden gleichzeitig, aber sie kann auch eine abfeuern, wenn nur noch eine Runde in der Ladung ist.



Wenn wir einen Raketenwerfer abfeuern würden, würde ein neues Objekt erscheinen - eine Rakete. Mit einer eigenen Tick-Methode, die Aktionen in einem Tick der Spielzeit verarbeitet (die Spielzeit ändert sich normalerweise in Ticks). Wir haben jedoch eine Waffe abgefeuert, die ohne Verzögerung zuschlagen kann. Daher kennen wir die Anzahl der abgefeuerten Runden (1 oder 2), die Entfernung (Vergleich von Player.Position und Monster_1.Position) und berechnen innerhalb der Shotgun-Klassenmethode den Schaden.



Und schließlich _1.(_:Float). Nach wie vor hat die Schrotflinte ihren internen Status (Anzahl der Patronen) geändert, jetzt ändert Monster_1 ihren internen Status _1.und ihr Verhaltensszenario (insbesondere wenn die Gesundheit unter Null geworden ist).



Wir sehen also, dass wir dank OOP leicht eine neue Waffe hinzufügen können: Beschreiben Sie sie einfach als Kinderklasse von TWeapon, definieren Sie den Schuss und platzieren Sie ihn auf der Karte. Die Player-Klasse weiß bereits, wie TWeapon-Objekte ausgewählt und zu ihrem Spielset hinzugefügt werden. Alle. Obwohl nein, nicht alle. Wenn die Waffe Monstern Blumen schenkt und sie dazu zwingt, sich in den Spieler zu verlieben, sollten den Monstern auch eine Methode :booleansowie eine Reihe anderer Methoden verschrieben werden - je nach Ausarbeitungsgrad benötigen Sie in diesem Fall möglicherweise eine Reihe neuer OOP-Objekte und deren Methoden.



Fall 5: Übergabe ist eine Funktion oder Methode



Nicht nur die Antwort auf diese Frage, sondern auch die Interaktionsschnittstelle selbst hängt natürlich vom berührten Objekt ab.



_::Ist eine Funktion.



Handpick :: Laptop ist eine Methode des Laptop-Objekts. Sie müssen die Schnittstelle verwenden, um die Laptop-Methoden "KeyDown, KeyUp, KeyPressed" aufzurufen und die richtigen Daten an diese Methoden zu übergeben: Welche Taste wurde zu welchem ​​Zeitpunkt gedrückt usw.



_::Ist eine Methode des you-Objekts. Sie benötigen ein "Selbst" -Objekt, dessen Statusänderung den Handbrand korrekt beschreibt. Feuer wird den Zustand nicht ändern.



Ich denke, Sie selbst können die Liste der Objektschnittstellen fortsetzen, die Sie mit Ihren Händen berühren können, um die Praxis der objektorientierten Programmierung zu erlernen.



All Articles