Как должен действовать конструктор, если заданы неверные параметры? - PullRequest
15 голосов
/ 30 января 2010

Если класс имеет конструктор, который принимает некоторый объект-значение в качестве параметра и использует его для инициализации.Как это должно реагировать, если этот объект нулевой?

class SomeClass
{
    private SomeData _data; 
    public SomeClass(SomeValueObject obj)
    {
        _data = obj.Data;
    }
}

Это один из примеров, но в целом: как должен действовать конструктор, если ему заданы недопустимые параметры и, следовательно, он не может выполнить построение правильно?Должен ли он просто вернуться без какой-либо инициализации?Установить параметры для некоторых значений по умолчанию?Бросить исключение?Что-то другое?

Я уверен, что ответ на этот вопрос "Это зависит", но есть ли лучшие практики и т.д.?

Ответы [ 6 ]

15 голосов
/ 30 января 2010

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

Я думаю, использование значений по умолчанию в конструкторе - опасная привычка.

6 голосов
/ 30 января 2010

Многое зависит от вашей бизнес-логики. Если ваша бизнес-логика требует, чтобы SomeValueObject не было нулевым, то есть SomeClass нельзя было бы создать без SomeValueObject, тогда конструктор обязательно должен выдать исключение, вероятно IllegalArgumentException.

3 голосов
/ 30 января 2010

Похоже, что это Java, но в C ++ оно должно определенно генерировать (std::invalid_argument даже).

См. C ++ FAQ Lite 17.2 .

Полагаю, что для Java это точно так же.

В тех редких случаях, когда выбрасывание исключений представляет собой слишком большую нагрузку, вы должны вернуться и установить флаг в объекте, который он не сконструировал должным образом. После этого проверьте функцию-член isValid().

2 голосов
/ 30 января 2010

Бросить исключение пустого аргумента.

1 голос
/ 30 января 2010

Если объект может иметь недопустимые значения по умолчанию, то он должен инициализироваться до значений по умолчанию и ждать инициализации. Например, foo.set_values(...). В этом случае должен быть запрос is_ready() или is_valid(), чтобы разрешить проверку перед использованием.

Если объект абсолютно не может находиться в недопустимом состоянии данных, он должен выдать исключение.

Оба эти случая - вещи, которые я включил.

1 голос
/ 30 января 2010

Если поле является критическим, оно должно вызвать исключение, чтобы указать, что объект не должен использоваться. Если это не критично, вы можете назначить значения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...