[JAVA] J'ai essayé d'approfondir ma compréhension de l'orientation des objets de n%

introduction

[Article qui comprend 5000% de l'orientation objet (pratique)](/ gorillab / items / fab2a6637f681221f687 ) C'était très intéressant, donc je voulais le mettre en pratique, alors je l'ai posté pour la première fois.

Ma propre façon de penser l'orientation objet

Je pense au mot objet orienté objet comme un objet au sens du synonyme de sujet, c'est-à-dire un objet / cible.

Cependant, pour ceux qui ne sont pas orientés objet, j'explique souvent que «les objets sont des« choses »». Cependant, on l'appelle "chose" au lieu de "chose". Ce n'est pas limité à l'existence physique, mais cela peut aussi être un concept abstrait, alors j'explique souvent que c'est assez difficile.

Des excuses à l'avance

Je suis désolé pour ma commodité, mais l'exemple d'implémentation est écrit en Java, que j'ai l'habitude d'écrire. Je n'ai pas d'environnement pour passer le compilateur sous la main, donc s'il y a une erreur, je la corrigerai plus tard. Je n'ai pas écrit Javadoc non plus. Nous nous excusons à l'avance.

Essayez de pratiquer

Sur la base de ce qui précède, abordons le problème.

Je suis désolé pour le texte intégral du problème, mais veuillez vous référer à l'article source. Le contenu est que trois joueurs A à C jouent à un jeu comme le poker indien en utilisant les cartes 1 à 5.

Avant de laver la classe

Je pense que c'est une approche simple pour imaginer une scène où vous jouez à ce jeu dans le monde réel et identifiez la classe à partir de là. Cependant, dans mon sens, le monde réel est un peu lourd.

Ce que je veux dire, c'est que lorsque vous regardez cette question, il est probablement naturel de penser à «trois» comme les personnages. Cependant, à proprement parler, outre le joueur, «la personne qui gère la progression du jeu» et «la personne qui juge si la réponse est correcte» devraient également être nécessaires. (En premier lieu, ce n'est peut-être pas une «personne».) Malheureusement, je ne pense pas que de telles personnes soient généralement disponibles dans le monde réel. Chaque joueur gérera la progression et jugera l'exactitude de la réponse.

Dans le monde de la programmation, on peut penser aux choses sans être lié par les contraintes de la réalité réelle, donc je pense qu'il serait plus heureux de penser un peu plus à un monde idéal qu'au monde réel.

Tout en identifiant la classe, ajoutez la condition et le comportement de temps en temps

Tout d'abord, vous avez besoin d'un joueur et d'une carte.

Assurez-vous que le joueur a un nom. De plus, chaque joueur a une carte, alors préparez un terrain et un getter / setter.

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;
  }
}

Le numéro sur la carte ne changera pas une fois que vous l'avez décidé en premier, alors définissez-le dans le constructeur et ne préparez que le getter. En faisant cela, il devient un objet dit immuable.

Card.java


public class Card {
  private int number;

  public Card(int number) {
    this.number = number;
  }

  public int getNumber() {
    return number;
  }
}

Ensuite, nous représenterons le jeu de cartes dans une autre classe appelée "Deck". Bien sûr, cela peut être exprimé comme une simple liste de Cartes, mais puisque l'acte de "mélanger et dessiner une à une par le haut" est imaginé, il devrait être commode d'extraire le "concept de deck" en tant que classe. est.

Deck.java


public class Deck {
  private List<Card> cards;

  public Deck() {
    //Pour plus de simplicité, créez un jeu de 1 à 5 cartes dans le constructeur.
    cards = new ArrayList<>();
    for(int i = 0; i < 5; i++) {
      cards.add(new Card(i + 1));
    }
  }

  public void shuffle() {
    //Mélangé avec l'API Collection pour plus de simplicité
    Collections.shuffle(cards);
    //Si vous le souhaitez, vous pouvez mettre en œuvre un mélange de fusils à pompe, etc.
  }

  //Mon tour! Si vous appelez cette méthode, vous pouvez tirer une carte du haut
  public Card draw() {
    return cards.remove(0);
  }
}

Ensuite, introduisons "la personne qui gère la progression du jeu". Cette personne distribuera des cartes à tous les joueurs et laissera M. A répondre dans l'ordre. Le nom de la classe semble être meilleur, mais j'imaginerai quelque chose comme une table de casino et la laisserai comme croupier. Continuez avec l'image que le revendeur entoure trois joueurs.

Dealer.java


public class Dealer {
  private List<Player> players;

  public Dealer() {
    //Pour plus de simplicité, enfermez 3 personnes dans le constructeur
    players = new ArrayList<>();
    players.add(new Player("A"));
    players.add(new Player("B"));
    players.add(new Player("C"));
  }

  //Distribuez des cartes aux joueurs (je me demande si le nom de la méthode est deal)
  public void deal() {
    //Mélangez votre nouveau deck
    Deck deck = new Deck();
    deck.shuffle();

    //Distribuez-en un à chaque joueur
    for(Player player: players) {
      Card card = deck.draw();
      player.setCard(card);
    }
  }

À ce stade, tout ce que vous avez à faire est de juger du résultat du jeu. Et si vous y réfléchissez bien, même si chaque joueur ne juge pas le résultat en regardant les numéros des cartes de tous les autres joueurs, même si le croupier juge en regardant le contenu des cartes dans l'ordre de M. A, le résultat Vous remarquerez que cela ne change pas. (Ce n'est pas de très bon goût comme jeu ...)

Dealer.java


public class Dealer {
  //(Le contenu ci-dessus est omis)

  //À proprement parler, cette méthode doit être conçue de manière à ne pouvoir être appelée qu'après l'appel de la méthode deal.
  public void judge() {
    //En cela, créez un processus pour juger dans l'ordre à partir de la carte de M. A
    int currentPlayerIndex = 0;
    while(true) {
       Player currentPlayer = players.get(currentPlayerIndex);
       int currentPlayerNumber = player.getCard().getNumber();
       //Le traitement de jugement spécifique est omis.
       //(Sérieusement, cela semble un peu étrange de faire ça, mais
       //J'ai l'impression que je n'ai besoin que de transmettre l'atmosphère. )
       
       //Si vous connaissez le résultat, vous pouvez quitter le processus itératif (les variables de jugement de condition sont appropriées)
       if(result != UNKNOWN) {
          break;
       }

       //Si vous ne connaissez pas le résultat, passez au joueur suivant
       currentPlayerIndex++;
       currentPlayerIndex %= players.size();
    }
  }
}

C'est un exemple de la soi-disant mise en œuvre «mes pensées». La vérité d'aujourd'hui est un mensonge. Pardon. En fonction de l'échelle de la cible de programmation et des intérêts, je pense à la granularité de la division de classe et à la méthode à mettre en œuvre dans quelle classe à chaque fois, mais si l'échelle concerne le sujet donné, pensez comme ci-dessus. Je vais.

en conclusion

En pensant à diverses choses dans mon esprit et en les produisant sous forme d'articles, j'ai pu prendre conscience de moi-même, donc je pense que ma compréhension de l'orientation des objets s'est un peu approfondie. Je ne pense pas que ce soit la bonne réponse, mais j'espère que cela vous sera utile en tant que l'une des idées.

Recommended Posts

J'ai essayé d'approfondir ma compréhension de l'orientation des objets de n%
J'ai essayé de résumer l'orientation de l'objet à ma manière.
[Mémo personnel] J'ai essayé d'étudier légèrement l'orientation des objets
J'ai essayé de créer une classe parent d'objet de valeur dans Ruby
C # (base de l'encapsulation)
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de vérifier ceci et celui de Spring @ Transactional
J'ai brièvement résumé la grammaire de base de Ruby
J'ai essayé de construire l'environnement petit à petit en utilisant docker
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai créé un client RESAS-API en Java
L'illusion de l'orientation objet
J'ai essayé de vérifier yum-cron
J'ai essayé de me permettre de définir le délai pour le client Android UDP
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
Résumé des résultats de la recherche sur l'orientation des objets [mis à jour de temps à autre]
Je veux limiter l'entrée en réduisant la plage de nombres
J'ai essayé de vérifier le fonctionnement du serveur gRPC avec grpcurl
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de résoudre le problème de Google Tech Dev Guide
En vérifiant le fonctionnement de Java sous Linux, j'ai pu comprendre la compilation et la hiérarchie.
J'ai essayé de résumer le support d'iOS 14
J'ai essayé d'interagir avec Java
J'ai essayé d'expliquer la méthode
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
C # (polymorphisme: polymorphisme)
J'ai essayé d'expliquer Active Hash
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé de connecter le compteur de points à la plate-forme MZ par communication série
J'ai essayé de résumer les points clés de la conception et du développement de gRPC
J'ai essayé de créer mon propre guide de transfert en utilisant OpenTrip Planner et GTFS
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH