[JAVA] Ich habe versucht, mein Verständnis der Objektorientierung um n% zu vertiefen

Einführung

[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.

Meine eigene Art, über Objektorientierung nachzudenken

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.

Entschuldigung im Voraus

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.

Versuche zu üben

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.

Vor dem Auswaschen der Klasse

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.

Fügen Sie bei der Identifizierung der Klasse von Zeit zu Zeit die Bedingung und das Verhalten hinzu

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.

abschließend

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

Ich habe versucht, mein Verständnis der Objektorientierung um n% zu vertiefen
Ich habe versucht, die Objektorientierung auf meine Weise zusammenzufassen.
[Persönliches Memo] Ich habe versucht, die Objektorientierung leicht zu studieren
Ich habe versucht, ein übergeordnetes Wertklasseobjekt in Ruby zu erstellen
C # (Grund der Kapselung)
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich habe versucht, dies und das von Spring @ Transactional zu überprüfen
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe einen RESAS-API-Client in Java erstellt
Die Illusion der Objektorientierung
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, mir zu erlauben, die Verzögerung für den Android UDP-Client einzustellen
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Zusammenfassung der Forschungsergebnisse zur Objektorientierung [Von Zeit zu Zeit aktualisiert]
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, das Problem des Google Tech Dev Guide zu lösen
Durch die Überprüfung der Funktionsweise von Java unter Linux konnte ich die Kompilierung und Hierarchie verstehen.
Ich habe versucht, die Unterstützung für iOS 14 zusammenzufassen
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Methode zu erklären
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe jetzt versucht, Java 8 zusammenzufassen
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, Active Hash zu erklären
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, den Punktzähler durch serielle Kommunikation mit der MZ-Plattform zu verbinden
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Ich habe versucht, den CPU-Kern mit Ruby voll auszunutzen
Ich habe versucht, den Zugriff von Lambda → Athena mit AWS X-Ray zu visualisieren
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen