2012-11-30 128 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算法,我會命名函數'平均',以避免'合併'