Сообщение Re: Непустой выходной параметр - ваша реакция? от 22.03.2017 12:09
Изменено 22.03.2017 12:10 SaZ
Re: Непустой выходной параметр - ваша реакция?
Здравствуйте, Basil2, Вы писали:
B>Есть функция:
B>
B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?
B>1. Всегда очищать (лишнее действие, что не в духе плюсов).
В этом случае делаем vector<Something> GetSomething( result_code *res = nullptr );
B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
Нужно или документировать или придумать нормальное имя функции, в зависимости от решаемой задачи. Например: AppendSomething / GetSomething.
Вообще, имхо, это плохой паттерн. Потому что не понятно, что делать с контейнером в случае ошибки — откатывать изменения или нет.
Имхо, если что-то надо добавить в контейнер, то на вход функции надо передавать итератор.
B>3. Должен сработать assert (типа assert(!output.empty)).
Нет, ибо это работает только при отладке. Для проектов, где только 1 программист это может и прокатит. Но в целом — ассерт должен быть лишь дополнением к логике, чтобы раньше понять где ошибка.
B>4. Вернуть ошибку/бросить исключение.
Как захотите.
B>Есть функция:
B>
B>result_code GetSomething(vector<Something>& output);
B>
B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?
B>1. Всегда очищать (лишнее действие, что не в духе плюсов).
В этом случае делаем vector<Something> GetSomething( result_code *res = nullptr );
B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
Нужно или документировать или придумать нормальное имя функции, в зависимости от решаемой задачи. Например: AppendSomething / GetSomething.
Вообще, имхо, это плохой паттерн. Потому что не понятно, что делать с контейнером в случае ошибки — откатывать изменения или нет.
Имхо, если что-то надо добавить в контейнер, то на вход функции надо передавать итератор.
B>3. Должен сработать assert (типа assert(!output.empty)).
Нет, ибо это работает только при отладке. Для проектов, где только 1 программист это может и прокатит. Но в целом — ассерт должен быть лишь дополнением к логике, чтобы раньше понять где ошибка.
B>4. Вернуть ошибку/бросить исключение.
Как захотите.
Re: Непустой выходной параметр - ваша реакция?
Здравствуйте, Basil2, Вы писали:
B>Есть функция:
B>
B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?
B>1. Всегда очищать (лишнее действие, что не в духе плюсов).
В этом случае делаем vector<Something> GetSomething( result_code *res = nullptr );
B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
Нужно или документировать или придумать нормальное имя функции, в зависимости от решаемой задачи. Например: AppendSomething / GetSomething.
Вообще, это плохой паттерн. Потому что не понятно, что делать с контейнером в случае ошибки — откатывать изменения или нет.
Имхо, если что-то надо добавить в контейнер, то на вход функции надо передавать итератор.
B>3. Должен сработать assert (типа assert(!output.empty)).
Нет, ибо это работает только при отладке. Для проектов, где только 1 программист это может и прокатит. Но в целом — ассерт должен быть лишь дополнением к логике, чтобы раньше понять где ошибка.
B>4. Вернуть ошибку/бросить исключение.
Как захотите.
B>Есть функция:
B>
B>result_code GetSomething(vector<Something>& output);
B>
B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?
B>1. Всегда очищать (лишнее действие, что не в духе плюсов).
В этом случае делаем vector<Something> GetSomething( result_code *res = nullptr );
B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
Нужно или документировать или придумать нормальное имя функции, в зависимости от решаемой задачи. Например: AppendSomething / GetSomething.
Вообще, это плохой паттерн. Потому что не понятно, что делать с контейнером в случае ошибки — откатывать изменения или нет.
Имхо, если что-то надо добавить в контейнер, то на вход функции надо передавать итератор.
B>3. Должен сработать assert (типа assert(!output.empty)).
Нет, ибо это работает только при отладке. Для проектов, где только 1 программист это может и прокатит. Но в целом — ассерт должен быть лишь дополнением к логике, чтобы раньше понять где ошибка.
B>4. Вернуть ошибку/бросить исключение.
Как захотите.