|
|
| Результаты опроса: Используете ли Вы оператор 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. Показов 14943. Ответов 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
|
||||
|
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
|
|
| 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
|
||||||||||||
|
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
|
||
| 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
|
|
|
1534 / 541 / 127
Регистрация: 09.01.2018
Сообщений: 1,758
|
||
| 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
Ваше отношение к не своим детям Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мобильное приложение 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 и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|