Информация об изменениях

Сообщение Re: Непустой выходной параметр - ваша реакция? от 22.03.2017 12:09

Изменено 22.03.2017 12:10 SaZ

Re: Непустой выходной параметр - ваша реакция?
Здравствуйте, Basil2, Вы писали:

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>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. Вернуть ошибку/бросить исключение.


Как захотите.