Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Философский вопрос. Пример надуманный, но демонстрирует проблему.

Допустим у нас есть класс настроек, который читает данные из .ini файла.
У нас есть два варианта для инициализации и обработки ошибок:

1) Функция инициализации возвращающая признак ошибки.
2) Или исключение вылетающие из конструктора.

В варианте № 1 в деструкторе нужно следить, а были ли мы успешно прочтены и
только тогда сохранять изменения. В варианте № 2 это делать не нужно.

В варианте № 2 такой объект нельзя сделать глобальным.

Вот что предпочтительнее в общем случае?
2 мар 21, 09:57    [22288178]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10925
Настроек по умолчанию совсем нет?
2 мар 21, 10:00    [22288179]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Basil A. Sidorov
Настроек по умолчанию совсем нет?

Это неизвестно. Допустим по умолчанию настроек нет. Но если мы выбрали
путь с исключением, а потом появились настройки по умолчанию… То мы
уже не можем наружу сообщить об ошибке. Всегда успешно!

Это ещё один аспект проблемы. :)
2 мар 21, 10:06    [22288183]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Нужно делать конструктор всегда гарантированно без исключений. Простое правило.
Отсюда вытекает доп функция инициализации
2 мар 21, 10:10    [22288187]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Basil A. Sidorov
Настроек по умолчанию совсем нет?
+1
Как раз показывает что теоретический вопрос разбивается о практику.
Если удалили ini файл, это не значит что мы должны застопорить ИС.
И сообщить всегда можно все что угодно.
2 мар 21, 10:40    [22288198]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
PetroNotC Sharp
Basil A. Sidorov
Настроек по умолчанию совсем нет?
+1
Как раз показывает что теоретический вопрос разбивается о практику.
Если удалили ini файл, это не значит что мы должны застопорить ИС.
И сообщить всегда можно все что угодно.

Логика может быть такая, что если настройки не корректны или отсутствуют, то
мы и не работаем. Потому что работа со значениями по умолчанию бессмысленна
или даже вредна.
2 мар 21, 10:56    [22288205]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10925
Спорная логика, но даже в этом случае должна формироваться пустая конфигурация и приложение будет падать по разыменовыванию null-евого указателя
2 мар 21, 11:09    [22288211]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Basil A. Sidorov
Спорная логика, но даже в этом случае должна формироваться пустая конфигурация и приложение будет падать по разыменовыванию null-евого указателя

Нормальная логика. В таком варианте приложение после MsgBox об ошибке или должно завершить свою работу. Ну или в GUI заблокировать функционал, который опирается на эти настройки.

В данном случае лучше даже упасть, чем начать работу с настройками по умолчанию, если по логике работы настроек по умолчанию быть не может.
2 мар 21, 11:58    [22288241]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav
PetroNotC Sharp
пропущено...
+1
Как раз показывает что теоретический вопрос разбивается о практику.
Если удалили ini файл, это не значит что мы должны застопорить ИС.
И сообщить всегда можно все что угодно.

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

Я бы сказал, что так можно, но не очень профессионально. Надо деньги посчитать. И потерю имиджа)
2 мар 21, 12:10    [22288252]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav
Basil A. Sidorov
Спорная логика, но даже в этом случае должна формироваться пустая конфигурация и приложение будет падать по разыменовыванию null-евого указателя

Нормальная логика. В таком варианте приложение после MsgBox об ошибке или должно завершить свою работу. Ну или в GUI заблокировать функционал, который опирается на эти настройки.

В данном случае лучше даже упасть, чем начать работу с настройками по умолчанию, если по логике работы настроек по умолчанию быть не может.
в крайнем случае я Message Box выдаю Переустановите систему.
Так как диалоги должны давать ответ Что юзверю делать.
2 мар 21, 12:13    [22288256]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Также интересна система не имеющая default settings
Калькулятор?
2 мар 21, 12:17    [22288261]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

PetroNotC Sharp
Также интересна система не имеющая default settings

Любое коммерческое приложение у которого лицензионный ключ - часть настроек.

Posted via ActualForum NNTP Server 1.5

2 мар 21, 13:42    [22288328]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Дефолтный конфиг все таки можно создать. Его задача будет - стать реплейсментом для тех
полей которые были некорректны в кастомном конфиге. И конструктор все-таки должен
отработать без исключений и без ошибок. Это будет в духе следования принципам convention over
configuration. И после того как конструктор отработал успешно. Можно смотреть статусы
всех пропертей и смотреть какие из них были взяты из кастомного конфига и какие заменены на
дефолт. С ключами тоже что-то можно придумать. Сделать ключ-заглушку.

Падающий конструктор - всегда плохо. У нас не остается следа для анализа. Нет объекта - нет дампа.

Как говорят менты - нету трупа - нету уголовного дела.
2 мар 21, 13:49    [22288333]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,
Я думаю, просто нет таких без настроек по умолчанию.
У меня положение окна главного это настройки.
Если настроек нет (первый старт) то я запускаю default Left, TOP, w, h окна.
2 мар 21, 15:38    [22288442]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921
Где-то в глубинах корпоративной сети стоит сервер на котором крутится Самая Главная База.
Какие настройки ты пропишешь по умолчанию для подключения к ней?

А размеры и положение окна это не настройки, это сохранённое состояние, как у игры какой-нибудь.

Сообщение было отредактировано: 2 мар 21, 15:50
2 мар 21, 15:55    [22288459]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Dimitry Sibiryakov,


Забудь про игры. Состояние вполне может быть настройкой.
Вот принял сегодня на грудь. Вполне настроился на работу)))))
2 мар 21, 15:59    [22288464]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
petrav
Философский вопрос. Пример надуманный, но демонстрирует проблему.

Допустим у нас есть класс настроек, который читает данные из .ini файла.
У нас есть два варианта для инициализации и обработки ошибок:

1) Функция инициализации возвращающая признак ошибки.
2) Или исключение вылетающие из конструктора.

В варианте № 1 в деструкторе нужно следить, а были ли мы успешно прочтены и
только тогда сохранять изменения. В варианте № 2 это делать не нужно.

В варианте № 2 такой объект нельзя сделать глобальным.

Вот что предпочтительнее в общем случае?


А почему если исключение, то обязательно вылетающее из конструктора?

Почему нет варианта "функция инициализации, выбрасывающая исключение" ?

Что сложного в проверке "а были ли мы успешно прочтены и только тогда сохранять изменения." ?


В общем случае не понятно что предпочтительнее. Потому что нет требований к этому куску ПО.

Можно и так, и эдак , и разэдак, все три варианта допустимы.
Исключение из конструктора -- ничего в этом нет.
2 мар 21, 16:04    [22288470]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34688
PetroNotC Sharp
petrav,
Нужно делать конструктор всегда гарантированно без исключений. Простое правило.
Отсюда вытекает доп функция инициализации


Ну , есть такой подход, но там по-другому -- конструктор не должен ничего сложного делать (типа чтения файла).

А исключение из него бросить -- нет проблем.
2 мар 21, 16:05    [22288472]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Dimitry Sibiryakov
Где-то в глубинах корпоративной сети стоит сервер на котором крутится Самая Главная База.
Какие настройки ты пропишешь по умолчанию для подключения к ней?

Пишешь
host : localhost
port : 1551
user : scott
pwd : tiger

Конструктор конфигов отрабатывает успешно. Не падает. Цель - достигнута.

Опция успеха подключения к БД - это уже вторая задача и ее надо изучать отдельно от первой.
2 мар 21, 16:29    [22288490]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
MasterZiv
PetroNotC Sharp
petrav,
Нужно делать конструктор всегда гарантированно без исключений. Простое правило.
Отсюда вытекает доп функция инициализации


Ну , есть такой подход, но там по-другому -- конструктор не должен ничего сложного делать (типа чтения файла).

Почему же не должен?
2 мар 21, 18:40    [22288583]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
MasterZiv
petrav
Философский вопрос. Пример надуманный, но демонстрирует проблему.

Допустим у нас есть класс настроек, который читает данные из .ini файла.
У нас есть два варианта для инициализации и обработки ошибок:

1) Функция инициализации возвращающая признак ошибки.
2) Или исключение вылетающие из конструктора.

В варианте № 1 в деструкторе нужно следить, а были ли мы успешно прочтены и
только тогда сохранять изменения. В варианте № 2 это делать не нужно.

В варианте № 2 такой объект нельзя сделать глобальным.

Вот что предпочтительнее в общем случае?


А почему если исключение, то обязательно вылетающее из конструктора?

Почему нет варианта "функция инициализации, выбрасывающая исключение" ?

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

Кстати, вариант с функцией инициализации тем фундаментально-то и плох: сконструирован
объект в некорректном состоянии. И он в таком состоянии доступен остальным объектам.

MasterZiv
Что сложного в проверке "а были ли мы успешно прочтены и только тогда сохранять изменения." ?

Не сложно. Но мы тут просто рассуждаем. То да сё.
2 мар 21, 19:03    [22288602]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav
MasterZiv
пропущено...


Ну , есть такой подход, но там по-другому -- конструктор не должен ничего сложного делать (типа чтения файла).

Почему же не должен?
нельзя I/O
Не масштабируемо. Не потокоустойчиво. Не дуракоустойчиво
2 мар 21, 19:15    [22288610]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
>объект настроек или сконструирован, или же нет
Ты собрался стоить главное окно приложения.
2 мар 21, 19:19    [22288616]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
PetroNotC Sharp
petrav
пропущено...

Почему же не должен?
нельзя I/O
Не масштабируемо. Не потокоустойчиво. Не дуракоустойчиво

А почему не потокоустойчиво?
2 мар 21, 20:10    [22288642]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Ну какие Райзе в потоках
2 мар 21, 20:24    [22288648]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
PetroNotC Sharp
mayton,
Ну какие Райзе в потоках

Заратустра не велит?
2 мар 21, 21:36    [22288678]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
L.Otujktd
Member

Откуда:
Сообщений: 111
petrav,

Я бы исходил из того, насколько критично будет использовать объект с дефолтными настройками. Но в любом случае надо как-то юзеру или клиентскому коду дать понять что инициализация прошла не так как ожидалась. Init вполне может бросить исключение, вполне рабочий вариант. Ну и добавить метод IsDefault.
2 мар 21, 22:00    [22288681]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Тут - вопрос смыслов. Что вернет конструктор. Конструктор не может вернуть недо-созданный объект.
Помним RAII. Конструктор конфигурации - должен вернуть конфигурацию. Значит - безсмысленно
возвращать конечный автомат который ждет вызова какой-то функции которая еще что-то будет
делать типа init и прочее. Если вы - делаете так - тогда меняйте смыслы. Переименовывайте
этот объект в парсер конфигураций. Вобщем как говорил кэп Врунгель - как вы яхту назовёте - так
она и плывет.
2 мар 21, 22:05    [22288683]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
L.Otujktd
Member

Откуда:
Сообщений: 111
mayton,

Тут получается да, один объект порождает другой. Т.е. если совсем не смогли прочитать ini файл то можно вернуть нулевой указатель на объект с конфигурацией, если смогли прочитать только часть то можно сгенерировать развёрнутый эксепшен и дальше уже решать что делать
2 мар 21, 22:13    [22288685]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
L.Otujktd,
Что значит не смогли прочитать?
Отсюда и идёт вилка вариантов на миллион.
15 причин и 15 путей решения.
Чё их все тут в топике обсуждать?
2 мар 21, 22:20    [22288689]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Он в шапке пишет - "Философский вопрос..."
2 мар 21, 22:24    [22288691]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Ага. Вопросы философии которые нельзя применить на практике.
2 мар 21, 22:39    [22288696]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
У меня сейчас прога в систрее переключает раскладку клавы.
Периодически при старте системы антивирус грохает её ini файл.
Потом она грузится и печально пишет: "не найден файл настроек. Восстановить из копии"?
Все логично, ясно и понятно.
2 мар 21, 22:43    [22288699]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
PetroNotC Sharp
mayton,
У меня сейчас прога в систрее переключает раскладку клавы.
Периодически при старте системы антивирус грохает её ini файл.

Жалко, что этот антивирус при каждой загрузке ОС тебе не грохает все средства
разработки как потенциально вредное и небезопасное в твоих руках ПО (разработки).

Сообщение было отредактировано: 2 мар 21, 23:05
2 мар 21, 23:11    [22288710]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav
PetroNotC Sharp
пропущено...
+1
Как раз показывает что теоретический вопрос разбивается о практику.
Если удалили ini файл, это не значит что мы должны застопорить ИС.
И сообщить всегда можно все что угодно.

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


petrav,
Твое?
Твою логику никто не понял.
3 мар 21, 07:09    [22288787]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
Dimitry Sibiryakov
Где-то в глубинах корпоративной сети стоит сервер на котором крутится Самая Главная База.
Какие настройки ты пропишешь по умолчанию для подключения к ней?

Пишешь
host : localhost
port : 1551
user : scott
pwd : tiger

Конструктор конфигов отрабатывает успешно. Не падает. Цель - достигнута.

Опция успеха подключения к БД - это уже вторая задача и ее надо изучать отдельно от первой.

Это то о чём я и говорю: дальнейшая работа бессмысленна. А иногда и вредна.

Допустим в поле host у нас ошибка, IP записан так: 12.12.12-12. Запускаемся, отображаем MsgBox о
том, что ошибка в конфиге. И заменяем IP на localhost. Пользователь думает: чё это было, дайка винду
перезагружу. Перезагружается, а там уже localhost в настройках записано!

И никаких ошибок уже не отображается. Он нажимает Connect. Ошибка. И теперь пользователь думает:
сеть барахлит, дайка я отдохну пока они БД поднимают, ведь работа невозможна, все отдыхают.

Вот зачем такое? :)
3 мар 21, 10:18    [22288849]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
>Допустим в поле host у нас ошибка, IP записан так: 12.12.12-12.
== ошибки из воздуха не появляются. Файл ini это не мусора.
Не можешь работать с ini бери субд или xml с валидацией по схеме.
3 мар 21, 10:26    [22288854]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
petrav
mayton
пропущено...

Пишешь
host : localhost
port : 1551
user : scott
pwd : tiger

Конструктор конфигов отрабатывает успешно. Не падает. Цель - достигнута.

Опция успеха подключения к БД - это уже вторая задача и ее надо изучать отдельно от первой.

Это то о чём я и говорю: дальнейшая работа бессмысленна. А иногда и вредна.

Допустим в поле host у нас ошибка, IP записан так: 12.12.12-12. Запускаемся, отображаем MsgBox о
том, что ошибка в конфиге. И заменяем IP на localhost. Пользователь думает: чё это было, дайка винду
перезагружу. Перезагружается, а там уже localhost в настройках записано!

И никаких ошибок уже не отображается. Он нажимает Connect. Ошибка. И теперь пользователь думает:
сеть барахлит, дайка я отдохну пока они БД поднимают, ведь работа невозможна, все отдыхают.

Вот зачем такое? :)

Я тебе просто принцип показал. И IP адрес не имеет значения. Ты мог добавить свойство

enableConnection : false


И приложение будет пропускать попытку коннекта, сообщаяя пользователю что конфигурация
еще не завершена. Как отображать - это другая тема, которая к топику не имеет отношения.
Главная цель достигнута. Твой конструктор не падает.

Ты ведь этого хотел?
3 мар 21, 10:54    [22288868]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton,

Когда это у меня конструктор падал?
3 мар 21, 11:04    [22288875]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Давай в начало вернемся. В твой самый первый филососфкий пост. Ты пишешь про бросание исключений из конструктора.
3 мар 21, 11:15    [22288881]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
Давай в начало вернемся. В твой самый первый филососфкий пост. Ты пишешь про бросание исключений из конструктора.

Исключение из конструктора — это не падение конструктора. Это не проблема. Это приём
программирования: если объект не может быть создан корректно, то он и не создаётся. И
соответственно в последствии не разрушается.

В этом и есть вопрос: стоит ли этим пользоваться в подобных ситуациях. Не стоял вопрос:
у меня конструктор падает, памагите.
3 мар 21, 11:29    [22288901]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Тебе вроде ответили несколько человек что есть практика гарантированно создавать объект.
Ты им не поверил.
Для упрямых говорят - сам себе ССЗБ...
Я в детстве тоже не создавал и потом по всему коду был без настроек и на null проверял.
)))
3 мар 21, 11:40    [22288907]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10925
Насколько я помню Мейеса, исключение, выброшенное конструктором, исключает и вызов деструктора.
Или модерновые плюсы стали настолько продвинутыми, что могут сами разобрать(ся) какие куски деструктора вызывать, а какие нет?
3 мар 21, 12:30    [22288960]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
Basil A. Sidorov
Или модерновые плюсы стали настолько продвинутыми, что могут сами разобрать(ся) какие куски деструктора вызывать, а какие нет?

Нет, ничего не изменилось.
3 мар 21, 12:48    [22288977]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
PetroNotC Sharp
petrav,
Тебе вроде ответили несколько человек что есть практика гарантированно создавать объект.
Ты им не поверил.
Для упрямых говорят - сам себе ССЗБ...
Я в детстве тоже не создавал и потом по всему коду был без настроек и на null проверял.
)))

Послушай, мой малограмотный дружочек, можно тебя попросить не отвечать на мои посты?
Ну ты реально достал уже своим бессодержательным флудом.
Модератор: Джентльмены. К порядку.


Сообщение было отредактировано: 3 мар 21, 13:02
3 мар 21, 12:51    [22288981]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
Покажи, кто понял тут твои метания)))))
3 мар 21, 13:07    [22288995]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Он спросил. Что предпочтительнее.

Я думаю что оба варианта плохие. Но мне нравится более атомарный вариант класса конфигурации
когда конструктор делает 100% подготовительной работы и не падает.
3 мар 21, 13:11    [22289000]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
1. Всем нравится когда конструктор не падает. Кроме ТС.
2. Из вопроса надо исключить подвопрос конфигурации. Тогда делай свои первый или второй вариант.
3 мар 21, 13:16    [22289004]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Basil A. Sidorov
Насколько я помню Мейеса, исключение, выброшенное конструктором, исключает и вызов
деструктора.
Или модерновые плюсы стали настолько продвинутыми, что могут сами разобрать(ся) какие
куски деструктора вызывать, а какие нет?

Они достаточно продвинутые чтобы вызвать деструкторы только тех вложенных/родительских
объектов, конструкторы которых отработали нормально.

И да, ответ на вопрос топика прост: если надо предотвратить создание объекта -
используется исключение. Надо чтобы объект всегда создавался - не используется исключение.

Posted via ActualForum NNTP Server 1.5

3 мар 21, 14:01    [22289048]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
Он спросил. Что предпочтительнее.

Я думаю что оба варианта плохие. Но мне нравится более атомарный вариант класса конфигурации
когда конструктор делает 100% подготовительной работы и не падает.

Ваш вариант не слишком приемлем.

1) Грузятся бессмысленные дефолтные настройки.
2) Нужно следить что бы эти дефолтные значения не записались в ini файл.
3) При старте определённого функционала нужно следить не опирается ли он на бессмысленные дефолты? И если да — MsgBox и отказ.

А если это дефолтное значение редактируется через GUI? Вот что выводить на форму?
Бессмысленное дефолтное значение или ошибочное значение которое прочитали из ini?
Зачем мы вообще заменяли на дефолты?

Трудозатратно. С каждым значением возиться нужно.
3 мар 21, 21:53    [22289302]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Чукча ТС не читатель. Он писатель....
и первый раз видит кнопку Настройки - По умолчанию
LOL)))
4 мар 21, 07:22    [22289404]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton
Он спросил. Что предпочтительнее.

Я думаю что оба варианта плохие. Но мне нравится более атомарный вариант класса конфигурации
когда конструктор делает 100% подготовительной работы и не падает.
вот где в этом посту ты говоришь о настройках по умолчанию что он тебя цитирует?
Удивительно как 3 страницы люди ни о чем говорят.
4 мар 21, 07:26    [22289406]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Предложи ему статический метод класса возвращающий экземпляр себя.
Там будет проверки в первых строках и потом конструктор.
Уж эти 3 варианта удовлетворяет любого новичка
- coctructor
- init
- static createInstans
4 мар 21, 07:34    [22289409]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Статический метод? Зачем. Он не добавляет ничего к тому что было уже сказано.
4 мар 21, 13:17    [22289559]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton
Статический метод? Зачем. Он не добавляет ничего к тому что было уже сказано.
а в каком варианте это метод
автор
У нас есть два варианта для инициализации и обработки ошибок:

1) Функция инициализации возвращающая признак ошибки.
2) Или исключение вылетающие из конструктора.

В первом или втором?
Или ТС такой косноязычный?
4 мар 21, 13:45    [22289580]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
mayton
Member

Откуда: loopback
Сообщений: 51019
Я не хочу сильно погружаться в эту тему. По ней мало инфы. Нет даже названия этого класса.
А все теоретики ООП говорят о том что имя - должно быть звучащим. Оно должно значить.
Например "Properties" или "PropertyParser". В зависимости от этого другие ответы по дизайну
класса могут обрести смыл. А там мы пока обсуждаем шкуру медведя которого еще нету.

Для случая с *Parser функция возвращающая опционал или Maybe<> может быть и была-бы полезна.
4 мар 21, 14:07    [22289603]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
mayton,
Ну, если ТС спорит с нужностью default настроек и переменных, то
это вообще за гранью)))))
Удачи аффтару!
4 мар 21, 14:14    [22289615]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
По ней мало инфы. Нет даже названия этого класса.

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

template <...>
class Singleton {...};
class Options {...};

const bool IsAllowDefault = false;
Singleton<Options, IsAllowDefault> opt;

opt.init(path);
int v = opt->getMyValue();

Класс Options в конструкторе только заполняет все настройки дефолтными значениями. И
класс Options реализует функцию init(). Но если IsAllowDefault == false в целом синглетон
ведёт себя так, как будто из конструктора Options при ошибке вылетело исключение. А если
IsAllowDefault == true, то синглетон ведёт себя так, как будто была вызвана функция init().

Т.е. двумя вариантами реализации из моего первого поста я управляю настраивая класс
Singleton. И могу легко переключаться между поведениями: 1) исключение из конструктора
2) вызов функции init().

Приятно, то что функция Options::save() вызывается в классе Singleton. Т.е. в классе Options
не нужно следить за тем, а были ли мы успешно загружены, а если были то в деструкторе
Options вызовем save(). И виртуальный метод Options::save() нужно было вызывать именно в
деструкторе клиентского класса Options, этот метод нельзя было вызывать в деструкторе
базового класса OptionsBase, по понятным причинам. Теперь деструктор Options пустой.

И теперь всем жизненным циклом управляет класс Singleton и поведение настраивается
через шаблонные параметры этого класса.
4 мар 21, 17:53    [22289825]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
Ужас.
Синглетон счас наверно только сишники остались используют)
4 мар 21, 18:14    [22289849]     Ответить | Цитировать Сообщить модератору
 Re: Функция инициализации или исключение в конструкторе?  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7650
petrav,
автор
Т.е. двумя вариантами реализации из моего первого поста я управляю настраивая класс
Singleton. И могу легко переключаться между поведениями: 1) исключение из конструктора
2) вызов функции init().

Вообще то это решается не в рантайме и не набегу, а во время написания кода.
4 мар 21, 18:17    [22289854]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / C++ Ответить