Сообщение Re: Непустой выходной параметр - ваша реакция? от 22.03.2017 12:18
Изменено 22.03.2017 16:42 Carc
Re: Непустой выходной параметр - ваша реакция?
Здравствуйте, Basil2, Вы писали:
B>Есть функция:
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 функцию, а на выходе аккуратненько подчищают что надо (удаляют, добавляют слеш).
И всё. И горя не знаю. Все ясно, понятно, и уже не "легко в поддержке", а ее и вовсе больше не нужно.
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>При одном из вызовов функции передается непустой вектор. Как, на ваш взгляд, функция должна отреагировать на это?
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 функцию, а на выходе аккуратненько подчищают что надо (удаляют, добавляют слеш).
И всё. И горя не знаю. Все ясно, понятно, и уже не "легко в поддержке", а ее и вовсе больше не нужно.
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 функцию, а на выходе аккуратненько подчищают что надо (удаляют, добавляют слеш).
И всё. И горя не знаю. Все ясно, понятно, и уже не "легко в поддержке", а ее и вовсе больше не нужно.