这里有一个更通用的question。将此视为对此的扩展。
我理解类表示对象的类型,我们应该使用名词作为名称。但是在许多语言中都支持function objects,它们更像是函数而不是对象。我应该将这些类别命名为名词,或者在这种情况下动词是否正常。从语义上讲,doSomething()
比Something()
更有意义。
更新/结论
我得到的两个最高投票的答案分享了一个混合的意见:
阿提拉
在仿函数的情况下,它们代表“动作”,因此用动词(或某种名词 - 动词组合)命名它们更合适 - 就像你根据它是什么命名一个函数一样做。
鲁克
另一方面,仿函数的实例实际上是一个函数,也许可以更好地命名。按照Jim的建议,
SomethingDoer doSomething; doSomething();
在完成一些代码之后,他们两个似乎都是常见的做法。在stl的GNU实现中,我发现了negate
,plus
,minus
(bits / stl_function.h)等类。variate_generator
,mersenne_twister
(tr1 / random.h)。同样在boost中我找到了类似base_visitor
,predecessor_recorder
(graph / visitors.hpp)以及inverse
,inplace_erase
(icl / functors.hpp)
答案 0 :(得分:4)
对象(以及类)通常代表“事物”,因此你想用名词命名它们。然而,在仿函数的情况下,它们代表“动作”,因此用动词(或某种名词 - 动词组合)命名它们更合适 - 就像你根据它正在做什么命名一个函数一样。 / p>
一般情况下,您可能希望在其目的之后命名(对象,函数等),即它们在程序/世界中所代表的内容。
您可以将仿函数视为具有状态的函数(因此“动作”)。由于实现这一目标的清晰方式(具有与您的“动作”相关联的状态)是创建一个存储状态的对象,因此您将获得一个对象,这实际上是一个“动作”(一种奇特的功能)。
请注意,上述内容适用于可以创建纯仿函数的语言,即调用与常规函数(例如C ++)相同的对象。在不支持此语言的语言中(也就是说,您必须调用operator()
以外的方法,如command.do()
),您可能希望将类似命令的类/对象命名为名词和名称这个方法叫做动词。
答案 1 :(得分:3)
仿函数的类型是一个类,您可以按照通常的样式命名(例如,名词),因为它本身并没有真正做任何事情。另一方面,仿函数的实例实际上是一个函数,也许可以更好地命名。按照Jim的建议,SomethingDoer doSomething; doSomething();
快速查看我自己的代码,可以看出我完全通过使用名词和动词...... Filter
和Show
来完全避免这个问题。但是,在所有情况下应用该命名方案可能会很棘手!
答案 2 :(得分:2)
我建议你给他们一个后缀,如Function
,Callback
,Action
,Command
等等,这样你就会有一个名为SortFunction
的课程, SearchAction
,ExecuteCommand
代替Sort
,Search
,Execute
,听起来更像是实际功能的名称。
答案 3 :(得分:1)
我认为有两种方法可以看到这一点:
1)类可以合理命名,以便在构造时可以直接调用它作为仿函数:
Doer()(); // constructed and invoked in one shot, compiler could optimize
2)实例在我们希望在无状态仿函数对象上多次调用仿函数的情况下,或者当#1的语法不可取时可能出于样式原因。
Doer _do;
_do(); // operator () invocation after construction
我喜欢@ Rook上面的建议,即使用具有相同动词和名词形式的单词命名该类,例如Search
或Filter
。