たとえば、2 つの必須パラメーターと 4 つのオプション パラメーターを持つコンストラクターがある場合、デフォルト パラメーターを使用した場合に作成しなければならない 16 個のコンストラクター、または 10 個ほどのコンストラクターを作成することを回避するにはどうすればよいでしょうか (これは貧弱なので好ましくありません)。自己記録)? テンプレートを使用して退屈を軽減するために使用できるイディオムや方法はありますか? (そして維持しやすい?)
4 に答える
Named Parameter Idiomに興味があるかもしれません。
要約すると、コンストラクターに渡したい値を保持するクラスを作成します。これらの各値を設定するメソッドを追加し、各メソッドがreturn *this;
最後に a を実行するようにします。クラスに、この新しいクラスへの const 参照を取るコンストラクターを用意します。これは次のように使用できます。
class Person;
class PersonOptions
{
friend class Person;
string name_;
int age_;
char gender_;
public:
PersonOptions() :
age_(0),
gender_('U')
{}
PersonOptions& name(const string& n) { name_ = n; return *this; }
PersonOptions& age(int a) { age_ = a; return *this; }
PersonOptions& gender(char g) { gender_ = g; return *this; }
};
class Person
{
string name_;
int age_;
char gender_;
public:
Person(const PersonOptions& opts) :
name_(opts.name_),
age_(opts.age_),
gender_(opts.gender_)
{}
};
Person p = PersonOptions().name("George").age(57).gender('M');
すべてのフィールドを含むパラメーター オブジェクトを作成したらどうなるでしょうか。次に、それを渡し、必要なフィールドを設定するだけです。そのパターンにはおそらく名前がありますが、それが何であるかはわかりません...
アップデート:
コードは次のようになります。
paramObj.x=1;
paramObj.y=2;
paramObj.z=3;
paramObj.magic=true;
... //set many other "parameters here"
someObject myObject = new someObject(paramObj);
コンストラクター内では、someObject
まだ設定されていないものにデフォルトを設定できます (必須の場合はエラーを発生させます)。
正直なところ、私はこのソリューションの大ファンではありませんが、paramObj
通常はすべてが一緒になった一連のデータを含めることで意味がある場合に1、2回使用しました(コンストラクター以外にも使用できます)。複数のコンストラクターよりも優れていました。私はそれが醜いことを発見しましたが、うまくいきました、YMMV。
そして今、「ブーストには何かがあります」という答えがあります:
Boost Parameter Libraryは、ユース ケースに適しているようです。