合并函数参数的适当命名约定是什么?

时间:2012-11-30 19:32:31

标签: c++ naming-conventions

我正在编写一个C ++函数,它接受两个Foo对象,并将第一个元素添加到第二个,如下所示:

MyFunction(const Foo& a, Foo* b) {
  for (int i = 0; i < a.bar_count(); i++) {
    b->Bar(i) = b->HasBar(i) ? Average(a.Bar(i), b->Bar(i)) : a.Bar(i);
  }
}

这显然是一个玩具示例,但我的观点是:MyFunctionab的名称应该是什么?我的第一个想法是MergeFoo,但后来我不确定如何命名参数,因为我最好的想法就像mergermergee似乎是愚蠢的。

abMyFunction有哪些好名称,以便此功能的用户可以清楚使用API​​?

7 个答案:

答案 0 :(得分:2)

我会称他们为merge()srcdest,但当然还有其他好名字。

答案 1 :(得分:0)

这看起来像是一个就地zip - 然后是平均操作。 (http://docs.python.org/2/library/functions.html#zip

因此,请使用迭代器访问而不是索引访问。然后http://www.boost.org/doc/libs/1_41_0/libs/iterator/doc/zip_iterator.html压缩两个,然后http://www.boost.org/doc/libs/1_35_0/libs/iterator/doc/transform_iterator.html将结果转换回第一个迭代器(条件平均值)。

用C ++编写会有点烦人。

超过boost::optional<bar>的迭代器,压缩成一对,然后通过取一个或平均值来生成boost::optional<bar>

那么,left.ZipThenAverageInPlace( right )

答案 2 :(得分:0)

frominto似乎可能是合适的,但我个人认为它是您Foo课程的一种方法。这意味着没有模糊的参数顺序,没有不方便的参数命名等... Foo::merge(const Foo& other_foo)

顺便说一句,我会考虑把它称为不同的东西。合并对我来说,最终结果是原始组件的集合并,而你正在做某种移动平均计算,或类似的。我没有一个好的替代名称来建议,因为我不知道FooBarAverage的实际目的或功能,所以必须要起来给你!

答案 3 :(得分:0)

常见的C ++命名约定是lhsrhs。这意味着左侧和右侧。通常,如果函数修改其中一个参数,那将是lhs。所以在你的例子中:

void MyFunction(Foo& lhs, const Foo& rhs);

请注意,订单是从您的示例中换出的。

例如,请参阅升级库,例如这个:http://www.boost.org/doc/libs/1_52_0/libs/utility/operators.htm

答案 4 :(得分:0)

根据merge,维护者对像容器这样的容器上的“合并”的期望是什么。你想要完成的是名为transform的STL,其中二进制运算符名为'average'。如果你不使用STL算法,我会将函数命名为'average'以避免'merge'

答案 5 :(得分:0)

在考虑了所有选项后,我认为最好的选择是AverageBarsInPlace(const Foo& new_bars, Foo* existing_bars);。我喜欢Yakk的“InPlace”后缀。我同意可能的回复说“不要称之为Merge,除非它实际上正在进行合并”。

然而,我对这个问题缺乏共识的真正看法是:这个函数的范围定义不明确。我应该将函数分解为更有凝聚力的块,例如一个函数进行合并,另一个函数进行平均。

答案 6 :(得分:0)

我们可以这样定义一个合并函数:一个实例吸收另一个实例释放的元素。所以这导致我使用参数名称 absorberreleaser

在 PHP 中,这会导致以下函数定义:

public function merge(ClassName $absorber, ClassName $releaser): void