Pensez aux différences entre les fonctions et les méthodes (en Java)

L'opportunité d'écrire cet article

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.

Tout d'abord, qu'est-ce qu'une fonction?

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)

Conduire à l'électricité statique

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.

Alors, quelle est la méthode originale?

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.

Est-ce que statique est orienté objet?

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 ...

Résumé

** 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

Pensez aux différences entre les fonctions et les méthodes (en Java)
Une note sur les différences entre les interfaces et les classes abstraites en Java
Différences entre les classes et les instances dans Ruby
À propos de la relation entre les méthodes HTTP, les actions et CRUD
Pensez au problème JAVA = JAVAscript (nécessaire à l'avenir)
Différences entre Java "débutant" et Kotlin
À propos des méthodes equals () et hashcode ()
Différences dans la gestion des chaînes entre Java et Perl
Différences entre Java et .NET Framework
J'ai essayé de comparer et de correspondre à des méthodes avec des fonctions similaires pour la différence entre le tableau Java et ArrayList.
À propos de la relation entre l'opérateur d'égalité de chaîne Java (==) et l'initialisation. Débutants
Différence entre final et immuable en Java
[Java] Différences entre les variables d'instance et les variables de classe
À propos de la différence entre irb et pry
Différence entre int et Integer en Java
Fonctions et méthodes
Interpréter la relation entre les méthodes Java et les arguments en formules biochimiques
Pensons à ce qu'est la programmation déclarative en Java et Elm (partie 1)
Comprendre la différence entre int et Integer et BigInteger en java et float et double
[Java] Comprendre la différence entre List et Set
Concernant les modificateurs transitoires et la sérialisation en Java
À propos de la confusion observée dans les serveurs Java de démarrage
Pensez à la combinaison de Servlet et Ajax
[Rails / Active Record] À propos de la différence entre créer et créer!
À propos de l'idée des classes anonymes en Java
Une histoire sur le JDK à l'ère de Java 11
[Comprendre] Différence entre le hachage et le tableau dans Ruby
Différences dans l'écriture des classes Java, C # et Javascript
Vérifier le comportement statique et public dans les méthodes Java
Distinguer les nombres positifs et négatifs en Java
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
Différence entre Java, C # et JavaScript (comment trouver le degré d'obésité)
Organisez la différence de confort d'écriture entre l'expression lambda Java et l'expression lambda Kotlin.
Fonctions Azure en Java
[Ruby] J'ai réfléchi à la différence entre each_with_index et each.with_index
[Rails] J'ai étudié la différence entre les ressources et les ressources
Écrivez ABNF en Java et transmettez l'adresse e-mail
[Java] Différence entre statique final et final dans les variables membres
Classes et instances Java comprises dans la figure
Différences entre Fetch Type LAZY et EAGER dans Hibernate
Différences de code lors de l'utilisation du système de longueur en Java
[Java] Remarque sur la différence entre le jugement d'équivalence et le jugement d'égalité lors de la comparaison de classes String
Voyons les différences entre les sous-chaînes Java et les sous-chaînes C #, et comment les porter.
[Java] La différence entre les méthodes Stream.of () et Arrays.stream () que vous ne connaissez pas de manière inattendue
Découvrez les spécifications tout en raccourcissant FizzBuzz écrit en Java
[Apprentissage Java Bronze] Différence entre l'encapsulation, le masquage des données et le masquage des informations
JSON en Java et Jackson Partie 1 Renvoyer JSON à partir du serveur
Différences entre l'espace de noms, le module, la portée et comme dans le routage Rails
[Java] Différence entre == et égal
Différence entre Java et JavaScript (comment trouver la moyenne)
[Java] Classe générique et méthode générique
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
[Java] À propos de String et StringBuilder
Créer des fonctions Azure en Java
À peu près la même et la même valeur