предотвращение скуки дополнительных параметров

Если у меня есть конструктор с, говорят, что 2 обязательных параметра и 4 дополнительных параметра, как я могу постараться не писать 16 конструкторам или даже этим приблизительно 10 конструкторам, которых я должен был бы записать, использовал ли я параметры по умолчанию (который я не люблю, потому что это - плохое самодокументирование)? Есть ли какие-либо идиомы или шаблоны использования методов, которые я могу использовать для создания этого менее утомительным? (И легче поддержать?)

16
задан Kyle 23 April 2010 в 18:14
поделиться

3 ответа

Возможно, вас заинтересует Идиома именованных параметров .

Подводя итог, создайте класс, содержащий значения, которые вы хотите передать конструктору (конструкторам). Добавьте метод для установки каждого из этих значений, и пусть каждый метод будет возвращать return * this; в конце. Имейте в своем классе конструктор, который принимает константную ссылку на этот новый класс. Это можно использовать так:

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');
34
ответ дан 30 November 2019 в 15:43
поделиться

Что, если бы вы создали объект параметра, содержащий все поля? Затем вы можете просто передать это и просто установить любые поля, которые вам нужны. Возможно, у этого шаблона есть название, но не знаю, что это такое ...

ОБНОВЛЕНИЕ:

Код может выглядеть примерно так:

paramObj.x=1;
paramObj.y=2;
paramObj.z=3;
paramObj.magic=true;
... //set many other "parameters here"

someObject myObject = new someObject(paramObj);

и внутри конструктора someObject вы можете установить значения по умолчанию для вещей, которые еще не были установлены (или вызывают ошибку, если это было обязательно).

Честно говоря, я не большой поклонник этого решения, но я использовал его один или два раза, когда paramObj имел смысл, поскольку содержал набор данных, которые обычно все вместе (чтобы мы могли использовать его не только для конструкторов), и это было лучше, чем для нескольких конструкторов. Я обнаружил, что это было некрасиво, но это сработало, YMMV.

9
ответ дан 30 November 2019 в 15:43
поделиться

А теперь ответ на вопрос «У Boost есть кое-что для этого»:

Библиотека параметров ускорения , кажется, хорошо подходит для вашего случая использования.

4
ответ дан 30 November 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: