Если, например, у меня настроен конструктор, поэтому я могу создавать такие объекты:
Node node = NodeBuilder()
.withName(someName)
.withDescription(someDesc)
.withData(someData)
.build();
Как я могу убедиться, что все переменные, используемые для построения объекта, были установлены до метода сборки?
Eg:
Node node = NodeBuilder()
.withName(someName)
.build();
Не является полезным узлом, потому что описание и данные не были установлены.
Причина, по которой я использую шаблон конструктора, заключается в том, что без него мне потребовалось бы много комбинаций конструкторов. Например, имя и описание можно задать, взяв объект Field
, а данные можно задать, используя имя файла:
Node node = NodeBuilder()
.withField(someField) //Sets name and description
.withData(someData) //or withFile(filename)
.build(); //can be built as all variables are set
В противном случае потребуется 4 конструктора (поле, данные), (поле, имя файла), (имя, описание, данные), (имя, описание, имя файла). Что становится намного хуже, когда требуется больше параметров.
Причина этих «удобных» методов заключается в том, что необходимо построить несколько узлов, поэтому он сохраняет много повторяющихся строк, таких как:
Node(modelField.name, modelField.description, Data(modelFile)),
Node(dateField.name, dateField.description, Data(dateFile)),
//etc
Но бывают случаи, когда необходимо построить узел с данными, полученными не из файла, и/или имя и описание не основаны на поле. Также может быть несколько узлов с одинаковыми значениями, поэтому вместо:
Node(modelField, modelFilename, AlignLeft),
Node(dateField, someData, AlignLeft),
//Node(..., AlignLeft) etc
Вы можете иметь:
LeftNode = NodeBuilder().with(AlignLeft);
LeftNode.withField(modelField).withFile(modelFilename).build(),
LeftNode.withField(dateField).withData(someData).build()
Поэтому я думаю, что мои потребности вполне соответствуют шаблону конструктора, за исключением возможности создавать незавершенные объекты. Обычная рекомендация «поместить обязательные параметры в конструктор и использовать методы компоновщика для необязательных параметров» здесь не применяется по вышеуказанным причинам.
Актуальный вопрос: как я могу убедиться, что все параметры были установлены до вызова сборки во время компиляции? Я использую С++11.
(Во время выполнения я могу просто установить биты флага для каждого параметра и утверждать, что все флаги установлены в сборке)
В качестве альтернативы существует ли какой-либо другой шаблон для работы с большим количеством комбинаций конструкторов?
build
выдает исключение, если обязательное поле не установлено. Я не могу придумать, как сделать это проверкой во время компиляции. - person Some programmer dude   schedule 20.05.2016withX
возвращает другой тип, оценкаbuild()
может проверять (во время компиляции), выполняются ли условия. Но все это довольно сложная задача. - person Claas Bontus   schedule 20.05.2016