Quelle est la différence entre une fonction et une méthode? J'ai entendu l'histoire. J'ai donc décidé de reconfirmer ma reconnaissance et de l'écrire. J'espère également que cela sera utile pour ceux qui viennent de commencer le développement du système et ne sont pas familiers avec ce domaine. Pourquoi Java? La raison en est qu'il semble qu'il y ait de nombreux utilisateurs, et comme je l'expliquerai plus tard, il est difficile de faire la distinction entre les éléments fonctionnels car ils seront basés sur le mécanisme de la méthode.
Réflexion sur la définition d'une fonction "Reçoit une valeur (argument) et renvoie la valeur du résultat (valeur de retour), traitement du catalogue" Je pense que ce sera le cas. Et quand il s'agit d'une fonction plus pure, les conditions suivantes se présentent. -Il n'est affecté par rien d'autre que l'argument. -Ne faites aucun travail autre que de renvoyer une valeur. -Si les arguments sont les mêmes, le même résultat sera renvoyé quel que soit le nombre d'exécutions. C'est un concept dont on dit qu'il n'a pas d'effets secondaires ni de transparence de référence.
En d'autres termes, le modèle suivant n'est pas une fonction pure. ** - Obtenir et utiliser l'heure actuelle avec la date, le calendrier, la date locale, etc. ** → Les résultats varient en fonction du temps d'exécution ** - Obtenir des valeurs à partir de fichiers et de bases de données et utiliser ** → Si le contenu acquis a changé il y a quelque temps, le résultat sera différent. ** - Mise à jour des fichiers et de la base de données ** → Faire un travail autre que renvoyer des valeurs (provoquant des effets secondaires) ** ・ Quelque chose est généré par System.out.println etc. ** → La sortie standard est également un type d'effet secondaire ** - Accéder à un champ dans la classe ** → Changer la valeur du champ est un effet secondaire, et changer la valeur du champ changera le résultat.
C'est aussi une sensation subtile, mais c'est aussi un effet secondaire.
final public void someMethod(final List<String> list, final String text){
list.add(text); //Affecte la liste des appelants
}
D'un autre côté, des choses comme ↓ peuvent être appelées purement des fonctions.
final public String twice(final String text){
return text + text; // text ==Si c'est nul, n'y pense pas maintenant
}
Peu importe le nombre de fois que vous l'appelez, le même résultat sera renvoyé si les chaînes d'arguments sont les mêmes.
En Java, il n'est pas possible de placer un catalogue de ces traitements en dehors de la classe. Par conséquent, la fonction est exprimée en utilisant la méthode décrite ci-dessus. (Pour Java 8 ou version ultérieure, il existe un moyen de créer une implémentation d'une interface fonctionnelle, mais sans cela)
Jusqu'à présent, nous avons considéré ce qu'est une fonction, en particulier une fonction pure. Et en Java, ces «méthodes fonctionnelles» sont utilisées comme des fonctions. Les méthodes fonctionnelles appartiennent à une classe, mais elles sont fonctionnelles et n'interfèrent pas avec les champs de cette classe. Le même résultat (ABCABC) est émis pour les 1ère, 2ème, 2ème et 3ème fois du traitement suivant.
final public class Sample {
public static void main(String args[]){
//Première fois
final TextSomething obj1 = new TextSomething();
System.out.println(obj1.twice("ABC"));
//Deuxième fois
final TextSomething obj2 = new TextSomething();
System.out.println(obj2.twice("ABC"));
//Deuxième fois'
System.out.println(obj2.twice("ABC"));
//Troisième fois
final TextSomething obj3 = new TextSomething();
System.out.println(obj3.twice("ABC"));
}
}
final public class TextSomething {
//Méthode fonctionnelle
final public String twice(final String text){
return text + text;
}
}
Cependant, si vous y réfléchissez, deux fois peuvent être appelés depuis n'importe quelle instance de obj1, obj2, obj3 autant de fois que nécessaire. Il renvoie le même résultat quel que soit l'état de ses données internes. Si c'est le cas, vous ne vous souciez pas de créer une nouvelle instance pour l'utiliser. Alors déclarez statiquement une méthode fonctionnelle. Et des classes sont souvent créées pour consolider des lignes similaires de méthodes fonctionnelles et statiques. C'est ce qu'on appelle la ** classe utilitaire **.
final public class TextUtil {
final public static String twice(final String text){
return text + text;
}
final public static String twice2(final String text){
return text.toUpperCase() + text.toLowerCase();
}
}
final public class Sample2 {
public static void main(String args[]){
System.out.println(TextUtil.twice("aBc")); // aBcaBc
System.out.println(TextUtil.twice2("aBc")); // ABCabc
}
}
S'il s'agit d'une méthode statique, l'accès aux variables de champ dans la classe entraînera une erreur de compilation et sera impossible.
Les méthodes sont souvent appelées «comportement de classe». Cependant, je pense personnellement que cette expression est subtile. Le comportement de classe d'expression est une perspective de classe. La classe A peut faire ceci et cela, la classe B peut faire ceci et cela ... Cela ressemble à une classe anthropomorphique, mais nous ne sommes pas une classe. Développement de système Nous sommes des programmeurs permanents qui utilisent des classes pour faire progresser le développement. Le mot méthode est également une traduction littérale de «méthode», il est donc plus facile de considérer cela comme ** «comment manipuler les classes». La méthode est ** "Système d'exploitation objet (instance)" **. Ce que vous faites, ce sont essentiellement les variables de champ de l'instance. Par exemple, il existe une méthode comme celle-ci qui manipule les variables déclarées comme privées.
final public class DataClass {
private Integer bet;
//Opération pour obtenir la valeur du pari variable
final public Integer getBet() {
return bet;
}
//Opération pour changer la valeur du pari variable
final public void setBet(Integer bet) {
this.bet = bet;
}
}
Getters et setters, soi-disant méthodes d'accesseur. Il peut y avoir d'autres méthodes qui multiplient la valeur de la mise par 10 ou la divisent par deux. Selon la classe, les paramètres de connexion à la base de données (nom du serveur, nom d'utilisateur, mot de passe, etc.) sont transmis par les setters. Vous pouvez avoir une méthode appelée public void dbConnect () qui établit une connexion à la base de données sur la base de ces informations et conserve l'état de la connexion en tant que données internes.
Donc, pour une fonction pure, quand on pense à une "méthode pure", cela semble être une catastrophe du traitement qui affecte ou est donné à l'état de l'instance.
Maintenant, si la forme originale des méthodes orientées objet de Java est le système d'exploitation des objets, Une méthode statique fonctionnelle sans effets secondaires est-elle une méthode correcte? En premier lieu, la classe d'utilité qui n'a que des méthodes statiques et qui n'a donc pas de champs (états) (ce n'est pas nouveau) est-elle correcte en premier lieu en termes d'orientation d'objet? C'est une histoire gênante sur l'orientation objet, donc je vais la laisser de côté, mais si vous refaites la classe utilitaire plus tôt dans une orientation objet (fonctionnelle → méthode originale), cela ressemblera à ceci. Je n'écris généralement pas de cette façon, il est donc délicat de savoir si cela va. Et ça?
final public class TextObject {
private String text;
final public void setText(String text){
this.text = text;
}
final public String twice(){
return text + text;
}
final public String twice2(){
return text.toUpperCase() + text.toLowerCase();
}
}
final public class Sample3 {
public static void main(String args[]){
final TextObject obj = new TextObject();
obj.setText("aBc");
System.out.println(obj.twice()); // aBcaBc
System.out.println(obj.twice2()); // ABCabc
}
}
Eh bien, personnellement, je pense que c'est plus rapide d'écrire en utilisant des classes utilitaires (en Java). La théorie de ce qui est mieux n'est pas le sujet principal, alors laissons-la ...
** Qu'est-ce qu'une méthode ** Changer l'état interne d'un objet et récupérer l'état interne ** "Comment faire fonctionner un objet" **. L'état interne est à peu près la valeur d'une variable d'un objet (instance). (Ou quelque chose qui déclenche des fonctions telles que la sortie dans un fichier et la mise à jour dans la base de données)
** Qu'est-ce qu'une fonction ** ** "Un processus qui prend un ou plusieurs arguments et renvoie le résultat d'un calcul comme valeur de retour" **. En Java, les fonctions sont écrites en fonction du mécanisme des méthodes.
Recommended Posts