0

我正在编写一个 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);
  }
}

MyFunction显然,这是一个玩具示例,但我的意思是:a和的名称应该是什么b?我的第一个想法是这样的,MergeFoo但后来我不确定如何命名参数,因为我最好的想法是这样的mergermergee而且看起来很愚蠢。

a, b, 和的好名字是什么,MyFunction这样 API 对这个函数的用户来说是清楚的?

4

7 回答 7

2

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

于 2012-11-30T19:37:06.407 回答
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>通过取一个或平均(如果两者都存在)来产生 a。

那么,left.ZipThenAverageInPlace( right )?

于 2012-11-30T19:39:16.643 回答
0

from并且into似乎它们可能是合适的,但我个人会将其作为您Foo班级的一种方法。这意味着没有不明确的参数顺序,没有不方便的参数命名等......Foo::merge(const Foo& other_foo)

顺便说一句,我会考虑称它为不同的东西。合并对我来说表明最终结果是原始组件的集合并集,而您正在执行某种移动平均计算或类似计算。我没有一个好的替代名称可以建议,因为我不知道 , or 的实际用途或功能, Foo所以这必须由你决定!BarAverage

于 2012-11-30T19:54:38.353 回答
0

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

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

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

例如,查看 boost 库,例如: http: //www.boost.org/doc/libs/1_52_0/libs/utility/operators.htm

于 2012-11-30T20:07:03.830 回答
0

根据merge,维护者对容器类对象的“合并”期望是功能。您想要完成的是在名为transform的 STL 中使用名为“average”的二元运算符。如果您不使用 STL 算法,我会将函数命名为“平均”以避免“合并”

于 2012-11-30T20:34:07.493 回答
0

在考虑了所有选项后,我决定最好的选择是AverageBarsInPlace(const Foo& new_bars, Foo* existing_bars);. 我喜欢 Yakk 的“InPlace”后缀。我同意可能会说“Merge除非它实际上在进行合并,否则不要调用它”的回答。

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

于 2013-01-14T16:51:11.240 回答
0

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

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

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

于 2021-01-22T14:59:02.650 回答