Java 8's _Java.util.function
_パッケージには、
しかし、「引数を取らず、何も生成しない」ケースを処理する必要があります。
_Java.util.functionnal
_にはこれについては何もありません。
したがって、問題は次のとおりです。
「引数なしで何も返さない関数」の名前は何ですか?
Java 8では、その定義は次のようになります。
_@FunctionalInterface
public interface InsertANameHere {
void execute();
}
_
Executor はすでに存在し、別の目的があります:「送信されたRunnableタスクを実行するオブジェクト」。シグネチャは(execute(Runnable):void
)と一致せず、 function interface でもありません。
Runnable は存在しますが、スレッド化コンテキストに強くリンクされています。
Java.lang
_ではなく_Java.util.function
_です。すべてのアリティに個別の名前を使用してJavaでこのようにすることは、エミュレートする価値がありませんでした。ただし、一貫性を保つためにmustを使用している場合、または非常に一般的なライブラリコードを作成している場合は、Konradの提案が適しています。リングにProcedure
を投げるかもしれません。
疑似機能のパラダイムを使用しても、通常の命名原則が適用されなくなるわけではありません。ほとんどの場合、インターフェイスの名前は、一般的な構文のアイデアではなく、その名前doに基づいて付けます。関数を元に戻すスタックに配置する場合は、UndoFunction
という名前にする必要があります。 GUIイベントから呼び出される場合は、GUIEventHandler
という名前にする必要があります。
Javaの世界ではRunnable
と呼ばれます。C#の世界ではAction
と呼ばれます。
しかし、物事のより広い視野にうまく適合するより良い名前があります。
物事のより大きな見解は後で来ます。パラメーターのないvoid関数インターフェースに加えて、1つ、2つ、またはそれ以上の引数を受け入れるか、値を返す同様の関数インターフェースも必要であると判断した場合。その場合は、それらすべてのエンティティの名前を同型にし、相互に対応させる必要があります。
そのため、Javaでは、Procedure
sと呼ばれる独自の機能インターフェイスのセットがあり、次のように定義されています。
_public interface Procedure
{
void invoke();
}
public interface Procedure1<T1>
{
void invoke( T1 argument1 );
}
_
...(画像が表示されます。)
また、Function
sと呼ばれる同様のインターフェイスのセットがあり、同様に定義されています。最初のジェネリックパラメーターは戻り値の型です。
_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」と一致することを簡単に確認できます。
したがって、私は拡張機能によって、コードに現れるように物事を注文する傾向があります。
なぜCommand
ではないのですか?データを取らず、データを返さないことを考えると、それを呼び出すと何らかの効果が生じると想定すると(そうでなければ実際には無意味です)、それがおおよそできる唯一のことだと思います-アクションを発動して何かを起こします。
そういえば、.NETには一般的なAction
デリゲートもあります。 JavaのConsumer
とは異なり、0〜16の引数を取ることができます。言い換えると、最も単純なバージョンでは何も必要ありません- [〜#〜] msdn [〜#〜] を参照してください。
また、名前は「消費する」ことを意味するものではないため、名前の選択にも適しているようです。