引数を取らず、何も返さない関数の名前は何ですか?[閉まっている]


80

Java 8のjava.util.functionパッケージには、次のものがあります。

  • 機能:1つの引数を取り、1つの結果を生成します。
  • 消費者:1つの引数を取り、何も生成しません。
  • サプライヤ:引数をとらず、1つの結果を生成します。
  • ...:プリミティブ、2つの引数などを処理する他のケース...

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

これには何もありませんjava.util.functionnal

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

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

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

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

エグゼキューターは既に存在し、別の目的があります:「サブミットされたRunnableタスクを実行するオブジェクト」。署名は一致せず(execute(Runnable):void)、機能的なインターフェースすらありません。

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

  • パッケージがあるjava.lang、ありませんjava.util.function
  • javadocの状態:「Runnableインターフェイスは、インスタンスがスレッドによって実行されることを意図しているクラスによって実装する必要があります」。
  • 「Runnable」という名前は、スレッド内で実行中のコードを示唆しています。

28
「しかし、「引数を取らず、何も生成しません」には何もありません。」 - Runnable
user11153

11
RunnableRunnableはThreadExecutorたとえば)他のクラスでも使用されているため、この時点でjavadoc は古くなっていると思います。
SpaceTrucker

13
意味ではありません@superbob RunnableSのみ可能.run()Thread、S。実際、彼らは非常に一般的に、問題の説明を正確に目的のために使用している
blgt

5
@superbobそれが当初の目的でしたが、Java 8以降、機能的なインターフェースとして「改造」されました。これが、java.util.function パッケージに何も見つからなかった理由です。
user11153

5
Semi-Snark:ImpureFuntionは確かに副作用のみに依存するため、そうでない場合はノーオペレーションです。(en.wikipedia.org/wiki/Pure_function#Impure_functions)もっとシリアス的に:命令型(何かを行う)。これは少なくともvoid execute()のセマンティクスと一致します。
クリスチャンH

回答:


71

すべてのアリティに個別の名前を付けてそのように行うJavaの選択は愚かでした。エミュレートする価値はありません。あなたはしかし、しなければならない一貫性のために、またはあなたは非常に汎用的なライブラリのコードを書いている場合は、コンラートの提案は良いです。私Procedureはリングに投げ込むかもしれません。

疑似機能パラダイムを使用することは、通常の命名原則が適用範囲外になることを意味しません。インターフェースは、ほとんどの場合、彼らは何にちなんで命名されなければならないではないいくつかの一般的な文法的なアイデアの後、。関数を元に戻すスタックに配置する場合は、名前を付ける必要がありますUndoFunction。GUIイベントから呼び出される場合は、名前を付ける必要がありますGUIEventHandler。友人は、友人に悪い命名規則を永続させません。


Procedure大丈夫です コンテキストでは、この種の「構造」を処理する必要がある汎用ライブラリを開発しています。
superbob

18
Procedureパスカル時代から好きです。AにProcedureは副作用Functionがありますが、ありません。値を返さないため、できることは副作用のみです。
スペンサーラス

私が使用するように傾斜する可能性があるProcedureRIR<T1,T2>ためvoid proc(T1, int, T2)、同様に他のタイプのために-おそらく、オンデマンドでそれらのほとんどを作成するのではなく種類のすべての組み合わせに詰め込むしようとしています。
スーパーキャット

1
実際、実際の関数型プログラミングは一般的にハンガリースタイルの命名を推奨していません。これは、機能的というよりも、OOパラダイムの考え方です。
スリーブマン

3
If the functions are placed into an undo stack, they should be named UndoFunction.ただし、関数に名前を付けることと、異なる型を与えることには違いがあります。機能的なスタイルでは、作成しないでしょうUndoFuncton、今あなたがにそれを渡すことはできませんので、種類をflipcurrycomposefiltermap私の意見ではなど、異なるアリティ異なる名前を持つ関数を与えるために、Javaの決定は愚かである本当の理由です。もちろん、副作用を使用する場合は、何でも呼び出します。あなたはすでに窓から構図を捨てており、あなたは間違いなく機能も使っていません。
ドーバル

33

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」と一致します。

したがって、拡張機能により、コードに表示される方法で物事を注文する傾向があります。


1
このソリューションは本当に優れています。Javaのサプライヤ、コンシューマ、BiFunctionなどよりも防弾効果が高いようです。これは、2つの概念のみにすべてをまとめているからです。@Karl Bielefeldtの答えを思い出させてくれます。「Javaはアリティごとに別々の名前でそれを行うという選択は馬鹿だった」と答えました。唯一の「欠点」は、プリミティブ型とその組み合わせ(DoubleToLongFunction、ToLongBiFunctionなどの楽しいもの)を処理しないことです。しかし、プリミティブは別の問題である...
superbob

はい。基本的に、ジェネリックをプリミティブに置き換え始めると、これはパフォーマンスに本当に関心があることを意味しますしたがって、ここで説明する規則から逸脱し、高度にカスタマイズされた名前を使用して高度にカスタマイズされたパフォーマンスを改善できます。
マイクナキス

1
2番目の回答を受け入れることができれば、手順N、関数Nの提案のおかげであなたの回答を選択します。私はまだそれを支持しました。
-superbob

なぜそうではないのFunction1<T1, R>ですか?
エリック

@ErikEそれは非常に良い質問です。それに答えるために投稿を修正しました。
マイクナキス

18

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

そういえばAction、.NETには汎用デリゲートもあります。Javaとは異なり、0〜16個のConsumer引数を取ることができます。他の言葉で、それの最も単純バージョンはどれも取らない-を参照してMSDNを

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


1
Commandいいね。Commandパターンと混同される可能性がありますが、解決策になる可能性があります。
superbob

7
私はActionよりも好きですCommand。コマンドは、受信されて評価されるもののように聞こえますが、アクションはその副作用のために実行されます。
ベルギ

7
うーん...どうしてコマンドパターンにできないの?Commandエンティティを正確に構築しました!従来の名前のexecute()メソッドもあります。0_o '
ヒジャール人

1
アクションの提案は嫌いです。これは一般的な(そして良い)Swingインターフェースだからです。コマンドは合理的です。
user949300

@ user949300しかし、それはコンテキストに依存します-Javaはあなたが見る大きな世界です、私はAndroid開発者です(現在)、J2EEに関連する特異性はありません;)私はもちろん、選択した命名規則が衝突してはならないことに同意しますフレームワークが使用するもの。
コンラッド・モラウスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.