Иногда вам нужно написать конструктор, который может потерпеть неудачу. Например, скажем, я хочу создать экземпляр объекта с путем к файлу, что-то вроде
obj = new Object("/home/user/foo_file")
Пока путь указывает на соответствующий файл, все в порядке. Но если строка не является допустимым путем, все должно сломаться. Но как?
Ты мог:
- бросить исключение
- вернуть нулевой объект (если ваш язык программирования позволяет конструкторам возвращать значения)
- вернуть действительный объект, но с флагом, указывающим, что его путь не был установлен правильно (тьфу)
- другие?
Я предполагаю, что «лучшие практики» различных языков программирования будут реализовывать это по-разному. Например, я думаю, что ObjC предпочитает (2). Но (2) было бы невозможно реализовать в C ++, где конструкторы должны иметь void в качестве возвращаемого типа. В этом случае я понимаю, что (1) используется.
На выбранном вами языке программирования вы можете показать, как вы справитесь с этой проблемой, и объяснить, почему?
constructors
initialization
garageàtrois
источник
источник
void
- они возвращают объект.new
вызываетoperator new
для выделения памяти, а затем конструктор для ее заполнения. Конструктор не возвращает ничего иnew
возвращает указатель, полученный от негоoperator new
. Однако, «ничего не возвращает» подразумевает, что «возвращаетсяvoid
» - дело за хваткой.Ответы:
Никогда не стоит полагаться на конструктора для грязной работы. Кроме того, другому программисту также неясно, будет ли работа выполняться в конструкторе, если нет явной документации, подтверждающей это (и что пользователь класса прочитал ее или ему так сказали).
Например (в C #):
Что произойдет, если пользователь не захочет сразу загрузить файл? Что если они захотят сделать кэширование файла по требованию? Они не могут. Вы можете подумать о том, чтобы поместить
bool loadFile
аргумент в конструктор, но тогда это становится грязным, поскольку теперь вам все еще нуженLoad()
метод для загрузки файла.Учитывая текущий сценарий, он будет более гибким и понятным для пользователей класса:
Или в качестве альтернативы (для чего-то вроде ресурса):
источник
В Java вы можете использовать исключения или использовать шаблон фабрики, который позволит вам возвращать ноль.
В Scala вы можете вернуть Option [Foo] из фабричного метода. Это будет работать и на Java, но будет более громоздким.
источник
Брось исключение.
Необходимо проверить наличие нулевого значения, если вы можете вернуть его (и оно не будет проверено)
Для этого и нужны проверенные исключения. Вы знаете, что это может потерпеть неудачу. Абоненты должны справиться с этим.
источник
В C ++ конструкторы используются для создания / инициализации членов класса.
Там нет правильного ответа на этот вопрос. Но то, что я наблюдал до сих пор, - это то, что большую часть времени клиент (или тот, кто собирается использовать ваш API) выбирает, как вы должны справиться с этим.
Иногда они могут попросить вас выделить все ресурсы, которые могут понадобиться объекту в конструкторе, и выдать исключение в случае сбоя (прерывание создания объекта), или ничего не делать в конструкторе, и убедиться, что создание всегда будет успешным. оставляя эти задачи для некоторой функции-члена.
Если вы сами выбираете поведение, исключения являются стандартным способом C ++ для обработки ошибок, и вы должны использовать их, когда можете.
источник
Вы также можете создать экземпляр объекта без параметров или только с параметрами, которые наверняка никогда не потерпят неудачу, и затем вы используете функцию или метод инициализации, из которых вы можете безопасно генерировать исключение или делать все, что пожелаете.
источник
Я предпочитаю не инициализировать какой-либо класс или список в конструкторе. Инициализируйте класс или список, когда вам нужно. Например.
Не делай этого
Вместо этого инициализируйте при необходимости, например.
источник