народа утилиты типа такой (псевдокод)
void Message::fatal(const char *fmt, ...)
{
fprintf(stderr, "....");
exit(1);
}
Порой даже в приличных проектах. И по сему поводу у меня сразу несколько вопросов. Я смотрю на это и вижу:
"Я, как программист, хочу сообщить пользователю о некоторой фатальной ошибке."
Акцент здесь на "сообщить" и "пользователю". Однако код выше делает более чем одну вещь. Кроме сообщения пользователю, он посылает сообщение программе (о завершении).
Мне кажется сомнительным вводить в дизайн такую непонятную вещь, которая может ввести в заблуждение не только программиста (другого), но и компилятор (привет __attribute__((noreturn))), лишь бы сэкономить 1 строчку кода.
Я даже не говорю, что несколько странно делегировать завершение программы объекту сообщения, чья очевидная функциональность включает только информационные сообщения.
Ведь явное лучше, чем неявное? Или народ в плюсовой экосистеме в принципе не напрягает себя подобными мыслями?
fatal значит шо усё плохо, инварианты нарушены, продолжать выполнение программы опасно. Поэтому обычно на fatal вешается доп. контракт - гарантировать "невыполнение" кода далее.
Так что всё логично. Другой вопрос - как организовать "невыполнение"
Ну... все твои доводы правомочны. Но это -- С-style. Конечно, надо бросать исключение, ловить их в main, и выходить.
> Ведь явное лучше, чем неявное это какой-то лозунг из другой экосистемы
Я глубоко убеждён что они его не изобрели впервые и я имею право им пользоваться даже не будучи их приверженцем )
На то оно и fatal
ты вернуулсяя
Проблема, что это лозунг, и он не проводится в жизнь последовательно - задумайтесь, что вы работаете с абстракциями вместо прямого (явного!) написания инструкций
Если уж вам по одному названию (функции) всё стало понятно, то не возникает ли тут противоречия с другим названием (класса) ,которое как бы ничего не говорит про такую ответственность как завершение программы? ))
Ну, если не относиться к этому как догме или лозунгу, а как к разумному подходу, то проблем как мне кажется тут не возникает. Никто же не говорит, что раз у нас абстракции, то они не могут быть явными
Дело в том, что задача абстракций как раз скрывать, любая абстракция просто противоречит этому лозунгу
А почему должен? Вы хотите отдельный класс FatalMessage?
> сэкономить строчку. Если программа "штатно" продолжает работу после фатальной ошибки, либо она не фатальная, либо баг в обработке ошибок
Это не самый плохой подход в дизайне опирающимся на нейминг :) Кроме того, как же обсуждалось выше, есть события, исключения, явный exit(1) - куча вариантов. Message::fatal с exit внутри тоже работает, но мне он кажется самым не красивым и не практичным решением
Угу, мне тоже так почему-то кажется
Не надо думать явное или неявное, это - просто С-говно, тут не надо размышлять и медитировать, надо брать лопату и убирать.
один из вариантов
Обсуждают сегодня