2012-11-30 130 views
0

我写一个C++函数,它有两个富对象,并增加了第一的元素复制到第二个,像这样:合并函数参数的适当命名约定是什么?

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,ab的名字?我的第一个想法是像MergeFoo,但后来我不知道什么来命名参数,因为我最好的想法是mergermergee这似乎愚蠢的东西。

什么是a,bMyFunction的好名字,以便该函数的用户可以清楚API?

+1

在这种情况下,使用'operator +'可能会更好。 – andre

+1

使用表示“a”和“b”代表的名称。 –

+1

如果你的函数没有执行经典的合并算法,那么不要称之为合并。 – Pubby

回答

0

考虑到所有选项后,我决定最好的选择是类似AverageBarsInPlace(const Foo& new_bars, Foo* existing_bars);。我喜欢Yakk的“InPlace”后缀。我同意可能的回应,说“除非它实际上进行合并,否则不要称之为Merge”。然而,我对这个问题缺乏共识的真正理解是:这个函数的定义范围很不明确。我应该把这个功能分解成更加紧密的块,比如一个功能合并,另一个功能合并。

2

我叫他们merge(),srcdest,但当然有其他好名字。

+0

这是我的第一个想法,但我害怕'dest'是误导性的,因为这意味着它需要一个“空白”Foo,尽管它实际上涉及计算。 –

+0

@RobertMartin:对我而言,'dest'没有这样的内涵(尤其是考虑到这个函数叫做merge()'),但我不能为其他人说话...... – NPE

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 zip两个,然后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)

0

frominto看起来可能是合适的,但是我个人认为它是您的Foo类的一种方法。这意味着没有模棱两可的参数顺序,没有不便的参数命名等。Foo::merge(const Foo& other_foo)

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

+0

我很想让它成为一种方法'Foo'类。不幸的是,我不能修改'Foo'类,所以这不是一个选项。唉。 –

+0

@RobertMartin我猜你可以使用操作符重载选项......除非“merge”的语义与操作符的标准含义非常匹配,否则我会非常犹豫,('+ ='对于一个“集合联盟”风格合并,在我看来)。 – Rook

0

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

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

请注意,顺序是从你的例子交换。

例如,参见增强库,例如,这个:http://www.boost.org/doc/libs/1_52_0/libs/utility/operators.htm

+0

谢谢。顺序被交换,因为我正在使用“输出去最后”约定的函数参数。 –

0

一个维护者期望从像容器一样的对象上'合并'将会是根据merge的功能。你想要完成的是名为transform的STL,它带有一个名为'average'的二元运算符。如果你不使用STL算法,我会命名函数'平均',以避免'合并'