Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/55: Рейтинг темы: голосов - 55, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 24.03.2013
Сообщений: 177

Что такое обертка функции?

19.09.2015, 00:28. Показов 12276. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
дана функция на входе получает 2 параметра имя и возраст.
srting children(string ima, int age)
Нужно написать обертку, для тестирования входящих параметров.
Правильно ли понимаю, что нужно написать функцию допустим test на входе получаем 2 параметра имя и возраст, в данной функции выполняется проходит проверка, что имя не пустая строка, состоящая из символов, без цифр и спец. символов, возраст не отрицательное число.
bool test(string ima, int age)
На выходе true/false подходит ли данный набор для функции children. Меня смущает слово ОБЕРТКА, не совсем понимаю значение этого слова, если я не прав - поправьте меня
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2015, 00:28
Ответы с готовыми решениями:

Что такое Функции в C++
Можете объяснить что такое функции в C++, только подробно. Я не понимаю как они работают и да объясните что такое функции прототипы!...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое прототип функции?
Зачем нужен прототип функции ведь она и без него прекрасно работает? Если можете объясните как чайнику в подробностях) заранее спасибо...

40
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 00:35
Цитата Сообщение от polin11 Посмотреть сообщение
На выходе true/false подходит ли данный набор для функции children.
на выходе - результат children(ima,age), задача функции-обертки выполнить какие-то задачи необходимые для children, в данном случае проверка валидности переданных параметров.

C++
1
2
3
4
5
6
7
8
string foo ( const string & ima , int age )
{
   //проверяем параметры
   //если всё норм, то вызываем children
   return children ( ima , age ) ;
  //если же параметры не правильные, то делаем что-то другое, например возвращаем пустую строку
  return "" ;
}
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 00:45
по хорошему проверкой параметров должна заниматься сама функция children а не какая-то обертка.
если параметры не норм - то не вызываем? если изначально функция children написана криво, не следит за
корректностью своих параметров и нет возможности ее исправить - то да, в такой обертке появляется смысл.
из боевого кода ее вызывать опасно, а если в во всех местах вызова проверять их корректность - то это копипаста и ничего хорошего. правильно будет вызывать такую вот корректную обертку.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 00:53
Цитата Сообщение от Perfilov Посмотреть сообщение
а если в во всех местах вызова проверять их корректность - то это копипаста и ничего хорошего.
проверять нужно во всех местах. на всех уровнях.
проверять должна и вызывающая, и вызываемые стороны.

проверять нужно и предусловия, и постусловия.

каждую функцию нужно стремиться делать инвариантной.
а это значит: вызываемая функция не должна доверять
и закладываться на корректность вызывающей стороны.
а вызывающая сторона не должна закладываться
на корректность вызываемой.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 00:54
Цитата Сообщение от Perfilov Посмотреть сообщение
если изначально функция children написана криво
не обязательно. Возможно, функция для внутреннего использования и внутренние данные всегда валидны и проверять их нет смысла. Но данная функция может потребоваться внешнему миру, тогда лучше предоставить некую интерфейсную функцию-обертку, которая будет проверять параметры, а саму children спрятать, например
C++
1
2
3
4
5
6
7
8
static string children_impl ( string ima , int age ) {
//функция не проверяет аргументы, потому работает быстрее
}
 
string children ( const string & ima , int age )
{
//проверкой занимается эта функция-обертка
}
Другой пример, наверное, более наглядный, если функция может быть использована в многопоточной среде - одна функция с блокировкой, другая - без (например, для внутренних нужд, когда необходимый мьютекс уже захвачен)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:00
Цитата Сообщение от Croessmah Посмотреть сообщение
функция для внутреннего использования и внутренние данные всегда валидны и проверять их нет смысла.
всегда есть смысл.

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
static string children_impl ( string ima , int age ) {
//функция не проверяет аргументы, потому работает быстрее
}
C++
1
2
3
4
//функция принимает по ссылке, и потому работает быстрее
static string children_impl ( const string& ima , int age ) {
  assert( /* проверочный код */  ) 
}
в сочетании с TDD и QA, ассерт дает замечательные результаты,
без пенальти на бою.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 01:01
hoggy, разве что во время тестирования и отладки.

прикиньте
C++
1
2
3
for ( size_t i = 0 ; i < size ; ++i )
   if ( check_index (i) )
      vector [ i ] = 0 ;//и вектор тоже проверяет корректность
Добавлено через 49 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
ассерт дает замечательные результаты,
ассерт недоступен в релизе, не так ли? А функция может использоваться клиентами.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:02
Цитата Сообщение от Croessmah Посмотреть сообщение
разве что во время тестирования и отладки.
ваше "разве что" отловит свыше 90% несчастных случаев.
0
19.09.2015, 01:02

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
//функция принимает по ссылке, и потому работает быстрее
у ТС нет здесь ссылки :)

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:03
Цитата Сообщение от Croessmah Посмотреть сообщение
ассерт недоступен в релизе, не так ли?
лучше иметь дебаг страховку, чем совсем без страховки.

релизу предшествует длительный дебаг и тестирование,
в ходе которых большая часть прострелов успешно отлавливается.
чего не скажешь о ситуации, когда страховки нет вообще.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 01:06
Цитата Сообщение от hoggy Посмотреть сообщение
лучше иметь страховку, чем совсем без страховки.
про дебаг речи не шло ведь понятное дело, что при отладке нужно проверять.
Цитата Сообщение от hoggy Посмотреть сообщение
релизу предшествует длительный дебаг и тестирование,
в ходе которых большая часть прострелов успешно отлавливается.
но assert не спасет от "дурака", так что придется параметры, пришедшие извне проверять в любом случае.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:13
Цитата Сообщение от Croessmah Посмотреть сообщение
про дебаг речи не шло ведь понятное дело, что при отладке нужно проверять.
релиз зависит от требований к надежности ПО.
обычная практика - кидаться исключениями, валидируя весь паблик.

Цитата Сообщение от Croessmah Посмотреть сообщение
но assert не спасет от "дурака", так что придется параметры, пришедшие извне проверять в любом случае.
разумеется.
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 01:14
ну какое-то спорное утрверждение на счет не закладываться на корректность вызываемой функции.
т.е. пишем обертку в которой все-таки проверяем входные параметры и передаем их дальше если все ок и пытаемся вызывать везде эту обертку. но следуя этому же правилу - не доверяем корректности этой обертке и снова проверяем. либо в третей и так далее, либо везде в коде перед вызовом. далее надо еще умудрится не накосячить с этими проверками и т.п. на корректность хоть чего-то все-таки надо закладываться и как я и написал - если функция не корректно ведет себя при всех наборах данных - пишется корректная обертка и далее везде используется она с закладкой на ее корректность. иначе сами понимаете, получается полная хрень.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:22
Цитата Сообщение от Perfilov Посмотреть сообщение
т.е. пишем обертку в которой все-таки проверяем входные параметры и передаем их дальше если все ок и пытаемся вызывать везде эту обертку. но следуя этому же правилу - не доверяем корректности этой обертке и снова проверяем.
обертка - не нужна.
в остальном вы все правильно поняли.
вызываемой стороне нельзя доверять.
равно, как и вызывающей.

Цитата Сообщение от Perfilov Посмотреть сообщение
далее надо еще умудрится не накосячить с этими проверками
нужно умыдриться, что бы накосячить с проверками.

Цитата Сообщение от Perfilov Посмотреть сообщение
на корректность хоть чего-то все-таки надо закладываться
есть только одна вещь, на которую можно закладываться - результат работы.

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

проверяем предусловие.
работаем.
проверяем постусловие.

и так на каждом этаже.

Цитата Сообщение от Perfilov Посмотреть сообщение
если функция не корректно ведет себя при всех наборах данных - пишется корректная обертка
функция переписывается.
баги исправляются.

делать обертку над функцией, которая работает с ошибками - это:
Цитата Сообщение от Perfilov Посмотреть сообщение
сами понимаете, получается полная хрень.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 01:23
Цитата Сообщение от hoggy Посмотреть сообщение
обычная практика - кидаться исключениями, валидируя весь паблик.
ну, если у нас библиотека, то исключения попахивают плохо (кидаться исключениями между модулями стремно).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.09.2015, 01:26
Цитата Сообщение от Croessmah Посмотреть сообщение
ну, если у нас библиотека, то исключения попахивают плохо (кидаться исключениями между модулями стремно).
это же всего лишь одна их техник обработки ошибок.
сишное апи возвращает код.

смысл не в том, как сообщить об ошибках вызывающей стороне.
а в том, что бы при всей некорректности вызывающей стороны,
не крашнуться по вине вызываемой стороны.

вызываемая сторона не должна делать работу с кривыми данными на руках,
использование которых может погубить приложение.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 01:30
Цитата Сообщение от hoggy Посмотреть сообщение
это же всего лишь одна их техник обработки ошибок.
сишное апи возвращает код.
я понял о чем Вы, просто уточнил факт того, что эта практика может дурно пахнуть в определенном контексте
0
 Аватар для Хулиган
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
19.09.2015, 01:31
hoggy, Croessmah, не хотел создавать новую тему:
в каких случаях применяется такое скрытие реализации?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
19.09.2015, 01:37
т.е. вы предлагаете писать функции, которые ведут к UB в случае, если им передали параметры, на которые они не рассчитывают, а не которые устойчивы к любому набору входных параметров. и предлагаете обеспечить корректную работу всей программы за счет предварительных проверок перед вызовами функций. как-то это не айс. вот если такие функции функции имеются - как раз чтобы этими проверками везде и всюду не заниматься и делаются подобные обертки, чтобы всю эту рутину утилизировать. в противном случае в коде будет тьма захламляющих проверок.

Добавлено через 1 минуту
указанное сокрытие саттер вроде и расписывает дальше или перед этой рекомендацией. зачем тут этот вопрос задавать.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
19.09.2015, 01:40
Хулиган, это Вы Майерса читаете? Если нет, то можете почитать у него.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.09.2015, 01:40
Помогаю со студенческими работами здесь

Что такое ссылки на функции?
Хай. Вопрос в заголовке. Можно, пожалуйста с примером. Спасибо.

Что такое виртуальные функции?
Всем привет! Ребята, что такое виртуальная функция? Как пользоваться ими и для чего они нужны? Может кто объяснить?

Что такое имя функции?
скажите пожалуйста что такое имя функции? создаю указатель на функцию #include &lt;iostream&gt; void foo(void){

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что означает такое обьявление функции?
SimpleCat &amp;TheFunction()


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru