Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
petrav Member Откуда: Сообщений: 2861 |
Философский вопрос. Пример надуманный, но демонстрирует проблему. Допустим у нас есть класс настроек, который читает данные из .ini файла. У нас есть два варианта для инициализации и обработки ошибок: 1) Функция инициализации возвращающая признак ошибки. 2) Или исключение вылетающие из конструктора. В варианте № 1 в деструкторе нужно следить, а были ли мы успешно прочтены и только тогда сохранять изменения. В варианте № 2 это делать не нужно. В варианте № 2 такой объект нельзя сделать глобальным. Вот что предпочтительнее в общем случае? |
2 мар 21, 09:57 [22288178] Ответить | Цитировать Сообщить модератору |
Basil A. Sidorov Member Откуда: Сообщений: 10925 |
Настроек по умолчанию совсем нет? |
2 мар 21, 10:00 [22288179] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Это неизвестно. Допустим по умолчанию настроек нет. Но если мы выбрали путь с исключением, а потом появились настройки по умолчанию… То мы уже не можем наружу сообщить об ошибке. Всегда успешно! Это ещё один аспект проблемы. :) |
||||
2 мар 21, 10:06 [22288183] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
petrav, Нужно делать конструктор всегда гарантированно без исключений. Простое правило. Отсюда вытекает доп функция инициализации |
2 мар 21, 10:10 [22288187] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Как раз показывает что теоретический вопрос разбивается о практику. Если удалили ini файл, это не значит что мы должны застопорить ИС. И сообщить всегда можно все что угодно. |
||||
2 мар 21, 10:40 [22288198] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Логика может быть такая, что если настройки не корректны или отсутствуют, то мы и не работаем. Потому что работа со значениями по умолчанию бессмысленна или даже вредна. |
||||||||
2 мар 21, 10:56 [22288205] Ответить | Цитировать Сообщить модератору |
Basil A. Sidorov Member Откуда: Сообщений: 10925 |
Спорная логика, но даже в этом случае должна формироваться пустая конфигурация и приложение будет падать по разыменовыванию null-евого указателя ![]() |
2 мар 21, 11:09 [22288211] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Нормальная логика. В таком варианте приложение после MsgBox об ошибке или должно завершить свою работу. Ну или в GUI заблокировать функционал, который опирается на эти настройки. В данном случае лучше даже упасть, чем начать работу с настройками по умолчанию, если по логике работы настроек по умолчанию быть не может. |
||||
2 мар 21, 11:58 [22288241] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Я бы сказал, что так можно, но не очень профессионально. Надо деньги посчитать. И потерю имиджа) |
||||||||
2 мар 21, 12:10 [22288252] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Так как диалоги должны давать ответ Что юзверю делать. |
||||||||
2 мар 21, 12:13 [22288256] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Также интересна система не имеющая default settings Калькулятор? |
2 мар 21, 12:17 [22288261] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Любое коммерческое приложение у которого лицензионный ключ - часть настроек. Posted via ActualForum NNTP Server 1.5 |
||
2 мар 21, 13:42 [22288328] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51018 |
Дефолтный конфиг все таки можно создать. Его задача будет - стать реплейсментом для тех полей которые были некорректны в кастомном конфиге. И конструктор все-таки должен отработать без исключений и без ошибок. Это будет в духе следования принципам convention over configuration. И после того как конструктор отработал успешно. Можно смотреть статусы всех пропертей и смотреть какие из них были взяты из кастомного конфига и какие заменены на дефолт. С ключами тоже что-то можно придумать. Сделать ключ-заглушку. Падающий конструктор - всегда плохо. У нас не остается следа для анализа. Нет объекта - нет дампа. Как говорят менты - нету трупа - нету уголовного дела. |
2 мар 21, 13:49 [22288333] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Dimitry Sibiryakov, Я думаю, просто нет таких без настроек по умолчанию. У меня положение окна главного это настройки. Если настроек нет (первый старт) то я запускаю default Left, TOP, w, h окна. |
2 мар 21, 15:38 [22288442] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
Где-то в глубинах корпоративной сети стоит сервер на котором крутится Самая Главная База. Какие настройки ты пропишешь по умолчанию для подключения к ней? А размеры и положение окна это не настройки, это сохранённое состояние, как у игры какой-нибудь. Сообщение было отредактировано: 2 мар 21, 15:50 |
2 мар 21, 15:55 [22288459] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Dimitry Sibiryakov, Забудь про игры. Состояние вполне может быть настройкой. Вот принял сегодня на грудь. Вполне настроился на работу))))) |
2 мар 21, 15:59 [22288464] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34688 |
А почему если исключение, то обязательно вылетающее из конструктора? Почему нет варианта "функция инициализации, выбрасывающая исключение" ? Что сложного в проверке "а были ли мы успешно прочтены и только тогда сохранять изменения." ? В общем случае не понятно что предпочтительнее. Потому что нет требований к этому куску ПО. Можно и так, и эдак , и разэдак, все три варианта допустимы. Исключение из конструктора -- ничего в этом нет. |
||||
2 мар 21, 16:04 [22288470] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34688 |
Ну , есть такой подход, но там по-другому -- конструктор не должен ничего сложного делать (типа чтения файла). А исключение из него бросить -- нет проблем. |
||||
2 мар 21, 16:05 [22288472] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51018 |
Пишешь
host : localhost
port : 1551
user : scott
pwd : tiger
Конструктор конфигов отрабатывает успешно. Не падает. Цель - достигнута. Опция успеха подключения к БД - это уже вторая задача и ее надо изучать отдельно от первой. |
||||
2 мар 21, 16:29 [22288490] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Почему же не должен? |
||||||||
2 мар 21, 18:40 [22288583] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Потому что мои два варианта отличаются фундаментально: в случае возникновения ошибки объект настроек или сконструирован, или же нет. Ваш третий вариант ничего филосовски нового не привносит. Кстати, вариант с функцией инициализации тем фундаментально-то и плох: сконструирован объект в некорректном состоянии. И он в таком состоянии доступен остальным объектам.
Не сложно. Но мы тут просто рассуждаем. То да сё. |
||||||||||||
2 мар 21, 19:03 [22288602] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
Не масштабируемо. Не потокоустойчиво. Не дуракоустойчиво |
||||||||
2 мар 21, 19:15 [22288610] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
petrav, >объект настроек или сконструирован, или же нет Ты собрался стоить главное окно приложения. |
2 мар 21, 19:19 [22288616] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51018 |
А почему не потокоустойчиво? |
||||||||
2 мар 21, 20:10 [22288642] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7650 |
mayton, Ну какие Райзе в потоках |
2 мар 21, 20:24 [22288648] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / C++ | ![]() |