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

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

Изменено 22.03.2017 16:42 Carc

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

B>Есть функция:

B>
B>result_code GetSomething(vector<Something>& output);
B>


B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?


B>1. Всегда очищать (лишнее действие, что не в духе плюсов).

B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
B>3. Должен сработать assert (типа assert(!output.empty)).
B>4. Вернуть ошибку/бросить исключение.
B>5. Оставлю комментарий со своим вариантом.

B>(Хотел сделать настоящее голосование, но получаю "500 — Internal server error". Зато здесь можно обсудить более развернуто).


B>Что скажете?

Функцию result_code GetSomething(vector<Something>& output); сделать закрытой, а еще лучше для читабельности кода, переименовать ее в GetSomething_Internal и добавить в нее еще один параметр (const bool bClear), который будет контролировать пустой ли пришел входной вектор (true — обязан быть пустым, false — нет).

А теперь главное:
К ней 2 фасадных, открытых функции GetSomething_WithClear(…) и GetSomething_WithoutClear()

Соответственно, первая GetSomething_WithClear очищает входной вектор, и передает во внутреннюю, вторая не очищает и передает во внутреннюю GetSomething_Internal.

Т.е. в самой внутренней функции GetSomething_Internal логика должна быть четко согласована, пустой вектор аль нет.

Интерфейсные открытые функции GetSomething_WithClear|WithoutClear служит единственной точкой доступа, мимо них не проскочишь.

Ну а названия в функциях WithClear|WithoutClear явно говорят, что мы хотим.

По моему такой код явно выражает намерения, он читабелен и понятен, и легок в поддержке (пустой\не пустой вектор контроллируется в 2-ух открытых фасадных функциях).

А что конкретно нужно делать: бросать исключение, ассертить, ассертить и бросать, и прочия это уже от задачи зависит.

PS: из жизненного опыта есть какой модулёк у меня, с сервисными функциями вида отдать полный путь к экзешнику работающему, его папку и.т.д. Этот модулек кочует из проекта в проект.

Дык вот какая-нить функция вида ОтдайПапку (путь) откуда работает экзешник непонятно что должна делать? Отдать просто путь, или путь со слешом на конце (ну например для поиска каких-то файлов в своей папке).

Вот что б не гадать, и каждый раз не лазить в функцию ОтдайПапку (путь) на предмет со слешом на конце аль нет, давным-давно было переписано в таком же стиле

То бишь
ОтдайПапку_(путь)_Без_слеша
ОтдайПапку_(путь)_Со_Слешом

Дергают они одну и ту же private функцию, а на выходе аккуратненько подчищают что надо (удаляют, добавляют слеш).

И всё. И горя не знаю. Все ясно, понятно, и уже не "легко в поддержке", а ее и вовсе больше не нужно.
Re: Непустой выходной параметр - ваша реакция?
Здравствуйте, Basil2, Вы писали:

B>Есть функция:

B>
B>result_code GetSomething(vector<Something>& output);
B>


B>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?


B>1. Всегда очищать (лишнее действие, что не в духе плюсов).

B>2. Игнорировать, т.е. новые значения добавятся к старым ("не очистил сам дурак" — вполне в духе, но добавляет нестабильности).
B>3. Должен сработать assert (типа assert(!output.empty)).
B>4. Вернуть ошибку/бросить исключение.
B>5. Оставлю комментарий со своим вариантом.

B>(Хотел сделать настоящее голосование, но получаю "500 — Internal server error". Зато здесь можно обсудить более развернуто).


B>Что скажете?

Функцию result_code GetSomething(vector<Something>& output); сделать закрытой, а еще лучше для читабельности кода, переименовать ее в GetSomething_Internal и добавить в нее еще один параметр (const bool bClear), который будет контролировать пустой ли пришел входной вектор (true — обязан быть пустым, false — нет).

А теперь главное:
К ней 2 фасадных, открытых функции GetSomething_WithClear(…) и GetSomething_WithoutClear()

Соответственно, первая GetSomething_WithClear очищает входной вектор, и передает во внутреннюю, вторая не очищает и передает во внутреннюю GetSomething_Internal.

Т.е. в самой внутренней функции GetSomething_Internal логика должна быть четко согласована, пустой вектор аль нет.

Интерфейсные открытые функции GetSomething_WithClear|WithoutClear служит единственной точкой доступа, мимо них не проскочишь.

Ну а названия в функциях WithClear|WithoutClear явно говорят, что мы хотим.

По моему такой код явно выражает намерения, он читабелен и понятен, и легок в поддержке (пустой\не пустой вектор контроллируется в 2-ух открытых фасадных функциях).

А что конкретно нужно делать: бросать исключение, ассертить, ассертить и бросать, и прочия это уже от задачи зависит.

PS: из жизненного опыта есть такой модулёк у меня, с сервисными функциями вида отдать полный путь к экзешнику работающему, его папку и.т.д. Этот модулек кочует из проекта в проект.

Дык вот какая-нить функция вида ОтдайПапку (путь) откуда работает экзешник непонятно что должна делать? Отдать просто путь, или путь со слешом на конце (ну например для поиска каких-то файлов в своей папке).

Вот что б не гадать, и каждый раз не лазить в функцию ОтдайПапку (путь) на предмет со слешом на конце аль нет, давным-давно было переписано в таком же стиле

То бишь
ОтдайПапку_(путь)_Без_слеша
ОтдайПапку_(путь)_Со_Слешом

Дергают они одну и ту же private функцию, а на выходе аккуратненько подчищают что надо (удаляют, добавляют слеш).

И всё. И горя не знаю. Все ясно, понятно, и уже не "легко в поддержке", а ее и вовсе больше не нужно.