Стоит ли выбрасывать исключение из конструктора?
По этому вопросу сообщество разработчиков буквально разделилось на два лагеря, «за» и «против», соответственно.
Действительно, это палка о двух концах, давайте разберёмся.
С одной стороны, конструктор - это функция, которая занимается созданием объекта. То есть, перед ним стоит задача инициализировать некий кусок памяти и выдать указатель для дальнейшего использования.
Однако, если что-то пошло не так, то экземпляр типа просто не допускается к существованию.
Предотвратить можно только за
счёт исключения.
С другой стороны, есть практика двухэтапного создания объекта. Сначала готовим данные и проверяем их, затем выделяем память. Подготовку данных можно вынести в отдельный слой, например, валидации.
Или некий фабричный метод. Тогда, вид ошибки (исключение, монада, контейнер) будет зависеть от потребностей в конкретный момент времени.
Обе практики имеют место быть, и между ними можно даже найти баланс. Например,
Но чего уж точно не должно быть в конструкторе - сложной логики.
Только элементарная инициализация.
По этому вопросу сообщество разработчиков буквально разделилось на два лагеря, «за» и «против», соответственно.
Действительно, это палка о двух концах, давайте разберёмся.
С одной стороны, конструктор - это функция, которая занимается созданием объекта. То есть, перед ним стоит задача инициализировать некий кусок памяти и выдать указатель для дальнейшего использования.
Однако, если что-то пошло не так, то экземпляр типа просто не допускается к существованию.
Предотвратить можно только за
счёт исключения.
С другой стороны, есть практика двухэтапного создания объекта. Сначала готовим данные и проверяем их, затем выделяем память. Подготовку данных можно вынести в отдельный слой, например, валидации.
Или некий фабричный метод. Тогда, вид ошибки (исключение, монада, контейнер) будет зависеть от потребностей в конкретный момент времени.
Обе практики имеют место быть, и между ними можно даже найти баланс. Например,
ThrowIfNull
вызовы.Но чего уж точно не должно быть в конструкторе - сложной логики.
Только элементарная инициализация.