Mit welchem ​​Begriff wird eine Funktion / Methode beschrieben, die das aufgerufene Objekt ändert?


12

Entschuldigung für die generische Frage. Ich habe überall gesucht und so viele ähnliche Themen gefunden, aber keine, die meine spezifische Frage beantworten - vielleicht, weil der gesuchte Begriff nicht einmal existiert.

Ein Freund von mir lernt gerade Programmieren, speziell JavaScript, und er hat mich gefragt, warum das nicht funktioniert hat:

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

Der Grund dafür ist, dass replacekeine Änderungen vorgenommen werden a, da Zeichenfolgen in JavaSript unveränderlich sind. Da es eine Zeichenfolge zurückgibt , müssten Sie etwas tun wie ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

Die Alternative ist jedoch eine Funktion wie die von JavaScript reverse(), da sie alle ihre Aufrufe ändert. Beispielsweise:

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

Als mein Freund mich fragte, warum er replacenicht funktioniere, bemerkte ich, dass ich nach einem Wort griff, das ich nicht kenne (soweit ich weiß) ...

„Sie müssen setzen die Zeichenfolge‚string Punkt ersetzen‘, weil die Ersetzen - Funktion ________ ist.“

Sie nicht brauchen , zu setzen eine Reihe gleich „Array dot - Reverse“, weil umgekehrt ________ ist.“

Ich kenne mich mit Prototypfunktionen aus, obwohl ich nicht glaube, dass das das gesuchte Wort ist. Kann mir jemand helfen, diese Lücken auszufüllen?


6
Vielleicht ist das Wort "Mutator"? wie in: You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. Ich denke, ich habe diese Terminologie gehört, um auf Funktionen zu verweisen, die die Instanz "mutieren", die sie aufruft. Aber Sie sollten das wahrscheinlich woanders noch einmal überprüfen.
FrustratedWithFormsDesigner

Bin dankbar! Ich habe gerade etwas über Mutator Methods gelesen und denke, dass es definitiv ganz gut in dieses Gespräch passt. Sicher im Reich dessen, wonach ich suche.
Santi

Ich bin verwirrt: im Titel, fragen Sie eine Funktion , die ändert das Objekt , das sie genannt, aber in Ihren Beispielen zeigen Sie Methoden, die das Objekt modifizieren sie genannt werden auf , also genau das Gegenteil von dem Titel. Um welche der beiden handelt es sich?
Jörg W Mittag

Na sicher der, der in 30 Zeilen ausführlich erklärt wurde. Ich werde den Titel ändern, damit er korrekt ist, danke für das Heads-up!
Santi

Antworten:


12

Das Paar von Konzepten, nach denen Sie suchen, sind veränderbare / unveränderliche Parameter und vorhandene / zurückgegebene Ergebnisse.

In Ihren Beispielen:

Sie müssen den String auf "string dot replace" setzen, da die Ersetzungsfunktion auf einen String angewendet wird, der in Python unveränderlich ist, sodass die Ersetzungsfunktion einen neuen String zurückgibt .

Für einen C / C ++ - Programmierer ist dies eher als "als Wert übergeben" als als "als Referenz übergeben" bekannt, wodurch sie unveränderlich werden und das Ergebnis zurückgeben.

Sie müssen ein Array nicht gleich "Array-Punktumkehr" setzen, da die Umkehrung auf ein Array angewendet wird, das veränderlich ist und daher vor der Rückkehr Änderungen an Ort und Stelle vornehmen kann .

In Sprachen wie C / C ++ wird dies als Parameter bekannt „bestanden by reference“ dh die Adresse vorbei , die, wenn unmodifizierte durch const, um die Funktion ändern kann, mutieren , der Inhalt dieser Adresse , um die Ergebnisse zu verändern am Ort vor der Rückkehr.

Natürlich ist es nicht ungewöhnlich , eine Funktion zu haben , dass die Renditen Ergebnisse beiden Mechanismen, zB int SomeFn(int p1, int p2, int *ErrCode)können, möglicherweise Ergebnisse zurück sowohl im Rückgabewert und durch den Inhalt zu modifizieren ErrCode.

Eine dritte Methode

Der Vollständigkeit halber ist ein dritter Mechanismus zum Zurückgeben von Ergebnissen nebenwirkend oder global , dh Ändern des Dateibereichs, programmweiter, gemeinsamer oder Umgebungswerte. Dies wird im Allgemeinen als schlechte Nachricht angesehen, da Sie, sofern nicht sehr gut dokumentiert, nur durch sorgfältiges Lesen des Codes herausfinden können, was geändert wird. In Sprachen wie C / C ++ ist dies nur allzu einfach möglich, wenn eine äußere Bereichsvariable mit einem bestimmten Namen, möglicherweise sogar in einem anderen Modul, und keine maskierende lokale Bereichsvariable mit demselben Namen vorhanden ist. In Python können Sie zwar die Werte von Werten in äußeren Gültigkeitsbereichen lesen, es sei denn, die Werte in äußeren Gültigkeitsbereichen sind explizit als verfügbar festgelegt und können mit geändert werdenglobal Wenn Sie mit dem Schlüsselwort versuchen, eine äußere Bereichsvariable zu ändern, wird automatisch eine lokale Variable mit demselben Namen erstellt.


Ah, ich bin mit diesen Begriffen vertraut, obwohl ich nicht sicher war, ob es ein tatsächliches Wort gab, das die Funktion selbst beschreibt . Wie in, (The reverse function is a _______ function.) Davon abgesehen ist dies fast die gleiche Antwort wie die, die ich letztendlich meinem Freund gegeben habe. Ich freue mich über Ihre Bestätigung, obwohl ich mich immer noch frage, ob es bestimmte Begriffe gibt. Ich lasse die Frage noch etwas offen, werde sie aber als Antwort auf den Fall akzeptieren, dass diese Wörter einfach nicht existieren.
Santi

2
In einigen Sprachen, wie z. B. Python, kann es auch Klassen geben, die sich selbst ändern. In einigen Kontexten wird dieses "Affen-Patchen" als eine gute Sache angesehen, in vielen gilt es als "selbstmodifizierender Code" und ist verboten. Sie können auch einen "evolutionären Code" haben, bei dem Codefragmente zufällig "mutiert" und / oder kombiniert und dann getestet und auf irgendeine Weise für die "beste" Leistung ausgewählt werden.
Steve Barnes

-1. Ob Zeichenfolgen veränderlich oder unveränderlich sind, hat nichts mit der Funktion zu tun, die darauf ausgeführt wird. Die Funktion ist nicht veränderbar oder unveränderlich und wird nicht "zurückgegeben" oder "an Ort und Stelle". Funktionen können ihre Argumente ändern und trotzdem zurückgeben.
Miles Rout

@MilesRout fügte hinzu, dass Funktionen, die an Ort und Stelle geändert werden, immer noch zurückkehren und einige C / C ++ - Beispiele aus Gründen der Klarheit sowie Ergebnisse nach Nebenwirkungen zur Vollständigkeit.
Steve Barnes

4

Mein bevorzugter Ausdruck ist:

  • Die Array- reverseMethode mutiert . Es ist ein Mutator . Ein häufiger Sonderfall ist ein Setter .

  • Die String- replaceMethode ist nicht mutierend . Es ist kein Mutator . Wenn es nicht ändern nichts , es ist nebenwirkungsfreie . Ein häufiger Sonderfall ist ein Getter .

  • Da JavaScript-Zeichenfolgen unveränderlich sind , können Zeichenfolgenmethoden nicht mutiert werden.

    "Hello World" .replace ("Hallo", "Auf Wiedersehen");

    sollte dich unwohl machen. Ein Zeichenfolgenliteral wird nicht geändert. Das Ergebnis wird verworfen. Statische Code-Analysatoren können solche Fehler manchmal erkennen.

  • Da JavaScript-Arrays veränderbar sind , können Array-Methoden verändert werden. JavaScript verwendet Arrays in der Regel als lokale Lagerplätze, die leicht geändert und nur selten kopiert werden können.

2

Manchmal habe ich im Zusammenhang mit der reinen funktionalen Programmierung Funktionen gehört, die den Eingabewert ändern (und daher keine reinen Funktionen sind) und als destruktiv bezeichnet werden . Ich bin mir jedoch nicht sicher, ob dies der richtige Begriff ist.

In Ihrem Fall würden Sie sagen:

Sie müssen den String auf "string dot replace" setzen, da die Ersetzungsfunktion nicht destruktiv ist .

Sie müssen ein Array nicht auf "Array-Punktumkehr" setzen, da die Umkehrung destruktiv ist .


1

Vielleicht ist das Wort, nach dem Sie suchen, rein ?

replace()ist (oder scheint) rein, weil es nicht so aussieht, als ob es irgendwelche Nebenwirkungen hätte (dh die Zeichenkette modifizieren), während reverse()es unrein ist, weil es den Zustand des Arrays verändert.


Dies ist ein verwandtes Konzept, impliziert aber auch andere Eigenschaften (z. B. keinen Zugriff auf den globalen Status und immer die gleiche Ausgabe für die gleiche Eingabe).
Jacob Raihle

1

Diese werden normalerweise in Funktionen und Methoden unterteilt (wobei Methoden eine Teilmenge von Funktionen sind). Eine Funktion ist ein Codeabschnitt, der isoliert aufgerufen werden kann, während eine Methode ein Konzept eines aktuellen "Kontexts" hat, in dem sie ausgeführt wird. Die Aktion einer Methode ändert den Zustand ihres Kontexts.

Bei der objektorientierten Programmierung ist der Kontext die Instanz, auf der die Funktion ausgeführt wird.


0

Ich weiß nicht, ob es eine offizielle Antwort gibt, aber hier sind zwei, die Ihnen gefallen könnten.

Verfahren

Nur weil es eine gute Antwort auf diese Frage zu sein schien , die Ihrer Frage übrigens sehr ähnlich sieht - Sie sollten es sich ansehen.

In-Place-unary-Betrieb

Bewerten Sie diese Seite: java.util.function . Es bietet eine Art erfundenen Namen für Delegierte (Eingabe- / Ausgabesignaturen) verschiedener Prototypen, z. B. ein Delegat, der ein Argument annimmt und nichts zurückgibt, wird als Verbraucher bezeichnet .

Als geschickter Schüler von OOP sollten Sie sich darüber im Klaren sein, dass eine Methode nur eine Funktion ist, die einen versteckten Parameter übernimmt ( this). Da es als Referenz geliefert wird, dient es sowohl als Eingabe- als auch als Ausgabeparameter.

Diesen Java-Typen zufolge (und sie scheinen ziemlich schlau zu sein) wird ein Delegat, der eine einzelne Eingabe akzeptiert und einen Wert desselben Typs zurückgibt, als unärer Operator bezeichnet .

In diesem Fall array::Reverse()ist ein Array nicht unveränderlich und kann möglicherweise viel Platz beanspruchen. Daher ist es effizienter und bequemer, die Operation vor Ort durchzuführen. Daher Reverse()handelt es sich um einen unären In-Place-Operator .

Aber für mich ist ein "Operator" ein spezielles Symbol (wie der Additionsoperator, auch bekannt als +) oder ein mathematisches Schlüsselwort wie mod. Deshalb bevorzuge ich es eine OPERATION nennen Ion , wodurch man in-place unäre Operation .


Sie verwechseln Konzepte. Reverse()kein Operator ist, braucht ein unärer Operator keinen Wert des gleichen Typs zurückgeben (zB !, delete, typeof) und Betreiber sind nicht Delegierten. "In-Place" ist jedoch eine gute Bezeichnung für eine Methode, die ihre Instanz ändert. [Ich habe nicht herabgestimmt, aber es sieht so aus, als hätte jemand alle Antworten herabgestimmt, obwohl sie alle nützlich sind.]
Jerry101

Nicht sicher, ob du folgst. Jeder Prototyp kann von einem Delegierten vertreten werden. "Operator" funktioniert bei mir nicht (wie gesagt), daher sage ich "Operation", und ja, es handelt sich tatsächlich Reverse()um eine unäre Operation. Aber insgesamt stimme ich zu, dass dies alles ein wenig seltsam ist, aber ich verwende wörtlich die Terminologie des verlinkten Dokuments , das von einigen ziemlich klugen Leuten verfasst worden zu sein scheint. Zumindest ist es besser als nichts.
John Wu

Oh, ich verstehe! Beachten Sie, dass Lambdas zum Nachrüsten in Java auf der Idee einer funktionalen Schnittstelle (einer Java-Schnittstelle mit nur einer Methode) aufbauen, sodass wir gewöhnliche Java-Objekte weitergeben können, um sie als "Funktionen" anzuwenden. (Brian Goetz hat einen technischen Vortrag über das Hinzufügen von Lambdas. Mehrmals sagte er, "der offensichtliche Ansatz hätte gesaugt".) Beim Erstellen von funktionalen Schnittstellen für Stream-Verarbeitungsobjekte wurden Begriffe wie "Operator" missbraucht. Das ist verwirrend! Ihnen müssen die guten Namen ausgegangen sein. Ich denke nicht, dass es eine gute Quelle für Begriffe für OOP-Methoden ist, die das Empfängerobjekt ändern / nicht ändern.
Jerry101
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.