1

この問題でコードの重複を排除したいと思います。

class PopulationMember
{
public:
    vector<int> x_;
    vector<int> y_;
}

class Population
{
    vector<PopulationMember*> members_;

    void doComputationforX_1();  // uses the attribute x_ of all members_
    void doComputationforX_2();  
    void doComputationforX_3();

    void doComputationforY_1();  // exactly same as doComputationforX_1, but 
    void doComputationforY_2();  // uses the attribute y_ of all members_
    void doComputationforY_3();  

 EDIT: // there are also functions that use all the members_ simultaniously

    double standardDeviationInX(); // computes the standard deviation of all the x_'s
    double standardDeviationInY(); // computes the standard deviation of all the y_'s
}

二重性により、メソッドが 3 つではなく 6 つになりました。ペアワイズの類似性は非常に印象的であるため、「x_」を「y_」に置き換えるだけで、doComputationforX_1 から doComputationforY_1 の実装を取得できます。

私はこの方法で問題を作り直すことを考えました:

class PopulationMember
{
public:
    vector<vector<int>> data_; // data[0] == x_ and data[1] == y_ 
} 

しかし、この方法ではわかりにくくなります。

一般に、プリコンパイラ マクロが悪い解決策であることはわかっていますが、他に見当たりません。私の潜在意識はテンプレートを提案し続けていますが、それらをどのように使用できるかわかりません.

4

2 に答える 2

2

x_同じものをy_別々に維持したい場合はclass PopulationMember、ソリューションではなく、値渡しソリューションを選択することをお勧めしますtemplate

ジェネリックメソッドを次のように定義します。

void doComputationfor (vector<int> (PopulationMember::*member_));
                // pointer to data  ^^^^^^^^^^^^^^^^^^^^^^^^^^

それを次のように呼びます:

doComputationfor(&PopulationMember::x_);
doComputationfor(&PopulationMember::y_);

あなたdoComputationforが十分に大きい場合、templateメソッドを課すことはコードの重複を引き起こすことを覚えておいてください。
メンバーメソッドへのポインタを使用すると、実行時のペナルティを少し抑えながら、コードの重複を回避できます。

于 2012-03-08T04:58:04.853 に答える
1

指定したAPIがクラスのユーザーに表示したいものとまったく同じである場合は、Populationでプライベートメソッドを作成します。doComputation_1( const vector<int> &v ) { do stuff on v; }

次に、パブリック実装を1行の長さにします。

public:
    void DoComputationX_1() { doComputation_1( x_ ); }
    void DoComputationY_1() { doComputation_1( y_ ); }
private:
    // drop the 'const' if you will need to modify the vector
    void doComputation_1( const vector<int> &v ) { do stuff on v; }

これが正しい解決策だとは思いませんが、もっと意味のあるものを提供するために、クラスが実際にやろうとしていることをまとめることはできません。

于 2012-03-08T04:55:01.380 に答える