Wenn ich ein Spiel programmiere, in dem es einen Arbeiter gibt, der Holz schneidet (von Bäumen), wo würde ich die "cutWood" -Methode in die Arbeiterklasse oder die Baumklasse einfügen?
BEARBEITEN: Das erste Beispiel, das ich bei OOD gelesen habe, war ein Kreis (eine Klasse mit dem Namen Kreis), der eine Methode namens "Fläche berechnen" enthält. Nun, sicher genug berechnet ein Kreis seine eigene Fläche nicht. Die einzige Möglichkeit, daran zu denken, ist, dass der Berechnungsbereich eine Operation ist, die für den Kreis relevant ist (eine Operation, die auf dem Kreis ausgeführt wird)
Die cutWood-Methode ist also sowohl für den Worker als auch für die Struktur relevant.
Ich sehe keinen Zusammenhalt, um eine Holzschneide-Methode im Arbeiter zu haben. Der Schnitt erfolgt am Baum und sollte daher Teil der Baumklasse sein. Vermutlich wird beim Schneiden des Holzes auch der innere Zustand der Holzart verändert.
Ein Arbeiter sollte
Betrachten Sie etwas, das Ihnen vertraut ist, ein String
. Wenn Sie einen String (Split) ausschneiden möchten, definieren Sie in jedem Objekt, das dies tut, keine SplitString-Methode. Welches Objekt auch immer die Teilung der Zeichenkette beschließt, es geschieht dasselbe - und muss normalerweise die Interna des Zielobjekts (der Zeichenkette) kennen, um dies zu tun. Viele andere Objekte rufen einfach die Split-Methode der Zeichenfolge auf. Das String-Objekt hat eine hohe Kohäsion - weil seine Methoden zu einer gemeinsamen Aufgabe beitragen - die Manipulation von Strings.
Ich sehe nicht, wie das Schneiden von Holz viel zum Arbeiterobjekt selbst beiträgt.
Sie haben es grundsätzlich in Ihrer Frage beantwortet: "Ein Arbeiter, der Holz schneidet". Sie sollten es in die Arbeiterklasse einfügen.
Müssen Sie den Baum ändern, während er gerade geschnitten wird?
Müssen Sie den Arbeiter ändern, während er einen Baum schneidet?
Ich würde mir vorstellen, dass Sie mit einem WoodCutting
-Dienst enden würden, der das Ereignis behandelt, möglicherweise Änderungen an beiden, oder wiederum ruft worker.cutWood()
AND tree.woodCut()
ahah was für eine Frage;)
Klingt für mich wie ein Kandidat für das Strategie-Muster. Möglicherweise benötigen Sie eine abstrakte WorkerAction-Klasse mit einer performAction-Methode. Dann implementieren Unterklassen der WorkerAction-Klasse die Details wie das Schneiden eines Baumes, das Graben nach Gold und andere Arbeiteraktionen. Die Unterklasse kennt also die Details des Baumes und kann die notwendigen Methoden in der Baumstruktur aufrufen, um den Baum zu beeinflussen, während er abgeschnitten wird.
Die Worker-Klasse benötigt dann nur einen Verweis auf eine Instanz einer konkreten WorkerAction, auf der sie performAction () aufruft. Der Arbeiter kennt die Details des Baumes oder des Goldes usw. nicht. Auf diese Weise kann der Arbeiter die Aktion ausführen, aber Sie beschränken den Arbeiter nicht auf nur eine Aktion. Tatsächlich müssen Sie die Worker-Klasse nicht mehr ändern, wenn Ihr Worker in Zukunft mehr Aktionen ausführen soll.
Sie könnten eine cutWood
-Methode in der Worker-Klasse und eine cutted
-Methode in der Tree-Klasse haben. Offensichtlich ruft worker.cutWood
tree.cutted
auf, was die Menge an geerntetem Holz zurückgeben könnte.
tree.cutted würde alles tun, was nötig ist, um den Baum sterben zu lassen.
Wenn Sie Methodenaufrufe als "von einem Objekt an ein anderes Objekt gesendete Nachrichten" betrachten, ist es viel sinnvoller zu sagen: "Der Spieler sendet eine Nachricht" Schnittholz "an den Arbeiter, der wiederum eine 'Schnitt'-Nachricht sendet der Baum ".
Bei der Objektgestaltung geht es darum, Ihren Klassen Verantwortlichkeiten zuzuweisen. Das bedeutet, dass es wirklich keine gute Antwort auf diese Frage gibt. Wie alles hängt davon ab, wie Sie die Verantwortlichkeiten in Ihrem Design modellieren. (Siehe: Larman )
Also Sie müssen entscheiden, welches Objekt / welche Klasse für was verantwortlich ist. Dies führt Sie zu korrekten Antworten auf die Frage, welche Methoden verwendet werden sollten.
So stellen Sie sich selbst Fragen wie: Entscheidet sich der Arbeiter selbst, um Holz zu schneiden? Wenn er das tut, muss er wahrscheinlich nicht so bestellt werden, also wird er keine Methode cut (tree) brauchen. Aber wenn der Benutzer ihm das befehlen kann, benötigt er eine cut (tree) Methode. Ein anderes Beispiel: Muss der Baum wissen, dass er geschnitten ist? Nun, wenn ein gefällter Baum nur dazu führt, dass er aus dem Wald entfernt wird, braucht er vielleicht keine tree.cut () Methode. Wenn Sie jedoch dem Baum die Verantwortung zuweisen, sich während des Schneidens (neu) selbst zu zeichnen, benötigen Sie möglicherweise eine Methode tree.cut () . Der Baum könnte sogar so modelliert werden, dass er eine Breite hat und dass er berechnen kann, wie viele Schnitte benötigt werden, bevor er kollabiert.
Da ein einzelner Worker möglicherweise mehr als einen Baum schneidet, klingt es wahrscheinlicher, dass Sie cutWood()
in die Worker-Klasse einfügen möchten.
Diese Frage kann nur wirklich beantwortet werden, wenn Sie erklären, was cutWood
tut.
Wenn cutWood
nur den Status von Tree
betrifft, dann gehört es in Tree
z. B.,
Im Falle von calculateArea
brauchen Sie nur den Radius eines Kreises (angenommen, pi ist konstant), um diese Berechnung durchzuführen - sonst nichts. Deshalb gehört es in Circle
.
Hören Sie auf, die reale Welt zu genau zu modellieren und schauen Sie sich an, was Ihre Methode eigentlich tun muss.
Dies ist ein interessantes Thema. Ich habe manchmal selbst über ein ähnliches Szenario nachgedacht. Ich denke, ein guter Weg zu gehen, ist es, die Methode in die Klasse mit der höchsten Kohäsion zu bringen. Daher wäre die Tree-Klasse die erste Wahl. Auf der anderen Seite, wenn Sie versuchen, ein reales Weltmodell zu finden, würde ich sagen, dass die Arbeiterklasse in der Lage sein muss, eine Art von Aktionen durchzuführen, die das Schneiden eines Baumes beinhaltet. Ich bin oft in solchen Situationen und frage mich, wo der richtige Ort für diese Methode ist. Eine andere Herangehensweise wäre eine Klasse, die Arbeiter und Bäume kennt und daher den Schneidbaum-Mechanismus behandelt. Auf diese Weise würden beide Klassen (Baum, Arbeiter) nichts darüber wissen.
Tags und Links oop