0

次のように、2 つの Foo オブジェクトを取り、最初の要素を 2 番目のオブジェクトに追加する 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);
  }
}

これは明らかにおもちゃの例ですが、私のポイントは次のとおりです。 MyFunctionaおよびの名前は何bですか?私の最初の考えは次のようなものでしMergeFooたが、私の最善の考えは次のようなものであり、それはばかげているように見えるため、パラメータに何を付けるかわかりませmergermergee

この関数のユーザーにとって API が明確になるようにa、 、b、およびの適切な名前は何ですか?MyFunction

4

7 に答える 7

2

私はそれらmerge()srcとと呼びますdestが、もちろん他にも良い名前があります。

于 2012-11-30T19:37:06.407 に答える
0

メンテナがコンテナのようなオブジェクトの「マージ」に期待するのは、マージによる機能です。達成したいのは、「average」という名前の二項演算子を使用したtransformという名前のSTLです。STLアルゴリズムを使用しない場合は、「マージ」を回避するために関数に「平均」という名前を付けます。

于 2012-11-30T20:34:07.493 に答える
0

一般的な C++ の命名規則はlhsandrhsです。これは左側と右側を意味します。通常、関数がそのパラメーターの 1 つを変更する場合、それはlhs. あなたの例では:

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

あなたの例から注文が入れ替わっていることに注意してください。

たとえば、ブースト ライブラリを参照してください。

于 2012-11-30T20:07:03.830 に答える
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 2 つを圧縮してからhttp://www.boost.org/doc/libs/1_35_0/libs/iterator /doc/transform_iterator.html結果を変換して最初の反復子に戻します (条件付き平均)。

これを C++ で書くのは少し面倒です。

iterator over boost::optional<bar>、ペアに圧縮された場合、 aboost::optional<bar>は一方を取得するか、両方が存在する場合は平均化することによって生成されます。

それで、left.ZipThenAverageInPlace( right )

于 2012-11-30T19:39:16.643 に答える
0

マージ関数を次のように定義できます。インスタンスは、別のインスタンスによって解放された要素を吸収します。したがって、これにより、パラメーター名absorberreleaser

PHP では、これにより次の関数定義が生成されます。

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

于 2021-01-22T14:59:02.650 に答える
0

すべてのオプションを検討した後、最適な選択は次のようなものであると判断しましたAverageBarsInPlace(const Foo& new_bars, Foo* existing_bars);。Yakk の「InPlace」サフィックスが気に入っています。Merge「実際にマージを行っていない限り、それを呼び出さないでください」という多くの回答に同意します。

しかし、この質問に対するコンセンサスの欠如からの私の本当の結論は、この関数のスコープの定義が不十分であるということです。関数を、マージを行う関数と平均化を行う関数など、よりまとまりのあるチャンクに分割する必要があります。

于 2013-01-14T16:51:11.240 に答える
0

frominto適切かもしれませんが、個人的にはあなたのクラスのメソッドにしたいと思いますFoo。つまり、あいまいなパラメーターの順序、不便なパラメーターの命名などはありません...Foo::merge(const Foo& other_foo)

ちなみに、別の呼び方も考えています。私にとってのマージは、最終結果が元のコンポーネントのセットユニオンであることを示唆していますが、ある種の移動平均計算などを行っています。FooBarまたは の実際の目的や機能がわからないため、提案する適切な代替名がありません。Averageそれはあなた次第です。

于 2012-11-30T19:54:38.353 に答える