你是否将名词用于表示可调用对象的类名?

时间:2012-05-30 06:41:06

标签: coding-style functor callable

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

我理解类表示对象的类型,我们应该使用名词作为名称。但是在许多语言中都支持function objects,它们更像是函数而不是对象。我应该将这些类别命名为名词,或者在这种情况下动词是否正常。从语义上讲,doSomething()Something()更有意义。

更新/结论

我得到的两个最高投票的答案分享了一个混合的意见:

  

阿提拉

     

在仿函数的情况下,它们代表“动作”,因此用动词(或某种名词 - 动词组合)命名它们更合适 - 就像你根据它是什么命名一个函数一样做。

     

鲁克

     

另一方面,仿函数的实例实际上是一个函数,也许可以更好地命名。按照Jim的建议,SomethingDoer doSomething; doSomething();

在完成一些代码之后,他们两个似乎都是常见的做法。在stl的GNU实现中,我发现了negateplusminus(bits / stl_function.h)等类。variate_generatormersenne_twister(tr1 / random.h)。同样在boost中我找到了类似base_visitorpredecessor_recorder(graph / visitors.hpp)以及inverseinplace_erase(icl / functors.hpp)

的类

4 个答案:

答案 0 :(得分:4)

对象(以及类)通常代表“事物”,因此你想用名词命名它们。然而,在仿函数的情况下,它们代表“动作”,因此用动词(或某种名词 - 动词组合)命名它们更合适 - 就像你根据它正在做什么命名一个函数一样。 / p>

一般情况下,您可能希望在其目的之后命名(对象,函数等),即它们在程序/世界中所代表的内容。

您可以将仿函数视为具有状态的函数(因此“动作”)。由于实现这一目标的清晰方式(具有与您的“动作”相关联的状态)是创建一个存储状态的对象,因此您将获得一个对象,这实际上是一个“动作”(一种奇特的功能)。

请注意,上述内容适用于可以创建纯仿函数的语言,即调用与常规函数(例如C ++)相同的对象。在不支持此语言的语言中(也就是说,您必须调用operator()以外的方法,如command.do()),您可能希望将类似命令的类/对象命名为名词和名称这个方法叫做动词。

答案 1 :(得分:3)

仿函数的类型是一个类,您可以按照通常的样式命名(例如,名词),因为它本身并没有真正做任何事情。另一方面,仿函数的实例实际上是一个函数,也许可以更好地命名。按照Jim的建议,SomethingDoer doSomething; doSomething();

快速查看我自己的代码,可以看出我完全通过使用名词和动词...... FilterShow来完全避免这个问题。但是,在所有情况下应用该命名方案可能会很棘手!

答案 2 :(得分:2)

我建议你给他们一个后缀,如FunctionCallbackActionCommand等等,这样你就会有一个名为SortFunction的课程, SearchActionExecuteCommand代替SortSearchExecute,听起来更像是实际功能的名称。

答案 3 :(得分:1)

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

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

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

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

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

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