7

ここでは、より一般的な質問があります。これはその延長と考えてください。

クラスはオブジェクトのタイプを表し、名前として名詞を使用する必要があることを理解しています。しかし、多くの言語でサポートされている、オブジェクトというよりも関数のように振る舞う関数オブジェクトがあります。これらのクラスにも名詞として名前を付ける必要がありますか、その場合は動詞でかまいません。doSomething()、意味的には、 よりも理にかなっていSomething()ます。

更新/結論

これについて私が得た上位2つの回答は、さまざまな意見を共有しています。

アッティラ

ただし、ファンクターの場合、それらは「アクション」を表すため、動詞 (または何らかの名詞と動詞の組み合わせ) を使用して名前を付ける方が適切です。関数の動作に基づいて名前を付けるのと同じです。

ルーク

一方、ファンクターのインスタンスは事実上関数であり、それに応じて名前を付けたほうがよいでしょう。上記のジムの提案に従って、SomethingDoer doSomething; doSomething();

いくつかのコードを実行した後、どちらも一般的な方法のようです。stl の GNU 実装で、、、(bits/stl_function.h) などのクラスを見つけましたnegateplusそしてminusvariate_generator( mersenne_twistertr1/random.h)。同様に、boostbase_visitorでは、predecessor_recorder(graph/visitors.hpp)inverseinplace_erase(icl/functors.hpp)のようなクラスを見つけました。

4

4 に答える 4

5

オブジェクト(したがってクラス)は通常「もの」を表すため、名詞を使用して名前を付ける必要があります。ただし、ファンクターの場合、それらは「アクション」を表すため、動詞(またはある種の名詞と動詞の組み合わせ)で名前を付ける方が適切です。関数の動作に基づいて関数に名前を付けるのと同じです。

一般に、目的(オブジェクト、関数など)にちなんで名前を付けることができます。つまり、プログラム/世界でそれらが表すものです。

ファンクターは、状態を持つ関数(つまり「アクション」)と考えることができます。これを実現する(「アクション」に関連付けられた状態を持つ)クリーンな方法は、状態を格納するオブジェクトを作成することであるため、実際には「アクション」(ファンシー関数)であるオブジェクトを取得します。

上記は、純粋なファンクターを作成できる言語、つまり、呼び出しが通常の関数(C ++など)の場合と同じであるオブジェクトに適用されることに注意してください。operator()これがサポートされていない言語(つまり、のように呼び出される以外のメソッドがcommand.do()必要)では、コマンドのようなクラス/オブジェクトに名詞の名前を付け、メソッドに動詞の名前を付ける必要があります。

于 2012-06-06T23:21:14.633 に答える
3

ファンクターの型はクラスであり、それ自体では実際には何もしないため、通常のスタイル (たとえば、名詞) で名前を付けることができます。一方、ファンクターのインスタンスは事実上関数であり、それに応じて名前を付けたほうがよいでしょう。上記のジムの提案に従って、SomethingDoer doSomething; doSomething();

私自身のコードをざっと見てみると、名詞と動詞の両方である単語を使用することで、この問題を完全に回避できたことがわかります...FilterたとえばShow。ただし、すべての状況でその命名スキームを適用するのは難しいかもしれません!

于 2012-06-12T11:56:19.663 に答える
2

Function, Callback, Action,などの接尾辞を付けて、 , の代わりに , と呼ばれるクラスを作成することをお勧めします。これは、実際Commandの関数の名前のように聞こえます。SortFunctionSearchActionExecuteCommandSortSearchExecute

于 2012-06-12T13:11:26.450 に答える
1

これを見るには、次の 2 つの方法があると思います。

1)構築時にファンクターとして直接呼び出すことができるように適切に名前を付けることができるクラス:

Doer()(); // constructed and invoked in one shot, compiler could optimize

2)ステートレス ファンクター オブジェクトでファンクターを複数回呼び出す必要がある場合、または #1 の構文が好ましくないスタイル上の理由で、インスタンス。

Doer _do;
_do(); // operator () invocation after construction

Searchorなどの同じ動詞と名詞の形式を持つ単語でクラスに名前を付けるという上記の@Rookの提案が好きFilterです。

于 2012-06-12T15:59:08.380 に答える