あまりにも多くのパラメーターを渡す次の悪いコードをどのように修正しますか?
void helper1(int p1, int p3, int p5, int p7, int p9, int p10) {
// ...
}
void helper2(int p1, int p2, int p3, int p5, int p6, int p7, int p9, int p10) {
// ...
}
void foo(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8,
int p9, int p10) {
helper1(p1, p3, p5, p7, p9, p10);
helper2(p1, p2, p3, p5, p6, p7, p9, p10);
}
私は2つの異なるアプローチを見ています:
アプローチ 1: すべての関数をクラスに入れる
class Foo {
private:
int p1, p2, p3, p4, p5, p6, p7, p8, p9, p10;
void helper1() {}
void helper2() {}
public:
void foo() {
helper1();
helper2();
}
// add constructor
};
アプローチ 2: パラメータをクラスとして渡すだけ
struct FooOptions {
int p1, p2, p3, p4, p5, p6, p7, p8, p9, p10;
};
void helper1(const FooOptions& opt) {
// ...
}
void helper2(const FooOptions& opt) {
// ...
}
void foo(const FooOptions& opt) {
helper1(opt);
helper2(opt);
}
アプローチの長所と短所は何ですか?
アプローチ 1 の利点は、helper
関数を仮想化すると、それらをサブクラス化してオーバーロードできるため、柔軟性が増すことです。しかし、私の場合 (私が示したおもちゃのミニの例を除いて)、そのようなヘルパーはテンプレート化されることが多いため、とにかく仮想化することはできません。
アプローチ 2 の利点は、ヘルパー関数を他の関数からも簡単に呼び出すことができることです。
(この質問は関連していますが、これら2つの選択肢については説明していません。)