|
|
| Результаты опроса: Используете ли Вы оператор goto? | |||
| Программирую исключительно на goto |
|
4 | 10.00% |
| Использую, если имеет смысл |
|
22 | 55.00% |
| Категорически не использую |
|
13 | 32.50% |
| Использую, но никто об этом не знает |
|
1 | 2.50% |
| Голосовавшие: 40. Вы ещё не голосовали в этом опросе | |||
|
|
Рейтинг 4.59/68:
|
|
198 / 93 / 43
Регистрация: 09.11.2019
Сообщений: 414
|
|||||||||||
Ваше отношение к goto10.08.2021, 19:57. Показов 15067. Ответов 95
Всем привет.
Обычно оператор безусловного перехода goto хейтится. Данным постом я не хочу поднимать очередной холивар, хочу просто узнать мнение окружающих - как относитесь к практике применения goto там, где это имеет смысл, и используете ли сами. Парочка примеров, с которыми я столкнулся буквально вот на днях:
1. Либо сделать присвоение predicate = null(или ещё что) и избавиться от блока default целиком. Хотя лично мне спокойнее, когда default в коде имеется. 2. В блоке default скопипастить кейс, на который ссылаюсь(тогда при изменениях надо помнить, что менять нужно в 2 местах). В свитче я оставил goto(мой первый goto в жизни )Другой пример:
1. Применить SelectMany к groups и оставить один цикл foreach. 2. Повозиться с флагами и break'ами. Здесь мне готушить не хочется, не знаю почему. Т.е. можно и без goto жить в обоих приведенных(и ещё n неприведённых) примерах.
0
|
|||||||||||
| 10.08.2021, 19:57 | |
|
Ответы с готовыми решениями:
95
Ваше отношение к DOSу Ваше отношение к SCRUM Ваше отношение к Windows 10 |
|
Модератор
|
||||
| 13.08.2021, 22:30 | ||||
|
Даю оттуда пост с кодом: В той же теме есть реализация с использованием метода, но она лучше в сравнении с goto только для случая неоднократного применения этого метода. Допустим, для ввода нескольких переменных. Если использование метода будет однократным, то такая реализация хуже чем использование goto.
0
|
||||
|
1536 / 544 / 127
Регистрация: 09.01.2018
Сообщений: 1,768
|
|
| 13.08.2021, 22:36 | |
|
0
|
|
|
Модератор
|
||
| 13.08.2021, 22:44 | ||
![]() Неверно понял. Но, на мой взгляд, обсуждать исходники .Net бессмысленно. Это открытый проект, в нём участвует достаточное количество высококвалифицированных специалистов. Все решения принимаются сообществом после обсуждения. Возможно где-то обсуждение можно найти, а может оно доступно только его членам. Какую-то ясность мог внести бы только участник этого сообщества, но у нас Форуме таковых не наблюдается. В таких обстоятельствах, я априори считаю коды исходников "шаблоном (или примером) правильного кода". Сомневаться в верности принятия решения по определённой реализации у меня нет.
0
|
||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||||||||||||
| 13.08.2021, 22:48 | ||||||||||||
goto, которые мне нравятся больше. И мое обоснование, почему мне не нравится этот вариант постом ниже, не буду копировать.Мой вариант.
0
|
||||||||||||
|
1536 / 544 / 127
Регистрация: 09.01.2018
Сообщений: 1,768
|
||
| 13.08.2021, 22:59 | ||
|
0
|
||
|
Модератор
|
|||||||
| 13.08.2021, 23:33 | |||||||
|
Может мне и вместо докторов только самолечением заниматься? Из того что его применяют разработчики .Net я делаю только вывод о том, что в определённых ситуациях, задачах его можно использовать. И если мне попадётся такая задача, где я посчитаю (в меру моего опыта и квалификации), что использование goto это лучший вариант реализации, то я не буду от него отказываться, только из-за того что у кого-то "может вызвать рвотный рефлекс". Если изменять условия задачи, то конечно нет смысла для изменённых условий использовать goto. Как писал kolorotur,иногда приходится выбирать не между плохо и хорошо, а между плохо и ещё хуже. Вот вариант с вечным циклом и break, на мой взгляд, это "ещё хуже". Попробуйте описать на ваш взгляд критерии оценки качества кода, которые можно применить независимо от используемых инструкций. Исключить goto у вас получится только если явно вписать "goto - это плохо без всяких аргументов". Добавлено через 3 минуты ![]() Со всем уважением, я не специально. Копировал пост и не стал его редактировать.
0
|
|||||||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||||||
| 14.08.2021, 00:56 | ||||||
goto в том примере нет нагромождения кода или повторяющегося кода. Он такой же прозрачный и при этом не нарушает структурность кода.https://www.cyberforum.ru/blog... g5841.html Разумеется все написанное - мое ИМХО. На истину в первой инстанции не претендую.
0
|
||||||
|
Модератор
|
|||||
| 14.08.2021, 08:39 | |||||
Сообщение было отмечено Рядовой как решение
Решение
Мне и kolorotur на практике не встречались задачи где была бы в нём необходимость. Но наш практический опыт нисколько не означает, что goto НЕЛЬЗЯ применять в принципе. Сделайте то же самое без ссылок на MISRA, поскольку там запрет на goto не носит абсолютного характера и нисколько не противоречит моему взгляду на него.
0
|
|||||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||||
| 14.08.2021, 10:42 | ||||
На правах ИМХО.
0
|
||||
|
Модератор
|
|||
| 14.08.2021, 11:25 | |||
|
Сформулировать требования к качественному коду без относительно используемых операторов. И потом проверить насколько использование goto нарушает эти требования. Вы же, по сути, привели не критерии оценки качества кода, а "goto - это плохо". Хотя даже в этих пунктах (впрочем как и в MISRA) не "запрет goto", а рекомендации по незлоупотреблению им. С этим я согласен. Действительно разумное его использование на практике встречается крайне редко. Мне пока не встречалось. За исключением маленькой учебной задаче с которой началась наша предыдущая тема. Когда происходит переход в одноуровневый или нижележащий блок. Типа из одного else if {} в другой else if {}.Переход же из вложенного блока во внешний допустим, так как действительно в Шарпе по иному goto использовать невозможно. Добавлено через 4 минуты QuakerRUS, у меня нет текста MISRA. Но было бы интересно, что там написано в отношении вечных циклов....
0
|
|||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
|||||||
| 14.08.2021, 12:06 | |||||||
Можно придумать еще разные рекомендации касательно оптимальности, кроссплатформенности и т.п. при желании. else if {} вроде как нельзя перейти в другой else if {}.
0
|
|||||||
|
|
|
| 14.08.2021, 12:11 | |
|
Элд Хасп,
создается впечатление, что вы пытаетесь что-то доказать/опровергнуть, хотя в целом, ваша позиция относительно goto уже давно ясна. Более того, она фактически совпадает с мнением высказавшихся тут. Как вы совершенно точно отметили где-то выше (не буду искать для цитаты, примерно сказано было так: "современные ЯП ориентированы прежде всего на одновременную работу нескольких программистов"), то в этом случае про goto лучше забыть, т.к. далеко не все относятся к нему с такой же лояльностью, ну как мы, что ли. Для "собственного употребления" - да хоть на каждой второй строке.
0
|
|
|
1536 / 544 / 127
Регистрация: 09.01.2018
Сообщений: 1,768
|
||
| 14.08.2021, 13:45 | ||
|
Вы сводите объективную необходимость или отсутствие таковой к банальной вкусовшине, "религии". Но проблема goto появилась из других соображений, и была связана исключительно с программированием. Проблема была признана мировым сообществом. Есть даже теорема, которая доказывает, что код с goto, может быть переписан на код без goto, с полным сохранением функциональности, но не эффективности. Понимаете разницу с "религией"? То есть оператор goto обоснован там где невозможно достичь такой же эффективности без применения этого оператора. В вашем коде (я имею ввиду ваш пример), в качестве обоснования вы приводите только ваши собственные критерии оценки качества. Интересно, что в доках microsoft, оператор вполне законный, и применяется как раз в описанных в теме случаях, switch и nested loops. Нет ни слова, ни даже намека на то что оператор является устаревшим, нет рекомендаций воздерживаться от использования. При этом у самих microsoft этот оператор можно встретить, пожалуй лишь в исходниках. Справедливости ради, надо заметить, что в switch он выглядит вполне себе нормально и читабельность особо не ухудшает, поскольку находится внутри одного блока с метками. Тем не менее, отсутствие языковой гарантии перехода лишь по меткам case, ставит и этот случай в один ряд с остальными.
2
|
||
|
Модератор
|
||||||||||||
| 14.08.2021, 16:02 | ||||||||||||
|
Создавать метод ради разового применения, только с целью избавиться от goto - это намеренное усложнение и, следовательно, ухудшение качества кода. Только разве его органическим неприятием. Но это субъективный фактор вкуса. По третьему пункту, зависит от определения, что такое "структурно" и "последовательные блоки". Однозначно под этим не понимается строго последовательное выполнение кода. Иначе под это ограничение попали все циклы. Поэтому объясните почему блок с циклом - это структурно, блок с меткой и goto - это не структурно? В Шарпе нельзя. Но может можно в каких-то иных языках - я не знаю. В Шарпе есть видимость с нижнего уровня на верхний. Я просто не понял вашего С моей точки зрения, этот пункт не то что бессмыслен для Шарпа, а он учитывается в нём на уровне синтаксиса, спека. На мой взгляд вечный цикл гораздо хуже блоков с goto и потенциальная его опасность для багов, зацикливания в приложении значительно выше. ![]() "goto не следует использовать без веских оснований на то. В практике практически всех программистов задачи с целесообразностью его применения не встретится ни разу в жизни". Но кто-то делает из этого вывод, что его использование категорически негативно и плоха. Я же с таким выводом не согласен. Об этом и спор. Я даже не смотрел эти коды. Те которые смотрел для собственной надобности, там goto не попадался. Причин по которым они (разработчики) использовали именно его в неизвестном коде я не знаю. Но для меня сам факт его использования, доказывает, что в некоторых случаях его применение улучшает код - раз открытое сообщество спецов с гораздо лучшей чем у меня квалификацией его использует. Я это прекрасно помню, и помню насколько часто его раньше использовали. Тот же HF тоже совершал такой переход. Но одно дело необоснованно частое его применение, которое идёт во вред качеству кода. И полный запрет на его применение даже в тех случаях когда он может сделать код качественнее. Из первого никак не вытекает второго. В той же выписке из MISRA на которую сослались ранее, по сути, сказано тоже самое: Не использовать, если может ухудшить. Я, кроме различных холиваров, нигде не видел объективной оценки кода в коnором использование goto ВСЕГДА ухудшает качество кода. Только если в этих критериях жёстко задано "Goто = плохо!", без всякого объективного обоснования. Добавлено через 8 минут Доки все же предназначены для несколько иного. Такое можно встретить на MSDN. Но там в разное время, от разных авторов, можно порой встретить и прямо противоречащие друг другу рекомендации. Я не относительно goto, а в целом. Если читать журнал MSDN, то для правильной собственной оценки надо читать полностью все статьи посвящённые нужной тематике, понимать откуда взялась проблема, как менялось отношение к ней со временем, как она оценивается сейчас и потенциально в будущем... Такой довольно неоднозначный источник, часто требующий высоко порога знаний для верных оценок.
0
|
||||||||||||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
|||||||
| 14.08.2021, 16:16 | |||||||
|
Добавлено через 7 минут
0
|
|||||||
|
Модератор
|
|||||
| 14.08.2021, 16:25 | |||||
|
goto и метка должны быть в пределах "одного взгляда" - максимум 10-15 строк. Вообще методы размером больше пары страниц кода (грубо полсотни-сотни) строк - уже значительно ухудшают понимание кода. goto и метка - это единый блок кода внутри метода (просто он не выделен явно, но можно и выделить при желании) и как любой блок нежелательно делать его размером больше чем можно сразу охватить взглядом. Добавлено через 1 минуту Если плохо визуально воспринимаете без фигурных скобок, то задайте их явно. Добавлено через 3 минуты Если нет, то не надо на него вообще ссылаться. Даже та выписка которая предоставлена, и то ничего про "запрет goto" не содержит. В результате мы опять скатываемся ко всем холиварам на эту тему. Вы думаете так - я думаю иначе. И вечный циклы очень негативно на это влияют, на мой взгляд.
0
|
|||||
|
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
|
||||||
| 14.08.2021, 16:53 | ||||||
goto и придется делать рефакторинг этого места, если нужно будет добавить код...https://ru.wikipedia.org/wiki/... 0%B8%D0%B5 Вы пробовали читать исходники на Ассемблере? Там goto на каждом шагу и расположены не так далеко друг от друга. Однако код этот прочесть не так уж просто, так как не следует принципам структурного программирования.while (true) на мой взгляд более чем прозрачная.![]() break.
1
|
||||||
|
|
||||
| 14.08.2021, 17:32 | ||||
|
0
|
||||
|
|
|
| 14.08.2021, 17:39 | |
|
Если интересны мои оправдания
, то я ещё раз беспристрастно проанализировал - почему или зачем я использовал goto в своём проекте на Vb.Net. Обобщённый вывод такой: Весь код лежал в одной плоскости. Goto давал мне идеальную возможность не выходить за этот уровень. Это реализация без использования излишней логики или абстракций. Например. - мне надо было выйти из цикла и отобразить ошибку обработки. Но сделать это в обычной цепочке сценария - обработка, диалог результата, если ошибка - иконка ошибки, успешно - зелёненькая. Тогда я не пользовался эксепшенами. Чтобы отображать ошибку с отловом эксепшена, значит нужно было - наличие основного метода (был один большой) - блок эксепшена с разными типами ошибок - правильно закрыть известные мне файлы "чё то сложно" думал я. проще перейти в метку выхода, там это итак всё закроется и отобразится. - парсер. есть сложная (на тот момент или непродуманный сценарий) логика анализа строк файла. Например, я обнаружил в строке "флаг" нужных данных, но эти данные зависят от следующих. Поэтому я читаю следующую строку... а эту "держу в уме". И тут возникает сложная ситуация - если там найдены предсказуемые данные, то я просто сохраняю результат и перехожу к новому циклу. А если нет то, там может быть снова строка с "флагом". И мне волей не волей приходится бросить "goto" чтобы снова вызвать обработу этой новой строки. Иначе если я бы ушёл на новый глобальный цикл чтения что потерял бы уже прочтённую строку. Конечно моя ошибка - в цикле должна быть только одна строка чтения данных из файла. Но тогда мне надо иметь флаги состояний определяющие что я читал последний раз, были ли это ожидаемые данные, завершилось ли это успешно... Лексер парсер не иначе. Но мне было быстро, просто и понятно - вызвать блок анализа строки. Надеюсь поток мыслей был полезен.
1
|
|
| 14.08.2021, 17:39 | |
|
Ваше отношение к co-working? Ваше отношение к flash-заставкам Ваше отношение к деятельности Anonymous
Ваше отношение к не своим детям Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|