Злоупотребляю ли я std :: необязательно
Может быть.
Предполагаемая семантика std::optional
должна указывать, что что-то является необязательным . То есть, если вещь не присутствует, это нормально, а не ошибка.
Если ваш метод дает сбой, он возвращает пустой необязательный параметр, указывающий на сбой. Но является ли этот сбой также ошибкой , зависит от семантики, ожидаемой вызывающим кодом, который вы не показали или не описали: что вы делаете, если необязательный результат пуст
Например,
auto name = GetName();
if (!name) { diediedie(FATAL_ERROR); }
предполагает, что имя не является обязательным. Если вы не можете (как вы говорите) использовать исключения здесь, подход variant<string, error>
кажется более понятным и также позволяет вашей отказавшей функции сообщать причину сбоя, которая в противном случае могла бы перейти в исключение.
Обратно
auto name = GetName();
if (name) {
cout << "User is called " << *name << '\n';
} else {
cout << "User is anonymous\n";
}
кажется разумным, потому что неудача при получении имени не ошибка.
Почему ... не для использования std::optional
?
Когда вы не хотите сообщать, что-то необязательно.
Очевидно, вы можете злоупотреблять этим, как и все остальное, но это, вероятно, вводит в заблуждение, вводит в заблуждение, неожиданно и в противном случае является плохой практикой.
Я слишком очарован ...?
Может быть. Если ваша обработка ошибок загрязняет весь ваш код, вам, вероятно, следует рассмотреть возможность более раннего сбоя, а не натыкаться на логику, которая никогда не будет успешной.
Если у вас действительно есть много переменных, которые по закону могут отсутствовать - с точки зрения логики вашей программы - тогда вы, вероятно, используете это правильно.
Вопрос 1
Опять же, это зависит от того, что означает сбой в контексте вашей программы.
Вопрос 2
Да, ваш код будет нечитаемым беспорядком, если все является необязательным, частично из-за визуального шума, но в основном потому, что вы никогда не можете быть уверены, какие переменные существуют даже в данной точке вашей логики.
Ваша GetValuesFromDB
правка , вероятно хорошо, для использования необязательно , если ваша база данных относительно неструктурирована и не имеет ограничений. Вы не можете зависеть от того, какой конкретный столбец заполняется, все необязательно, вам нужно вручную проверять наличие каждого поля. Они действительно необязательны.
Если ваша БД сильно структурирована, может не подойти для использования необязательного, скажем, первичного ключа. Вы не можете иметь строку без первичного ключа, поэтому сделать его необязательным кажется немного странным. Возможно, просто не стоит иметь отдельный интерфейс для нескольких обязательных столбцов.
Я полагаю, что мы слишком буквально понимаем слово "необязательный".
Я искренне не могу сказать, читали ли вы мой ответ - ваш комментарий говорит о том, что вы его не поняли, по крайней мере.
Допустим, мы называем это обнуляемым вместо этого. Я бы все же предположил бы, что возвращение nullable<T>
для чего-то, что на законных основаниях может не существовать, это хорошо, но возвращение того же типа для чего-то, чье отсутствие указывает на ошибку, является неправильным.
Вы должны решить, что является ошибкой для вашего кода. Мы не можем сделать это для вас, особенно с предоставленной информацией. Так что вы должны использовать необязательно для всего? Может быть. Что я и сказал. Определите семантику и предварительные условия вашего собственного кода, и вы будете знать, какие элементы являются необязательными, какие являются обязательными, и чье отсутствие следует обрабатывать как ошибку вместо обычного пути к коду.