我正在编写一个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
,但后来我不确定如何命名参数,因为我最好的想法就像merger
和mergee
似乎是愚蠢的。
a
,b
和MyFunction
有哪些好名称,以便此功能的用户可以清楚使用API?
答案 0 :(得分:2)
我会称他们为merge()
,src
和dest
,但当然还有其他好名字。
答案 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)
from
和into
似乎可能是合适的,但我个人认为它是您Foo
课程的一种方法。这意味着没有模糊的参数顺序,没有不方便的参数命名等... Foo::merge(const Foo& other_foo)
顺便说一句,我会考虑把它称为不同的东西。合并对我来说,最终结果是原始组件的集合并,而你正在做某种移动平均计算,或类似的。我没有一个好的替代名称来建议,因为我不知道Foo
,Bar
或Average
的实际目的或功能,所以必须要起来给你!
答案 3 :(得分:0)
常见的C ++命名约定是lhs
和rhs
。这意味着左侧和右侧。通常,如果函数修改其中一个参数,那将是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)
我们可以这样定义一个合并函数:一个实例吸收另一个实例释放的元素。所以这导致我使用参数名称 absorber
和 releaser
在 PHP 中,这会导致以下函数定义:
public function merge(ClassName $absorber, ClassName $releaser): void