Лучший способ написать конструктор, который может иметь недопустимые параметры - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть вопрос о написании читаемого и эффективного кода на C ++.

Я создаю класс для соединений TCP с конструктором, который принимает в качестве входных данных IP-адрес сервера и порт.Я хотел бы избежать создания объекта, если, например, IP неверен.

Мой вопрос:

Лучше ли генерировать исключение в случае сбоя или создать класс-оболочку с логическим значением, чтобы проверить, правильно ли был создан внутренний объект, и избежатьвызывать какие-либо функции в случае сбоя?

1 Ответ

0 голосов
/ 22 ноября 2018

Бросить конструктор при неверном вводе - это хорошо, и даже рекомендуется согласно основным рекомендациям .

Именованные конструкторы (то есть статические функции-члены) являются одинаково допустимым подходом, например, они могут возвращатьstd::optional<YourType> (требуется C ++ 17).Это делает очевидным, что реализация может потерпеть неудачу, и обходит недостатки исключений.Вот небольшой пример.

#include <optional>

class Example {
    public:
       static std::optional<Example> validateAndCreate(...);

    private:
       /* Private ctor makes usage of the above function mandatory. */
       Example(...);
};

И реализация метода создания может быть

std::optional<Example> validateAndCreate(...)
{
    /* Use e.g. some utility function for validation: */
    if (isInputValid(/* Pass parameter. */))
        return Example(/* Pass parameter. */);
    else
        return std::nullopt;
}

, где код клиента затем конструирует объекты, подобные этому:

if (const auto instance = Example::validateAndCreate())
    /* Do stuff with the instance. */
    ;
else
    std::cerr << "What now?\n";

Я полагаю, что этот подход более самодокументирован (тот факт, что ctor может генерировать код, должен быть где-то задокументирован), но также более многословен.

...