49 / 25 / 2
Регистрация: 09.06.2008
Сообщений: 227
|
|
1 | |
Выполнять определенные действия при любом выходе из функции25.09.2012, 23:24. Показов 3698. Ответов 41
Метки нет (Все метки)
Есть функция, в которой ряд ветвлений и return'ов... при этом хотелось бы при каждом return'е выполнять определенные действия (обнуление флагов, освобождение памяти и еще ряд операций).
Как такое грамотнее реализовать?
1
|
25.09.2012, 23:24 | |
Ответы с готовыми решениями:
41
Как не выполнять действия при определенном условии? Определенные действия при подключении флэшки Выполнять действия через определенные интервалы таймера Написать автотест, который будет выполнять определенные действия |
Супер-модератор
|
|
26.09.2012, 00:34 | 2 |
Вообще-то лучше писать функции так, чтобы в них был единственный return.
В самом крайнем случае можно обернуть всё тело функции в try {здесь тело функции} /__finally {действия при выходе}, тогда перед выходом по return-у выполнится то, что записано в блоке __finally. Но это - костыль.
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
26.09.2012, 00:41 | 3 |
Сообщение было отмечено как решение
Решение
Часть кода которую нужно сделать написать в конце ф-ции, а вместо ретурнов в ф-ции писать goto туда где стоит эта часть кода.
3
|
Практикантроп
4824 / 2717 / 525
Регистрация: 23.09.2011
Сообщений: 5,777
|
|
26.09.2012, 09:20 | 4 |
Если в функции множество ветвлений, то резонно в самом начале определить переменную (скажем - steps), которой в каждой ветви присваивается некое значение. А при завершении обработки эта переменная анализируется (типа swich - case... снова ветвление )
2
|
26.09.2012, 15:14 | 5 |
Обеими руками за
Вопрос на засыпку: а почему вообще в функции много return'ов оказалось? Потому что либо при ветвлении функция должна возвращать различные значения, либо возвращать она ничего не должна, а автор просто не умеет работать с условиями или циклами. В первом случае нужно модифицировать возвращаемое значение в зависимости от ветвлений и в конце возвращать его один раз, выполняя при этом некие побочные действия. Во втором - выпрямлять руки.
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||||||||||||
26.09.2012, 16:04 | 6 | |||||||||||||||
Пример на вскидку. В начале ф-ции проверяем корректность переданных параметров. Причем сначала мы делаем быстрые проверки в одном условии. Если не прошли, то нужен ретурн. Затем мы делаем более сложные проверки, с расчетом некоего промежуточного параметра. Если не прошли то ретурн. Если прошли считаем следующий параметр и т.д.
Я бы сделал так:
1
|
Супер-модератор
|
||||||
26.09.2012, 16:26 | 7 | |||||
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
26.09.2012, 16:35 | 8 |
Хоть goto и является в некоторых странах персоной нот грата, в данном случае я всеми четырьмя лапами ЗА. И код это нисколько не запутывает, а скорее проясняет, и вообще goto вниз некоторыми не слишком упертыми теоретиками считается вполне допустимым...
Добавлено через 2 минуты Извиняюсь, перепутал цитаты. Имел в виду эту
1
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
26.09.2012, 16:45 | 9 | |||||
UI, и чем ваш пример с do, break, while лучше ретурнов? Тем что добавляет ненужный do и отступ на протяжении все ф-ци. На мой взляд ваш вариант выглядbт более запутанным. А если я хочу в самом теле ф-ции (после всех начальных проверок) тоже использовать do, while или for из которого иногда тоже хочу выйти ретурном? Мой вариант сработает ваш нет.
По поводу goto и его не применимости. Не могу сдержаться и не задать вопрос. Как написать такой пример без goto:
1
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.09.2012, 16:49 | 10 |
Чего это вдруг? Пусть возвращает сколько требуется/хочется значений. А потом уже в другой функции разбираться с результатами. К примеру GetKeyState() возвращает аж четыре разных результата. И что? Хочется ей - пусть возвращает хоть миллион.
Или я уже с дурацкими замечаниями опоздал?
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
26.09.2012, 16:58 | 11 |
UI, а если я передаю в ф-цию массив и хочу проверить чтобы в переданном массиве не было нулевых элементов и если есть хоть один (когда найду первый равный нулю) то ретурн, тогда что? Мой вариант сработает ваш break нет.
0
|
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
|
|||||||||||
26.09.2012, 17:18 | 12 | ||||||||||
А судя по описанию GetKeyState возвращает один результат SHORT
Ну и чтобы далеко не ходить
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
||||||
26.09.2012, 17:28 | 13 | |||||
gumi250, Ну, можно сделать и так
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.09.2012, 17:31 | 14 |
0
|
Day
|
26.09.2012, 17:45
#15
|
Не по теме:
0
|
26.09.2012, 17:46 | 16 |
Ну да, есть такое малость. Смотри первый пост в теме - поймешь, зачем один return нужен.
Нет совершенно никакой необходимости доказывать всем, что куча return'ов на твой взгляд удобнее, читабельней и вообще единственно возможный вариант и прочая, прочая... ТС озвучил вполне конкретное желание - один return и возможность до этого освободить память вне зависимости от логических ветвлений. Желание просто поспорить представляется несколько за рамками темы.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
26.09.2012, 18:00 | 17 |
Уже понял. Я молчу.
Day, добро пожаловать ко мне под пыльную кровать. Ну а по теме: было бы неплохо все таки в конце увидеть обобщенный результат.
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||||||
27.09.2012, 00:11 | 18 | |||||
BRcr, нет желания просто поспорить, есть желание посмотреть как делают другие, может они делают это лучше меня.
Возможно вы считаете этот вариант кода лучшим:
Может вы видя do в начале ф-ции думаете, и о досрочном ретурне, а я думаю о цикле в который зачем то заключена вся ф-ция. Да goto не совсем читаем, но иногда другие варианты еще хуже.
1
|
27.09.2012, 00:30 | 19 |
Глупость. Лишних сравнений не будет, да и быть не может. Прочитай код повнимательней - что с goto, что с endloop суть не меняется: по исполнении условия циклы прерываются. Вопрос использования или неиспользования goto - это вопрос персонального удобства, на вкус и цвет, как говорится.
Любой алгоритм можно оформить одинаково эффективно, используя либо флажки, либо goto, либо break, либо еще чего...
0
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|||||||||||
27.09.2012, 00:34 | 20 | ||||||||||
Как это не будет лишних сравнений???
А чем тогда отличаются эти два участка кода?
2
|
27.09.2012, 00:34 | |
27.09.2012, 00:34 | |
Помогаю со студенческими работами здесь
20
Как можно заставить программу выполнять определенные действия после нажатия клавиши ENTER При любом изменении содержимого richTextBox выполнять определенный код Определенные действия программы при разрыве сети Макрос, который будет выполнять определенные вычисления по базе данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |