it-swarm-eu.dev

Wie heißt eine Funktion, die kein Argument akzeptiert und nichts zurückgibt?

Im Paket Java.util.function Von Java 8) haben wir:

  • Funktion : Nimmt ein Argument und erzeugt ein Ergebnis.
  • Verbraucher : Nimmt ein Argument, produziert nichts.
  • Lieferant : Nimmt kein Argument an und erzeugt ein Ergebnis.
  • ... : Andere Fälle, in denen Primitive, 2 Argumente usw. behandelt werden ...

Aber ich muss den Fall " nimmt kein Argument, produziert nichts " behandeln.

Dafür gibt es in Java.util.functionnal Nichts.

Die Frage ist also:

Wie heißt ' eine Funktion, die kein Argument akzeptiert und nichts zurückgibt'?

In Java 8) lautet die Definition:

@FunctionalInterface
public interface InsertANameHere {
    void execute();
}

Executor existiert bereits und hat einen anderen Zweck: " Ein Objekt, das übermittelte ausführbare Aufgaben ausführt". Die Signatur stimmt nicht überein (execute(Runnable):void) und ist nicht einmal ein Funktionsschnittstelle .

Runnable existiert, ist aber stark mit dem Threading-Kontext verknüpft:

  • Das Paket ist Java.lang, Nicht Java.util.function.
  • Im Javadoc heißt es: " Die Runnable-Schnittstelle sollte von jeder Klasse implementiert werden, deren Instanzen von einem Thread ausgeführt werden sollen".
  • Der Name "Runnable" deutet auf einen laufenden Code in einem Thread hin.
87
superbob

Javas Entscheidung, dies mit einem eigenen Namen für jede Arität zu tun, war es nicht gerade wert, nachgeahmt zu werden. Wenn Sie jedoch aus Gründen der Konsistenz müssen oder wenn Sie sehr allgemeinen Bibliothekscode schreiben, sind die Vorschläge von Konrad gut. Ich könnte Procedure in den Ring werfen.

Die Verwendung eines pseudofunktionalen Paradigmas bedeutet nicht, dass normale Namensprinzipien aus dem Fenster gehen sollten. Schnittstellen sollten fast immer nach dem benannt werden, was sie tun, nicht nach einer generischen syntaktischen Idee. Wenn die Funktionen in einem Rückgängig-Stapel abgelegt werden, sollten sie UndoFunction heißen. Wenn sie von GUI-Ereignissen aufgerufen werden, sollten sie GUIEventHandler heißen.

74
Karl Bielefeldt

In der Welt Java] heißt es Runnable. In der C # -Welt heißt es Action.

Aber es gibt einen besseren Namen, der gut in eine größere Sicht der Dinge passt.

Die größere Sicht der Dinge kommt später, wenn Sie entscheiden, dass Sie neben Ihrer parameterlosen void-Funktionsschnittstelle auch ähnliche Funktionsschnittstellen benötigen, die ein, zwei oder mehr Argumente akzeptieren oder einen Wert zurückgeben. In diesem Fall möchten Sie, dass die Namen aller dieser Entitäten isomorph sind und miteinander korrespondieren.

In Java habe ich also meine eigenen Funktionsschnittstellen, die ich Procedures nenne und die wie folgt definiert sind:

public interface Procedure
{
    void invoke();
}

public interface Procedure1<T1>
{
    void invoke( T1 argument1 );
}

... (du bekommst das Bild.)

Und ich habe auch einen ähnlichen Satz von Schnittstellen namens Functions, die auf ähnliche Weise definiert sind, wobei der erste generische Parameter der Rückgabetyp ist:

public interface Function<R>
{
    R invoke();
}

public interface Function1<R,T1>
{
    R invoke( T1 argument1 );
}

Mein Punkt hier ist also, dass Procedure ein sehr guter Name ist, weil er gut in eine größere Sicht der Dinge passt. Wenn Sie sich später für ähnliche funktionale Schnittstellen mit Methoden entscheiden, die Argumente akzeptieren oder einen Wert zurückgeben, werden Sie darauf stoßen.

HINWEIS : Ich bin im Grunde stimme zu = mit Karl Bielefeldts Behauptung, dass "normale Namensprinzipien [nicht] aus dem Fenster gehen sollten" und dass "Schnittstellen fast immer nach dem benannt werden sollten, was sie tun, nicht nach einer generischen syntaktischen Idee". Aber beachte, dass selbst er "fast immer" zulässt. Manchmal sind (im Wesentlichen anonyme) Verfahren und Funktionen erforderlich, und das fragt das OP, und darauf antworte ich.

Änderung 2017-11-10:

Sie könnten fragen, warum Function1<R,T1> Anstelle von Function1<T1,R>? Es könnte in beide Richtungen gehen, aber ich bevorzuge Rückgabewerte auf der linken Seite, weil ich die Namenskonvention 'Konvertieren von' (Ziel von Quelle) im Gegensatz zur Konvertierung von 'Konvertieren in' (Quelle in) befolgen möchte -Ziel) Konvention. (Was eigentlich eher ein Unfall als eine Konvention ist, in dem Sinne, dass höchstwahrscheinlich niemand jemals darüber nachgedacht hat, denn wenn sie überhaupt darüber nachgedacht hätten, wären sie zu der Konvertierungskonvention gekommen. )

Ich habe darüber in Joel Spolksy gelesen - Falschen Code falsch aussehen lassen , es ist ein sehr langer Artikel, den ich in seiner Gesamtheit lesen sollte, aber wenn Sie direkt zum springen möchten Suchen Sie im vorliegenden Fall nach 'TypeFromType', aber um Ihnen die TL; DR zu geben, ist die Idee, dass myint = intFromStr( mystr ) viel besser ist als myint = strToInt( mystr ), da im ersten Fall die Namen von Die Typen liegen nahe an den zugeordneten Werten, sodass Sie leicht erkennen können, dass das 'int' mit dem 'int' und das 'str' mit dem 'str' übereinstimmt.

Daher neige ich dazu, Dinge so zu ordnen, wie sie im Code erscheinen.

34
Mike Nakis

Warum nicht Command? Angesichts der Tatsache, dass es keine Daten nimmt und keine Daten zurückgibt, aber unter der Annahme, dass das Aufrufen einen gewissen Effekt hat (andernfalls wäre es wirklich ziemlich sinnlos), stelle ich mir vor, dass dies ungefähr das einzige ist, was es tun kann - eine Aktion auslösen, etwas bewirken.

Apropos, es gibt auch einen generischen Action -Delegierten in .NET. Im Gegensatz zu Javas Consumer können 0 bis 16 Argumente verwendet werden. Mit anderen Worten, die einfachste Version benötigt keine - siehe MSDN .

Und da der Name nicht bedeutet, dass es etwas zu "konsumieren" gibt, scheint es auch eine gute Wahl für den Namen zu sein.

18
Konrad Morawski