web-dev-qa-db-ja.com

引数を取らず、何も返さない関数の名前は何ですか?

Java 8's _Java.util.function_パッケージには、

  • Function:1つの引数を取り、1つの結果を生成します。
  • Consumer:1つの引数を取り、何も生成しません。
  • Supplier:引数を取らず、1つの結果を生成します。
  • ...:プリミティブ、2つの引数などを処理する他のケース...

しかし、「引数を取らず、何も生成しない」ケースを処理する必要があります。

_Java.util.functionnal_にはこれについては何もありません。

したがって、問題は次のとおりです。

引数なしで何も返さない関数」の名前は何ですか?

Java 8では、その定義は次のようになります。

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

Executor はすでに存在し、別の目的があります:「送信されたRunnableタスクを実行するオブジェクト」。シグネチャは(execute(Runnable):void)と一致せず、 function interface でもありません。

Runnable は存在しますが、スレッド化コンテキストに強くリンクされています。

  • パッケージは_Java.lang_ではなく_Java.util.function_です。
  • Javadocは次のように述べています。「Runnableインターフェースは、インスタンスがスレッドによって実行されるように意図されているクラスによって実装される必要があります」。
  • 「Runnable」という名前は、スレッド内で実行中のコードを示唆しています。
87
superbob

すべてのアリティに個別の名前を使用してJavaでこのようにすることは、エミュレートする価値がありませんでした。ただし、一貫性を保つためにmustを使用している場合、または非常に一般的なライブラリコードを作成している場合は、Konradの提案が適しています。リングにProcedureを投げるかもしれません。

疑似機能のパラダイムを使用しても、通常の命名原則が適用されなくなるわけではありません。ほとんどの場合、インターフェイスの名前は、一般的な構文のアイデアではなく、その名前doに基づいて付けます。関数を元に戻すスタックに配置する場合は、UndoFunctionという名前にする必要があります。 GUIイベントから呼び出される場合は、GUIEventHandlerという名前にする必要があります。

74
Karl Bielefeldt

Javaの世界ではRunnableと呼ばれます。C#の世界ではActionと呼ばれます。

しかし、物事のより広い視野にうまく適合するより良い名前があります。

物事のより大きな見解は後で来ます。パラメーターのないvoid関数インターフェースに加えて、1つ、2つ、またはそれ以上の引数を受け入れるか、値を返す同様の関数インターフェースも必要であると判断した場合。その場合は、それらすべてのエンティティの名前を同型にし、相互に対応させる必要があります。

そのため、Javaでは、Proceduresと呼ばれる独自の機能インターフェイスのセットがあり、次のように定義されています。

_public interface Procedure
{
    void invoke();
}

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

...(画像が表示されます。)

また、Functionsと呼ばれる同様のインターフェイスのセットがあり、同様に定義されています。最初のジェネリックパラメーターは戻り値の型です。

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

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

ですから、ここでの私のポイントは、Procedureはより広い視野にうまく収まるため、非常に優れた名前であるということです。引数を受け取ったり値を返したりするメソッドを備えた同様の機能的インターフェースを持つことを後で決定した場合、これに遭遇します。

注:私は基本的にカールビーレフェルトの「通常の命名原則はウィンドウの外に出てはならない」、「ほとんどの場合、インターフェイスの名前は後からではなく、後に付けるべきである」という主張に同意するいくつかの一般的な構文のアイデア。」ただし、彼は「ほとんど常に」を許可していることに注意してください。 (本質的には匿名の)手続きと関数が必要な場合があります。それがOPが求めていることであり、それが私が答えていることです。

修正2017-11-10:

あなたは尋ねるかもしれません、なぜ_Function1<R,T1>_ではなく_Function1<T1,R>_なのでしょうか?どちらの方法でもかまいませんが、「convert-to」(source-to)ではなく「convert-from」(destination-from-source)命名規則に従うのが好きなので、左側に戻り値の設定があります。 -destination)規約。 (これは、慣習というよりは偶然です。おそらく、誰もそれをまったく考えていなかったという意味で、おそらく誰もそれをまったく考えていなかったという意味で、「変換元」の慣習にたどり着いたでしょう。 )

私はこれについて Joel Spolksy-間違ったコードを間違って見えるようにする で読んだ、それは非常に長い記事なので、全体を読むことをお勧めするが、手元のケースに直接ジャンプしたい場合は、 'TypeFromType'の場合ですが、TL; DRを提供するための考え方は、myint = intFromStr( mystr )myint = strToInt( mystr )よりもはるかに優れているということです。最初のケースでは、型の名前が関連する値。「int」が「int」と一致し、「str」が「str」と一致することを簡単に確認できます。

したがって、私は拡張機能によって、コードに現れるように物事を注文する傾向があります。

34
Mike Nakis

なぜCommandではないのですか?データを取らず、データを返さないことを考えると、それを呼び出すと何らかの効果が生じると想定すると(そうでなければ実際には無意味です)、それがおおよそできる唯一のことだと思います-アクションを発動して何かを起こします。

そういえば、.NETには一般的なActionデリゲートもあります。 JavaのConsumerとは異なり、0〜16の引数を取ることができます。言い換えると、最も単純なバージョンでは何も必要ありません- [〜#〜] msdn [〜#〜] を参照してください。

また、名前は「消費する」ことを意味するものではないため、名前の選択にも適しているようです。

18
Konrad Morawski