Как должен действовать конструктор при предоставлении недопустимых параметров?
Если класс имеет конструктор, который принимает некоторый объект значения в качестве параметра и полагается на это для его инициализации. Как он должен реагировать, если этот объект равен нулю?
class SomeClass
{
private SomeData _data;
public SomeClass(SomeValueObject obj)
{
_data = obj.Data;
}
}
Это один из примеров, но в целом: как должен работать конструктор, если ему заданы недопустимые параметры и, следовательно, он не может правильно построить конструкцию? Должен ли он просто вернуться без инициализации? Задайте параметры для некоторых значений по умолчанию? Выбросить исключение? Что-то другое?
Я уверен, что ответ на этот вопрос: "Это зависит", но есть ли какие-либо лучшие практики и т.д.?
Ответы
Ответ 1
Программисту следует уметь предположить, что объект был успешно создан, если только не было создано исключение. Тип исключения зависит от аргумента, но, тем не менее, должен быть снят. Последнее, что вы хотите, это конструктор, который не может построить действительный объект и не сообщает об этом вызывающему.
Я думаю, что использование значений по умолчанию в конструкторе является опасной привычкой.
Ответ 2
Многое зависит от вашей бизнес-логики. Если ваша бизнес-логика требует, чтобы SomeValueObject
не был null, значение SomeClass
не могло быть создано без SomeValueObject
, тогда конструктор должен обязательно выбросить исключение, возможно, IllegalArgumentException
.
Ответ 3
Кажется, что это Java, но в С++ он должен окончательно выбраться (a std::invalid_argument
even).
См. С++ FAQ Lite 17.2.
Я предполагаю, что для Java это точно то же самое.
В редких случаях, когда исключения бросания слишком большие, вы должны вернуться и установить флаг в объекте, который он не создал должным образом. Затем проверьте функцию члена isValid()
.
Ответ 4
Выбросить исключение нулевого аргумента.
Ответ 5
Если поле является критическим, оно должно указывать исключение, указывающее, что объект не должен использоваться. Если это не критично, вы можете назначить значения по умолчанию.
Ответ 6
Если объект может иметь недопустимые значения по умолчанию, он должен инициализировать значения по умолчанию и ждать инициализации. Например, foo.set_values(...)
. В этом случае должен быть запрос is_ready()
или is_valid()
, чтобы разрешить проверку перед использованием.
Если объект абсолютно не может находиться в недопустимом состоянии данных, он должен выдать исключение.
Оба этих случая - это вещи, которые я обнаружил.