web-dev-qa-db-ja.com

引数関数をオブジェクトに適用するメンバー関数は何と呼ばれるべきですか?

Applyは、指定された引数に関数を適用する関数型クラスのメンバー関数の適切な名前です。

class Addition {
   int apply(int a, int b) {
      return a + b;
   }
}

しかし、反対の場合、関数が適用先であるクラスに、特定の関数をそれ自体に適用するメソッドがある場合はどうでしょうか?

class FktArg {
   Object whatShouldIBeNamed(Function<FktArg> fkt) {
      return fkt.apply(this);
   }
}

ここでの命名規則は何ですか?

5
kutschkem

良いネーミングを本当に気にしている人に会うのはいつもいいことです。

mapは、このメソッドのよく理解されている名前だと思います。

_// Java 1.8 example
// `T` is the type of `this` Object
public <R> R map(Function<? super T, ? extends R> func) {
    return func.apply(this);
}
_

ウィキペディアは言う

多くのプログラミング言語では、"map"は、ファンクターの各要素に特定の関数を適用する高次関数の名前です...

通常、ファンクターは要素のコレクションですが、ファンクターとしての個々の要素は依然として非常に理解しやすいと思います。

Javaの例をそのまま使用すると、これはJava Stream APIのmapに似ていますが、オブジェクトを1つだけマッピングしているため、_Stream<R>_の代わりにRを返すだけです

Java.util.stream.Stream
<R> Stream<R> map(Function<? super T, ? extends R> mapper)

thisの要素に指定された関数を適用するストリームの結果で構成されるストリームを返します。

これは中間操作です。

型パラメーター:_<R> The element type of the new stream_
パラメータ:_mapper - a non-interfering, stateless function to apply to each element_
戻り値:_the new stream_

2
xtratic

私はおそらく両方のコンテキストに「適用」という言葉を使うと思います。

最初のケースでは、演算はオブジェクト自体を介してパラメーター化されますが、オペランドはメソッド引数として提供されます(おそらく減算などは、異なるオブジェクトのメソッドを使用してプログラマーによって処理されます)。

2番目のケースでは、パラメーター化されるのは演算ですが、オペランドは包含オブジェクトによって暗黙的に指定されます。

どちらにしても、それは同様にオペランドへの操作の適用です。その点で、モデリングが不十分であることを意味している可能性があります。ここで欠落しているのは、applyメソッドを持つ演算子またはアプリケータクラスです。その後、操作はクラスではなく関数になり、オペランドはクラスではなくレコードになり、どちらもパラメーターとしてapplyメソッドに渡されます。

これは、TransferMoneyメソッドを含む送信または受信Accountオブジェクトであるかどうかという古い質問のようなものです。実際、どちらでもありません。送金するのはJournalオブジェクトであり、少なくとも2つのアカウントをパラメーターとして受け取ります。

あるいは、それがアクティブな参加者として扱われるのが演算なのかオペランドなのかが混乱したり矛盾したりする兆候である可能性もあります。加算は2つの数値を取り、それらを合計すると言うのは当然のことです。 2つの数値が加算されてそれ自体を合計すると言うのはあまり自然ではなく、数値が加算と別の数値を取得してそれ自体を加算すると言うのはさらに不自然です。

1
Steve