[Artikel, der 5000% der Objektorientierung (Praxis) versteht](/ gorillab / items / fab2a6637f681221f687 ) War sehr interessant, also wollte ich es in die Praxis umsetzen, also habe ich es zum ersten Mal gepostet.
Ich stelle mir das Wort objektorientiertes Objekt als Objekt im Sinne des Synonymes für Subjekt vor, dh als Objekt / Ziel.
Für diejenigen, die nicht objektorientiert sind, erkläre ich jedoch oft, dass "Objekte" Dinge "sind." Es heißt jedoch "Ding" anstelle von "Ding". Es ist nicht auf die physische Existenz beschränkt, sondern kann auch ein abstraktes Konzept sein, deshalb erkläre ich oft, dass es ziemlich schwierig ist.
Es tut mir leid für meine Bequemlichkeit, aber das Implementierungsbeispiel ist in Java geschrieben, was ich gewohnt bin zu schreiben. Ich habe keine Umgebung, um den Compiler zu übergeben. Wenn also ein Fehler auftritt, werde ich ihn später beheben. Ich habe auch kein Javadoc geschrieben. Wir entschuldigen uns im Voraus.
Lassen Sie uns das Problem auf der Grundlage des oben Gesagten angehen.
Der vollständige Text des Problems tut mir leid, aber bitte lesen Sie den Quellartikel. Der Inhalt ist, dass drei Spieler von A bis C ein Spiel wie indisches Poker mit den Karten 1 bis 5 spielen.
Ich denke, es ist ein einfacher Ansatz, sich eine Szene vorzustellen, in der Sie dieses Spiel in der realen Welt spielen und die Klasse von dort aus identifizieren. In meinem Sinne ist die reale Welt jedoch etwas unhandlich.
Was ich sagen möchte ist, dass es bei diesem Thema wahrscheinlich selbstverständlich ist, sich "drei" als Zeichen vorzustellen. Streng genommen sollten jedoch neben dem Spieler auch "die Person, die den Fortschritt des Spiels verwaltet" und "die Person, die beurteilt, ob die Antwort richtig ist", benötigt werden. (Erstens darf es keine "Person" sein.) Leider glaube ich nicht, dass solche Leute normalerweise in der realen Welt verfügbar sind. Jeder Spieler verwaltet den Fortschritt und beurteilt die Richtigkeit der Antwort.
In der Welt des Programmierens kann man über Dinge nachdenken, ohne an die Zwänge der realen Realität gebunden zu sein. Ich denke, es wäre glücklicher, sich eine ideale Welt ein wenig mehr als die reale Welt vorzustellen.
Zunächst benötigen Sie einen Spieler und eine Karte.
Stellen Sie sicher, dass der Spieler einen Namen hat. Zusätzlich hat jeder Spieler eine Karte, also halten Sie ein Feld und einen Getter / Setter bereit.
Player.java
public class Player {
private String name;
private Card card;
public Player(String name) {
this.name = name;
}
public void getName() {
return name;
}
public void getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
}
Die Nummer auf der Karte ändert sich nicht, nachdem Sie sie zuerst festgelegt haben. Stellen Sie sie daher im Konstruktor ein und bereiten Sie nur den Getter vor. Auf diese Weise wird es zu einem sogenannten unveränderlichen Objekt.
Card.java
public class Card {
private int number;
public Card(int number) {
this.number = number;
}
public int getNumber() {
return number;
}
}
Als nächstes werden wir den Kartensatz in einer anderen Klasse namens "Deck" darstellen. Natürlich kann es als einfache Liste von Karten ausgedrückt werden, aber da der Vorgang des "Mischens und Zeichnens nacheinander von oben" vorgestellt wird, sollte es zweckmäßig sein, das "Konzept des Decks" als Klasse zu extrahieren. ist.
Deck.java
public class Deck {
private List<Card> cards;
public Deck() {
//Erstellen Sie der Einfachheit halber einen Satz von 1 bis 5 Karten im Konstruktor.
cards = new ArrayList<>();
for(int i = 0; i < 5; i++) {
cards.add(new Card(i + 1));
}
}
public void shuffle() {
//Der Einfachheit halber mit der Sammlungs-API gemischt
Collections.shuffle(cards);
//Wenn Sie möchten, können Sie Shot Gun Shuffle usw. implementieren.
}
//Ich bin dran! Wenn Sie diese Methode aufrufen, können Sie eine Karte von oben ziehen
public Card draw() {
return cards.remove(0);
}
}
Als nächstes stellen wir "die Person vor, die den Fortschritt des Spiels verwaltet". Diese Person gibt allen Spielern Karten und lässt Herrn A der Reihe nach antworten. Der Name der Klasse scheint besser zu sein, aber ich stelle mir so etwas wie einen Casino-Tisch vor und lasse ihn als Dealer. Fahren Sie mit dem Bild fort, dass der Dealer drei Spieler umgibt.
Dealer.java
public class Dealer {
private List<Player> players;
public Dealer() {
//Fügen Sie der Einfachheit halber 3 Personen in den Konstruktor ein
players = new ArrayList<>();
players.add(new Player("A"));
players.add(new Player("B"));
players.add(new Player("C"));
}
//Karten an Spieler austeilen (Ich frage mich, ob der Methodenname Deal ist)
public void deal() {
//Mische dein neues Deck
Deck deck = new Deck();
deck.shuffle();
//Verteile einen an jeden Spieler
for(Player player: players) {
Card card = deck.draw();
player.setCard(card);
}
}
An diesem Punkt müssen Sie nur noch das Ergebnis des Spiels beurteilen. Und wenn Sie sorgfältig darüber nachdenken, selbst wenn jeder Spieler das Ergebnis nicht anhand der Kartennummern aller anderen Spieler beurteilt, selbst wenn der Dealer anhand des Inhalts der Karten in der Reihenfolge von Herrn A das Ergebnis beurteilt Mir fällt auf, dass sich das nicht ändert. (Es ist total langweilig wie ein Spiel ...)
Dealer.java
public class Dealer {
//(Der obige Inhalt wird weggelassen)
//Genau genommen sollte diese Methode so konzipiert sein, dass sie erst aufgerufen werden kann, nachdem die Deal-Methode aufgerufen wurde.
public void judge() {
//Erstellen Sie in diesem Fall einen Prozess, um die Reihenfolge anhand der Karte von Herrn A zu beurteilen
int currentPlayerIndex = 0;
while(true) {
Player currentPlayer = players.get(currentPlayerIndex);
int currentPlayerNumber = player.getCard().getNumber();
//Eine spezifische Urteilsverarbeitung entfällt.
//(Wenn Sie ernsthaft darüber nachdenken, scheint es ein wenig seltsam, wenn es so gemacht wird,
//Es fühlt sich an, als müsste ich nur die Atmosphäre vermitteln. )
//Wenn Sie das Ergebnis kennen, können Sie den iterativen Prozess beenden (Bedingungsbeurteilungsvariablen sind angemessen).
if(result != UNKNOWN) {
break;
}
//Wenn Sie das Ergebnis nicht kennen, gehen Sie zum nächsten Spieler
currentPlayerIndex++;
currentPlayerIndex %= players.size();
}
}
}
Das ist ein Beispiel für die sogenannte "meine Gedanken" -Implementierung. Die heutige Wahrheit ist eine Lüge. Es tut uns leid. Abhängig von der Größe des Programmierziels und den Interessen denke ich über die Granularität der Klassenteilung nach und darüber, welche Methode jedes Mal in welcher Klasse implementiert werden soll. Wenn sich die Skala jedoch auf das gegebene Thema bezieht, denke ich wie oben Ich werde.
Indem ich über verschiedene Dinge in meinem Kopf nachdachte und sie in Form von Artikeln ausgab, konnte ich ein gewisses Bewusstsein in mir gewinnen, so dass ich mein Verständnis der Objektorientierung ein wenig vertieft habe. Ich denke nicht, dass dies die richtige Antwort ist, aber ich hoffe, dass es Ihnen als eine der Ideen hilfreich sein wird.
Recommended Posts