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.
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éthode
Friend (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.
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 **.
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é.
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