[JAVA] Qu'est-ce que l'orientation objet après tout?

Dans ce qui suit, Qu'est-ce que l'orientation objet après tout ou une seule chose à laquelle il faut faire attention en programmation À propos de la partie qui n'a pas pu être décrite en détail en raison d'explications Supplément.

Qu'est-ce que l'orientation objet exactement?

J'ai l'impression que l'ordre est inversé, mais pour ceux qui sont novices en «orienté objet», je vais donner un exemple concret et obtenir une image. Le langage est Java, mais je l'écris pour pouvoir le comprendre sans connaître Java. Orienté objet est la programmation de données et de méthodes associées (en termes réels) dans une ** classe **. Par exemple, envisagez la classe «amis» suivante pour gérer les informations de vos amis.

Friend.java


public class Friend {
	private String name;//Nom
	private String phoneNumber;//numéro de téléphone
	private String mailAddress;//adresse mail

	public Friend(String name, String phoneNumber, String mailAddress) {
		//cela signifie lui-même
		this.name = name;
		this.phoneNumber = phoneNumber;
		this.mailAddress = mailAddress;
	}
	
	/**Contacts de sortie*/
	public void outputContact(){
		System.out.println(name);
		System.out.println("numéro de téléphone:"+phoneNumber);
		System.out.println("Email:"+mailAddress);
	}
}

Cette classe a trois ** champs **, name, phoneNumber et mailAddress, et il y a une ** method ** ʻoutputContact ()qui les utilise. La méthodeFriend (String name, String phoneNumber, String mailAddress)` avec le même nom que le nom de la classe est appelée ** Constructor ** et est utilisée comme suit.

Friend tanaka = new Friend("Ichiro Tanaka", "03-444-444", "[email protected]");

Comme vous pouvez le voir dans le constructeur Friend, ce code définit «Ichiro Tanaka» dans le champ «name», «03-444-444» dans le champ «phoneNumber» et «[email protected]» dans le champ «mailAddress». Je suis. Et lorsque vous appelez la méthode comme ci-dessous, le contact sera affiché.

tanaka.outputContact();
/*
Ichiro Tanaka
Numéro de téléphone: 03-444-444
Courriel: [email protected]
*/

De cette façon, la classe définit «quelles informations elle doit avoir» (ici, nom, numéro de téléphone et adresse e-mail) et «quelle fonction elle a» (ici, sortie de contact) * * Dans le dessin de conception **, le constructeur est appelé avec new et les données sont en fait placées et matérialisées, ce qui est appelé ** instance **. L'un des avantages de la création d'une classe comme celle-ci est que vous pouvez créer un certain nombre de données et de fonctions ensemble. Si vous n'utilisez pas la classe, vous vous retrouverez avec ce code si vous avez beaucoup d'amis.

String tanakaName = "Ichiro Tanaka";
String tanakaPhoneNumber = "03-444-444";
String tanakaMailAddress = "[email protected]";
String yamadaName = "Yamada Taro";
String yamadaPhoneNumber = "03-555-555";
String yamadaMailAddress = "[email protected]";
String suzukiName = "Hanako Suzuki";
String suzukiPhoneNumber = "03-666-666";
String suzukiMailAddress = "[email protected]";
//Suite ci-dessous...

System.out.println(tanakaName);
System.out.println("numéro de téléphone:"+tanakaPhoneNumber);      
System.out.println("Email:"+tanakaMailAddress);
System.out.println(yamadaName);
System.out.println("numéro de téléphone:"+yamadaPhoneNumber);      
System.out.println("Email:"+yamadaMailAddress);
System.out.println(suzukiName);
System.out.println("numéro de téléphone:"+suzukiPhoneNumber);     
System.out.println("Email:"+suzukiMailAddress);
//Suite ci-dessous...

C'est déroutant et gênant.

Friend tanaka = new Friend("Ichiro Tanaka", "03-444-444", "[email protected]");
Friend yamada = new Friend("Yamada Taro", "03-555-555", "[email protected]");
Friend suzuki = new Friend("Hanako Suzuki", "03-666-666", "[email protected]");
//Suite ci-dessous...
tanaka.outputContact();
yamada.outputContact();
suzuki.outputContact();
//Suite ci-dessous...

Ce sera rafraîchissant si vous écrivez. Au fait, en regardant les champs et méthodes ci-dessus, les champs tels que name sont ** private **, et la méthode ʻoutputContact ()` est ** public **. Ceux-ci sont appelés ** modificateurs **, ce qui signifie privé signifie «privé» et ne peut être accédé qu'à partir de la classe, et public signifie «public» et est accessible de l'extérieur.

System.out.println(tanaka.name);//Erreur car il est privé
tanaka.outputContact();//Puisqu'il est public, il peut être exécuté.

Veuillez voir Main part pour savoir pourquoi un tel modificateur existe.

Interface

La classe ci-dessus a écrit "un dessin de conception qui définit quelles informations il devrait avoir et quelles fonctionnalités il a", mais ** interface ** dit "quelle fonctionnalité il devrait avoir". C'est une sorte de classe abstraite qui ne définit que "ka". Par exemple, supposons que vous souhaitiez gérer les données de vos collègues ainsi que de vos amis. Mais dans les deux cas, si vous pensez qu'il devrait y avoir une méthode de sortie de contact, créez une interface comme celle-ci:

Human.java


public interface Human {
	/**Contacts de sortie*/
    public void outputContact();    
}

Cela signifie que "" Humain "doit avoir une méthode de sortie par contact". L'implémentation est effectuée dans des classes ** héritées ** à l'aide du mot clé ** implements **, car l'interface définit uniquement les méthodes qui devraient être.

public class Friend implements Human{
	...//(Omis)
    @Override
    public void outputContact(){
		System.out.println(name);
        System.out.println("numéro de téléphone:"+phoneNumber);
        System.out.println("Email:"+mailAddress);
    }
}
/**Collègue*/
public class Colleague implements Human{
	...//(Omis)
    @Override
    public void outputContact(){
        //(Traitement du contenu)
    }
}

L'héritage et l'écrasement d'une méthode s'appelle ** Override **.

modificateur final

Java final est un modificateur qui signifie "c'est ça, c'est une règle". Les variables avec cela ne peuvent pas être modifiées une fois la valeur entrée.

final int CONST_VARIABLE = 100;
CONST_VARIABLE = 50;//Erreur car j'ai essayé de changer la valeur même si c'était définitif

Les variables dont les valeurs ne peuvent pas être modifiées de cette manière sont appelées "constantes". Il est habituel de nommer avec des lettres majuscules et "_" (trait de soulignement). Alors pourquoi avons-nous besoin de créer des «variables» dont les valeurs ne peuvent pas être modifiées? C'est pour rendre le code facile à comprendre. Par exemple, supposons que vous ayez le code suivant.

double price = 100 * 1.08;

À compter de novembre 2017, vous savez peut-être que vous multipliez le taux de taxe à la consommation, mais ceux qui liront ce code après les modifications futures du taux de taxe à la consommation ne comprendront peut-être pas pourquoi il est multiplié par 1,08. Mais qu'en est-il du code comme celui-ci:

final double CONSUMPTION_TAX_RATE = 0.08;//taux de taxe de vente
double price = 100 * (1 + CONSUMPTION_TAX_RATE);

Dans ce cas, vous pouvez voir que la partie ".08" signifie le taux de taxe à la consommation, donc ce sera un code qui peut être compris et modifié par les futurs personnes dont le taux de taxe à la consommation a changé.

modificateur statique

Java statique signifie «statique». Cela signifie qu'il n'est pas différent pour chaque instance générée «dynamiquement» (à l'opposé de «statique») dans new comme le champ «name» de la classe «Friend» ci-dessus, mais est commun à toutes les classes. Je vais. Par exemple, si la classe Friend a le code suivant,

public class Friend {
    public static int hoge = 10;
    public static int fuga(){
        return 20;
    }
	//(Omis ci-dessous)
}

Comme indiqué ci-dessous, il est commun à toutes les classes et peut être utilisé sans nouveau (instanciation).

Friend yamada = new Friend("Yamada Taro", "03-555-555", "[email protected]");
Friend suzuki = new Friend("Hanako Suzuki", "03-666-666", "[email protected]");

//Commun même si l'instance est différente
yamada.hoge = 30;
System.out.println(yamada.hoge);//30
System.out.println(suzuki.hoge);//30

//Peut être utilisé sans créer d'instance en premier lieu
System.out.println(Friend.hoge);//30
System.out.println(Friend.fuga());//20

Cependant, il vaut mieux éviter d'utiliser le champ statique sans la finale ci-dessus. Comme je l'ai écrit dans Main part, l'orientation objet a l'avantage de pouvoir être utilisée sans connaître l'intérieur de la classe. Par exemple, si Friend tanaka = new Friend (" Ichiro Tanaka "," 03-444-444 "," [email protected] ");, les données données explicitement ("Ichiro Tanaka", "03-444-444") "," [email protected] ") et le code est écrit en supposant qu'il ne contient que les données traitées. Cependant, la présence d'un champ statique peut être réécrite dans un emplacement complètement différent et se comporter différemment que prévu, annulant les avantages orientés objet. D'autre part, si possible, la méthode doit être statique autant que possible. Par exemple, une méthode pour vérifier si le numéro de téléphone est au format correct ("xxx-xxxx-xxxx" (une série de nombres et de tirets)) avec Expression régulière Si tel est le cas, il sera entendu que le rendre statique "ne dépend pas d'une personne (instance) spécifique", donc cela ne crée pas de confusion inutile.

public class Friend {
	...//(Omis)
    public static boolean isValidPhoneNumber(String phoneNumber){
        Pattern p = Pattern.compile("^[0-9]+-[0-9]+-[0-9]+$");
        Matcher m = p.matcher(phoneNumber);
        return m.matches();
    }
}
System.out.println(Friend.isValidPhoneNumber("03-444-444"));//Vrai pour un format correct
System.out.println(Friend.isValidPhoneNumber("03-44a-444"));//Faux en raison d'une erreur de saisie

De plus, bien que j'aie écrit ci-dessus que les champs statiques non finaux ne devraient pas être utilisés, il devrait être recommandé de définir les constantes communes de classe en statique final car il est facile à comprendre.

public class Friend {
	...//(Omis)
    /**Format du numéro de téléphone*/
    private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile("^[0-9]+-[0-9]+-[0-9]+$");
    
    public static boolean isValidPhoneNumber(String phoneNumber){
        Matcher m = PHONE_NUMBER_PATTERN.matcher(phoneNumber);
        return m.matches();
    }
}

Recommended Posts

Qu'est-ce que l'orientation objet après tout?
Qu'est-ce que l'orientation objet après tout?
Après tout, que fait [rails db: migrate]?
Qu'est-ce que Cubby
Qu'est-ce qui est nul? ]
Qu'est-ce que 'java
Qu'est-ce que Keycloak
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que la façade? ??
Qu'est-ce que l'orientation objet après tout ou juste une chose à surveiller dans la programmation
Qu'est-ce que Java <>?
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que 'java
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que l'assemblage Maven?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce qu'un initialiseur?
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'un opérateur?
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
Qu'est-ce que l'audit JPA?
[Java] Qu'est-ce que flatMap?
Qu'est-ce qu'un servlet?
Qu'est-ce que le développement Web?
[Java] Qu'est-ce que ArrayList?