Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)

Die Gelegenheit, diesen Artikel zu schreiben

Was ist der Unterschied zwischen einer Funktion und einer Methode? Ich habe die Geschichte mitgehört. Also beschloss ich, meine Anerkennung erneut zu bestätigen und aufzuschreiben. Ich hoffe auch, dass es für diejenigen hilfreich sein wird, die gerade mit der Systementwicklung begonnen haben und mit diesem Bereich nicht vertraut sind. Warum Java? Das liegt daran, dass es anscheinend viele Benutzer gibt, und wie ich später erläutern werde, werden auch funktionsähnliche Dinge auf dem Mechanismus der Methode liegen, so dass ich dachte, es wäre schwierig zu unterscheiden.

Was ist eine Funktion?

Über die Definition einer Funktion nachdenken "Erhält einen Wert (Argument) und gibt den Ergebniswert (Rückgabewert) zurück, der den Katalog verarbeitet." Ich denke, das wird der Fall sein. Und wenn es um eine reinere Funktion geht, ergeben sich folgende Bedingungen. -Es wird von nichts anderem als dem Argument beeinflusst.

Mit anderen Worten, das folgende Muster ist keine reine Funktion. ** - Abrufen und Verwenden der aktuellen Uhrzeit mit Datum, Kalender, LocalDate usw. ** → Die Ergebnisse variieren je nach Ausführungszeit ** - Werte aus Dateien und DBs abrufen und verwenden ** → Wenn sich der erfasste Inhalt vor einiger Zeit geändert hat, ist das Ergebnis anders. ** - Aktualisieren von Dateien und DB ** → Andere Arbeiten ausführen als Werte zurückgeben (Nebenwirkungen verursachen) ** ・ Etwas wird von System.out.println usw. ausgegeben. ** → Standardausgabe ist auch eine Art Nebeneffekt ** - Zugriff auf ein Feld in der Klasse ** → Das Ändern des Feldwerts ist ein Nebeneffekt, und das Ändern des Feldwerts ändert das Ergebnis.

Es ist auch ein subtiles Gefühl, aber dies ist auch ein Nebeneffekt.

final public void someMethod(final List<String> list, final String text){
    list.add(text); //Beeinflusst die Anruferliste
}

Andererseits können Dinge wie ↓ als reine Funktionen bezeichnet werden.

final public String twice(final String text){
    return text + text; // text ==Wenn es null ist, denken Sie jetzt nicht darüber nach
}

Unabhängig davon, wie oft Sie es aufrufen, wird dasselbe Ergebnis zurückgegeben, wenn die Argumentzeichenfolgen identisch sind.

In Java ist es nicht möglich, einen Katalog einer solchen Verarbeitung außerhalb der Klasse zu platzieren. Daher wird die Funktion unter Verwendung des oben beschriebenen Verfahrens ausgedrückt. (Für Java 8 oder höher gibt es eine Möglichkeit, eine Implementierung einer funktionalen Schnittstelle zu erstellen, jedoch ohne diese)

Zu statischer Aufladung führen

Bisher haben wir uns überlegt, was eine Funktion ist, insbesondere eine reine Funktion. Und in Java werden solche "funktionalen Methoden" als Funktionen verwendet. Funktionale Methoden gehören zu einer Klasse, sind jedoch funktional und beeinträchtigen die Felder dieser Klasse nicht. Das gleiche Ergebnis (ABCABC) wird für das 1., 2., 2. und 3. Mal der folgenden Verarbeitung ausgegeben.

final public class Sample {
    public static void main(String args[]){
        //Erstes Mal
        final TextSomething obj1 = new TextSomething();
        System.out.println(obj1.twice("ABC"));

        //Zweites Mal
        final TextSomething obj2 = new TextSomething();
        System.out.println(obj2.twice("ABC"));
        //Zweites Mal'
        System.out.println(obj2.twice("ABC"));

        //Drittes Mal
        final TextSomething obj3 = new TextSomething();
        System.out.println(obj3.twice("ABC"));
    }
}

final public class TextSomething {
    //Funktionsmethode
    final public String twice(final String text){
        return text + text;
    }
}

Wenn Sie jedoch darüber nachdenken, können Sie zweimal von jeder Instanz von obj1, obj2, obj3 beliebig oft aufgerufen werden. Es gibt unabhängig von seinem internen Datenstatus das gleiche Ergebnis zurück. In diesem Fall müssen Sie keine neue Instanz erstellen, um sie zu verwenden. Deklarieren Sie also eine funktionale Methode statisch. Und es werden häufig Klassen erstellt, die ähnliche Linien funktionaler und statischer Methoden konsolidieren. Dies wird als ** Utility-Klasse ** bezeichnet.

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

Wenn es sich um eine statische Methode handelt, führt der Zugriff auf die Feldvariablen in der Klasse zu einem Kompilierungsfehler und ist nicht möglich.

Was ist die ursprüngliche Methode?

Methoden werden oft als "Klassenverhalten" bezeichnet. Ich persönlich halte diesen Ausdruck jedoch für subtil. Das Verhalten der Ausdrucksklasse ist eine Klassenperspektive. Klasse A kann dies und das, Klasse B kann dies und das ... Es fühlt sich an wie eine anthropomorphe Klasse, aber wir sind keine Klasse. Systementwicklung Wir sind stehende Programmierer, die Klassen verwenden, um die Entwicklung voranzutreiben. Das Wort Methode ist auch eine wörtliche Übersetzung von "Methode", daher ist es einfacher, sich dies als ** "wie man Klassen manipuliert" vorzustellen. Die Methode ist ** "Objekt (Instanz) Betriebssystem" **. Was Sie tun, sind im Grunde die Feldvariablen, die die Instanz hat. Beispielsweise gibt es eine solche Methode, mit der als privat deklarierte Variablen bearbeitet werden.

final public class DataClass {
	
    private Integer bet;

    //Operation, um den Wert der variablen Wette zu erhalten
    final public Integer getBet() {
        return bet;
    }
    //Operation zum Ändern des Werts der variablen Wette
    final public void setBet(Integer bet) {
        this.bet = bet;
    }
}

Getter und Setter, sogenannte Accessor-Methoden. Es kann andere Methoden geben, die den Einsatzwert mit 10 multiplizieren oder halbieren. Abhängig von der Klasse werden die Datenbankverbindungseinstellungen (Servername, Benutzername, Kennwort usw.) von Setzern übergeben. Möglicherweise verfügen Sie über eine Methode namens public void dbConnect (), die eine DB-Verbindung basierend auf diesen Informationen herstellt und den Verbindungsstatus als interne Daten enthält.

Wenn Sie also für eine reine Funktion an eine "reine Methode" denken, scheint sie ein Katalysator für die Verarbeitung zu sein, die den Status der Instanz beeinflusst oder ihm gegeben wird.

Ist statisch objektorientiert?

Wenn nun die ursprüngliche Form der objektorientierten Methoden von Java das Betriebssystem für Objekte ist, Ist eine funktionelle statische Methode ohne Nebenwirkungen eine korrekte Methode? Ist die Utility-Klasse, die nur statische Methoden und daher keine Felder (Zustände) hat (sie ist nicht neu), in erster Linie in Bezug auf die Objektorientierung korrekt? Dies ist eine problematische Geschichte über objektorientiert, daher lasse ich sie beiseite, aber wenn Sie die Utility-Klasse früher objektorientiert neu erstellen (funktionale → ursprüngliche Methode), sieht sie folgendermaßen aus. Normalerweise schreibe ich nicht auf diese Weise, daher ist es schwierig, ob dies in Ordnung ist. Wie wär es damit?

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

Ich persönlich denke, es ist schneller, mit Utility-Klassen (in Java) zu schreiben. Die Theorie, die besser ist, ist nicht das Hauptthema, also lassen wir es ...

Zusammenfassung

** Was ist eine Methode ** So ändern Sie den internen Status eines Objekts oder rufen den internen Status ab ** "So bedienen Sie ein Objekt" **. Der interne Zustand ist ungefähr der Wert einer Variablen eines Objekts (einer Instanz). (Oder etwas, das Funktionen wie die Ausgabe in eine Datei und die Aktualisierung auf DB entzündet)

** Was ist eine Funktion ** ** "Ein Prozess, der ein oder mehrere Argumente akzeptiert und das Ergebnis einer Berechnung als Rückgabewert zurückgibt" **. In Java werden Funktionen basierend auf dem Mechanismus von Methoden geschrieben.

Recommended Posts

Denken Sie über die Unterschiede zwischen Funktionen und Methoden nach (in Java)
Ein Hinweis zu den Unterschieden zwischen Schnittstellen und abstrakten Klassen in Java
Unterschiede zwischen Klassen und Instanzen in Ruby
Informationen zur Beziehung zwischen HTTP-Methoden, Aktionen und CRUD
Denken Sie an das JAVA = JAVAscript-Problem (wird in Zukunft benötigt).
Unterschiede zwischen "Anfänger" Java und Kotlin
Informationen zu den Methoden equals () und hashcode ()
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
Unterschiede zwischen Java und .NET Framework
Ich habe versucht, Methoden mit ähnlichen Funktionen für den Unterschied zwischen Java-Array und ArrayList zu vergleichen und ihnen zu entsprechen.
Informationen zur Beziehung zwischen dem Java String Equality Operator (==) und der Initialisierung. Anfänger
Unterschied zwischen final und Immutable in Java
[Java] Unterschiede zwischen Instanzvariablen und Klassenvariablen
Über den Unterschied zwischen irb und pry
Unterschied zwischen int und Integer in Java
Funktionen und Methoden
Interpretieren Sie die Beziehung zwischen Java-Methoden und Argumenten in biochemischen Formeln
Lassen Sie uns darüber nachdenken, was deklarative Programmierung in Java und Elm ist (Teil 1).
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[Java] Verstehe den Unterschied zwischen List und Set
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Über die Verwirrung beim Starten von Java-Servern
Denken Sie an die Kombination von Servlet und Ajax
[Rails / Active Record] Über den Unterschied zwischen create und create!
Über die Idee anonymer Klassen in Java
Eine Geschichte über das JDK in der Java 11-Ära
[Verständnis] Unterschied zwischen Hash und Array in Ruby
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Eindrücke und Zweifel an der erstmaligen Verwendung von Java in Android Studio
Unterschied zwischen Java, C # und JavaScript (wie man den Grad der Fettleibigkeit findet)
Organisieren Sie den Unterschied im Schreibkomfort zwischen dem Java-Lambda-Ausdruck und dem Kotlin-Lambda-Ausdruck.
Azure funktioniert in Java
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
In der Abbildung verstandene Java-Klassen und -Instanzen
Unterschiede zwischen Fetch Type LAZY und EAGER im Ruhezustand
Unterschiede im Code bei Verwendung des Längensystems in Java
[Java] Hinweis zum Unterschied zwischen Äquivalenzbeurteilung und Gleichheitsbeurteilung beim Vergleich von String-Klassen
Lassen Sie uns die Unterschiede zwischen Java-Teilzeichenfolgen und C # -Substrings und deren Portierung untersuchen.
[Java] Der Unterschied zwischen den Methoden Stream.of () und Arrays.stream (), den Sie nicht unerwartet kennen
Erfahren Sie mehr über Spezifikationen, während Sie FizzBuzz verkürzen, das in Java geschrieben wurde
[Java Bronze-Lernen] Unterschied zwischen Kapselung, Ausblenden von Daten und Ausblenden von Informationen
JSON in Java und Jackson Teil 1 Gibt JSON vom Server zurück
Unterschiede zwischen Namespace, Modul, Bereich und wie beim Rails-Routing
[Java] Unterschied zwischen == und gleich
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Java] Generics-Klasse und Generics-Methode
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
[Java] Über String und StringBuilder
Erstellen Sie Azure-Funktionen in Java
Ungefähr der gleiche und der gleiche Wert