7

这里有一个更通用的问题。将此视为对此的扩展。

我知道类代表对象的类型,我们应该使用名词作为它们的名称。但是许多语言支持的函数对象更像函数而不是对象。我应该将这些类也命名为名词,还是在这种情况下可以使用动词。doSomething(),从语义上讲,比 更有意义Something()

更新/结论

我得到的两个投票最多的答案意见不一:

阿提拉

然而,在函子的情况下,它们代表“动作”,因此用动词(或某种名词-动词组合)命名它们更合适——就像根据函数的作用命名函数一样。

另一方面,仿函数的实例实际上是一个函数,因此可能会更好地命名。按照上面吉姆的建议,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) 之类的类

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等,这样你就可以拥有名为SortFunction,的类SearchActionExecuteCommand而不是Sort, SearchExecute这听起来更像是实际函数的名称。

于 2012-06-12T13:11:26.450 回答
1

我认为有两种方法可以看到这一点:

1) 可以合理命名的,以便在构造时直接将其作为仿函数调用:

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

2)我们希望在无状态仿函数对象上多次调用仿函数的情况下的实例,或者可能出于风格原因,当 #1 的语法不优选时。

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

我喜欢上面@Rook 的建议,即用具有相同动词和名词形式的单词命名类,例如Searchor Filter

于 2012-06-12T15:59:08.380 回答