Java Beginner Escape Boot Camp Partie 2 Comprendre les classes Java et l'encapsulation

À propos de cette fois

Dans cet article, vous découvrirez les «classes», qui sont à la base des langages de programmation basés sur la pensée objet.

Qu'est-ce qu'une "classe" Java?

D'abord, avant le cours

"Qu'est-ce qui est orienté objet ???"

Commençons par ce que cela signifie.

Origine de la pensée objet

La chose la plus importante dans l'idée de la pensée objet est le ** "rôle" **.

Du point de vue de l'utilisateur, un programme fonctionne comme un seul.

Par exemple, un jeu sur smartphone auquel vous jouez souvent peut être réalisé avec une seule icône. Il existe de nombreux programmes exécutés dans les coulisses.

Par exemple, dans un jeu de rythme

Donc, il y a plusieurs éléments.

Bien sûr, vous pouvez mettre tout cela dans un seul fichier et poursuivre le programme, Je pense que vous pouvez rapidement comprendre qu'une telle chose serait difficile.

La pensée objet vise à séparer ces éléments par «rôle».

Pratique en séparant les rôles

Le principal avantage de la séparation des classes par rôle est qu'elles sont «plus faciles à comprendre».

Supposons que vous divisez les classes liées à la progression du jeu comme suit.

Par exemple, supposons que les modifications de spécification suivantes se produisent.

Changement de la vitesse de récupération de l'endurance de "1 jauge en 10 minutes" à "1 jauge en 5 minutes"

Où dois-je le réparer dans un tel cas?

La réponse est simple, ** «gestion de l'endurance» **.

De cette façon, en laissant tout le traitement lié à l'endurance à la classe de gestion de l'endurance, Ce sera très facile à comprendre lors de la modification.

Voici un exemple de cours de gestion de l'endurance.


gestion de l'endurance en classe publique{

endurance int privée;

privé long Temps de récupération le plus récent;

public int obtenir de l'endurance() {
    return this.Endurance actuelle; 
  }
  
contrôle de récupération public nul() {
    
    //Obtenir l'heure actuelle avec millSec
long temps actuel= new Date().getTime();

    //10 minutes= 10 * 60(sec) * 1000(millSec)
    if (Heure actuelle-Heure de récupération la plus récente> 10 * 60 * 1000) {
      //Rend 1 endurance
      this.Endurance actuelle++;

      //Mettre à jour la dernière heure de récupération à l'heure actuelle
      this.Heure de récupération la plus récente=Heure actuelle;
    }
  }
}

Maintenant, le point ici est la partie liée à la valeur numérique de l'endurance.

endurance int privée;

heure de récupération la plus récente de private int;

Cette variable déclarée à l'intérieur de la classe est appelée "valeur de champ" et fait référence à la variable qui peut être gérée dans la classe. En règle générale, les valeurs de champ déclarées ici sont accessibles de n'importe où dans la classe **.

Surtout dans le cas de Java, il est courant de rendre cette valeur de champ privée afin que la valeur ne puisse pas être modifiée directement de l'extérieur.

Getter

Maintenant, cette classe fournit la méthode suivante pour obtenir l'endurance actuelle.

public int obtenir de l'endurance() {
    return this.Endurance actuelle; 
  }

Une méthode qui vise à obtenir la valeur du flux de cette manière est appelée un "getter".

Seules les méthodes déclarées comme publiques peuvent être appelées depuis l'extérieur de la classe. En préparant un getter,

Vous pouvez le spécifier.

De cette façon, vous pouvez supprimer les mouvements involontaires en limitant intentionnellement les opérations sur les champs de la classe elle-même.

Changement supplémentaire de spécification du changement de spécification

Maintenant, rappelons le changement de spécification plus tôt.

Changement de la vitesse de récupération de l'endurance de "1 jauge en 10 minutes" à "1 jauge en 5 minutes"

Pour y parvenir, les parties suivantes doivent être modifiées.

    if (Heure actuelle-Heure de récupération la plus récente> 10 * 60 * 1000) {

Eh bien, quand j'ai pensé à le réparer en 5 minutes, on m'a dit quelque chose comme ça.

En gros 10 minutes, 1 jauge par minute ou 1 jauge en 5 minutes au moment de l'événement

Eh bien, dans ce cas, il ne suffit pas de réécrire.

Setter

Cela ne peut pas être aidé, alors changeons cette durée de récupération en une valeur de champ afin qu'elle puisse être réécrite de l'extérieur.


gestion de l'endurance en classe publique{

endurance int privée;

privé long Temps de récupération le plus récent;

longue durée de récupération privée;

public int obtenir de l'endurance() {
    return this.Endurance actuelle; 
  }

public void set durée de récupération(minutes de récupération int) {
    this.Durée de récupération=Minutes de récupération* 60 * 1000;
  }
  
contrôle de récupération public nul() {
    
    //Obtenir l'heure actuelle avec millSec
long temps actuel= new Date().getTime();

    //10 minutes= 10 * 60(sec) * 1000(millSec)
    if (Heure actuelle-Heure de récupération la plus récente> 10 * 60 * 1000) {
      //Rend 1 endurance
      this.Endurance actuelle++;

      //Mettre à jour la dernière heure de récupération à l'heure actuelle
      this.Heure de récupération la plus récente=Heure actuelle;
    }
  }
}

En passant, les méthodes suivantes sont présentées ici.

public void set durée de récupération(minutes de récupération int) {
    this.Durée de récupération=Minutes de récupération* 60 * 1000;
  }

Si vous souhaitez réduire le temps de récupération de l'endurance en raison d'un événement, etc., vous pouvez modifier le temps de récupération en appelant cette méthode.

Une méthode qui vise à réécrire les valeurs de champ de cette manière est appelée un "setter".

Encapsulation

De cette façon, en restreignant l'accès aux champs à l'aide de Getter et Setter, Vous pouvez éviter les mouvements et les appels inattendus.

Cela s'appelle ** «encapsulation» **.

Et si c'était une "ligne mondiale sans encapsulation"?

Que se passerait-il si nous vivions sur une ligne mondiale où l'encapsulation n'existait pas?

Si tous les champs sont facilement accessibles de l'extérieur, Le code source suivant sera intégré partout sur l'écran de jeu.

while(true) {
  //Exécuter toutes les 10 minutes
  Thread.sleep(10 * 60 * 1000);  
Gestion de l'endurance.endurance++;
}

Si cela fonctionne plusieurs fois, vous pouvez soudainement récupérer 2 endurance, ou il peut ne pas récupérer même après 10 minutes.

Si cela est encapsulé ...?

Et si cela est bien encapsulé?

while(true) {
  Thread.sleep(1000);  
La récupération de l'endurance.Contrôle de récupération();
}

Dans ce cas, le contrôle de récupération n'effectuera aucune récupération supplémentaire même s'il est appelé en continu.

En encapsulant l'endurance de cette manière, Ce sera un beau programme sans créer de bugs étranges.

Objectif de l'encapsulation

L'encapsulation clarifie les catégories gérées par la classe elle-même, Le but est de rendre l'appel plus facile à comprendre.

Ceci est un programme orienté objet

Par exemple, le rôle de cette classe de gestion de l'endurance est de "gérer l'endurance", donc Je ne veux pas laisser le comportement d'augmenter ou de diminuer l'endurance à d'autres classes.

Pour ce faire, interdisez l'accès direct aux informations d'endurance de l'extérieur, ** Je demande simplement "Hé, classe de gestion, quelle est votre endurance actuelle?" **.

La base de l'encapsulation est "simplifier les références externes".

Même si vous masquez le processus ou l'état Un code qui est compliqué à appeler ou qui ne fonctionne pas bien à moins que vous ne l'appeliez dans un certain ordre n'est pas un très bon code.

à la fin

Cette fois, j'ai expliqué l'encapsulation. En maîtrisant l'encapsulation, vous pouvez réduire le soi-disant «putain de code» qui crée de nombreux bogues.

C'est très important non seulement pour Java mais aussi pour la programmation de la pensée objet, donc Veuillez le porter correctement.

À propos, la plupart des Getters et Setters courants n'affectent et ne renvoient que des valeurs, donc On peut dire que l'utilisation de Setter introduit cette fois est un modèle très spécial.

Veuillez noter que dans certains cas, il peut être interdit de traiter le Getter ou le Setter.

Recommended Posts

Java Beginner Escape Boot Camp Partie 2 Comprendre les classes Java et l'encapsulation
Java Beginner Escape Boot Camp Partie 1 Structure et écriture des classes Java
java (classe et instance)
[Java] Classe générique et méthode générique
Java et Iterator Part 1 External Iterator Edition
Apache Hadoop et Java 9 (partie 1)
Méthodes et classes abstraites Java
Encapsulation Java et getters et setters
Différences entre Java "débutant" et Kotlin
[Java débutant] À propos de l'abstraction et de l'interface
[Java débutant] == opérateur et méthode equals
Comprendre equals et hashCode en Java
Java Generics (définit les classes et les méthodes)
Programmation Java (classes et instances, méthodes principales)
Cours et méthodes abstraits d'histoire d'apprentissage JAVA