Applyは、指定された引数に関数を適用する関数型クラスのメンバー関数の適切な名前です。
class Addition {
int apply(int a, int b) {
return a + b;
}
}
しかし、反対の場合、関数が適用先であるクラスに、特定の関数をそれ自体に適用するメソッドがある場合はどうでしょうか?
class FktArg {
Object whatShouldIBeNamed(Function<FktArg> fkt) {
return fkt.apply(this);
}
}
ここでの命名規則は何ですか?
良いネーミングを本当に気にしている人に会うのはいつもいいことです。
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番目のケースでは、パラメーター化されるのは演算ですが、オペランドは包含オブジェクトによって暗黙的に指定されます。
どちらにしても、それは同様にオペランドへの操作の適用です。その点で、モデリングが不十分であることを意味している可能性があります。ここで欠落しているのは、applyメソッドを持つ演算子またはアプリケータクラスです。その後、操作はクラスではなく関数になり、オペランドはクラスではなくレコードになり、どちらもパラメーターとしてapplyメソッドに渡されます。
これは、TransferMoneyメソッドを含む送信または受信Accountオブジェクトであるかどうかという古い質問のようなものです。実際、どちらでもありません。送金するのはJournalオブジェクトであり、少なくとも2つのアカウントをパラメーターとして受け取ります。
あるいは、それがアクティブな参加者として扱われるのが演算なのかオペランドなのかが混乱したり矛盾したりする兆候である可能性もあります。加算は2つの数値を取り、それらを合計すると言うのは当然のことです。 2つの数値が加算されてそれ自体を合計すると言うのはあまり自然ではなく、数値が加算と別の数値を取得してそれ自体を加算すると言うのはさらに不自然です。