|
|
| Результаты опроса: Используете ли Вы оператор 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. Показов 15078. Ответов 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 |
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
||||||
| 11.08.2021, 19:42 | ||||||
|
Имхо, если вас где нибудь спалят за использованием goto - сразу повесят клеймо говнокодер. И потом доказывай что ты что то там оптимизировал и вообще он есть в исходниках платформы.
Вот недавно статья на хабре вышла https://habr.com/ru/post/571342/ У автора было тестовое задание с требованием на максимальную производительность, автор понаписал кучу супер быстрого кода, с которым ему хамски отказали без всякого фидбека
0
|
||||||
|
|
|
| 12.08.2021, 08:51 | |
|
Обсуждали, обсуждали, что использование - это скорее исключительная необходимость.
Но странно, почему в голосовании чёткое разделение? Моего варианта нет - "Никогда не возникала такая необходимость". После перехода с VB.NET на C# ни разу такого не писал. И про то? что это "фу-фу, делать так не надо" тоже не знал.
0
|
|
|
768 / 496 / 216
Регистрация: 05.04.2015
Сообщений: 2,080
|
|
| 12.08.2021, 09:31 | |
|
switch может не правильно работать если без готу обрабатывать данные-раз, выход из вложеных цыклов-два, переход обратно к вводу, вместо бесконечного цыкла -три, читаемость кода сохраняется-четыре. Кто проходит собеседование-минус один
0
|
|
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
|
| 12.08.2021, 09:43 | |
|
zhunshun, примеров, конечно же, не будет?
0
|
|
|
768 / 496 / 216
Регистрация: 05.04.2015
Сообщений: 2,080
|
|
| 12.08.2021, 10:30 | |
|
Рядовой, Про устроиство на работу? В результатах могут только очень нелестные отзывы, а про какои пример? https://docs.microsoft.com/ только оттуда. До сих пор используетса и будет пример про кофеиныи автомат
0
|
|
|
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
|
|
| 12.08.2021, 10:42 | |
|
zhunshun, этот пример запилен для демонстрации конструкции goto case. Вы приведите реальный пример, где без goto не обойтись. И зачем тут ссылка на мсдн?
0
|
|
|
768 / 496 / 216
Регистрация: 05.04.2015
Сообщений: 2,080
|
||
| 12.08.2021, 11:01 | ||
|
0
|
||
|
|
||
| 12.08.2021, 15:50 | ||
|
А пример вообще реально ниочёмный. Сейчас натравить на них тех же писателей NetCore, они бы изничтожили там всё за такое. Но подозреваю что данный пример приведён ТОЛЬКО для показа возможностей, которые можно делать в switch.е. Ибо... что это за переходы снизу вверх ради суммирования? Ну и у меня сразу напрашивалось - почему "большая чашка" сразу сделала +50, а не перешла в "медиум"? Там бы выше пошло на "смолл" и получилось бы тоже самое. Но зато по сценарию. А так снова напрашивается - почему бы сразу +75 не сделать? Ибо в "чистом коде" полюбому бы написали типы с закрытыми свойствами для нужной калькуляцией. И без свича б всё порешали. Так что пример плохой. Найдите ещё.
0
|
||
|
768 / 496 / 216
Регистрация: 05.04.2015
Сообщений: 2,080
|
|
| 12.08.2021, 17:16 | |
|
0
|
|
|
Модератор
|
|||
| 13.08.2021, 13:22 | |||
|
Вопрос-то собственно имеет отношение к любому ООП языку. Да, и не только к ОПП ЯП, скорее ко всем где есть много разных циклов. Допустим, Фортран (сейчас не знаю, я 80-х) вообще кроме For циклов не имел. И реализовать программу без Goto было просто невозможно. А а VB.Net есть все циклы, что и в Шарпе. Добавлено через 4 минуты Они всерьёз не рассматриваются. Никто не будет сейчас, как раньше на Фортране, вместо циклов do, while, условий в for использовать конструкции исключительно на goto. Поэтому в опросе по сути два варианта ответа: 1 - Никогда не использую по религиозным причинам, и 2 - Использую очень редко, когда это действительно необходимо.
1
|
|||
|
|
||
| 13.08.2021, 17:47 | ||
А вопрос хороший, я даже и не подумал об этом. Сейчас поиском пробежался, огромное количество.И если проанализировать причину то: - я был молод и учился самостоятельно. Ни о каком чистом коде, в 2005ом, и не знал. - увидев код, сразу подумал про MSSQL, ибо очень похоже. Там приходится именно так и делать - вконце программы две метки - успешный и не успешный выход и возвращаем разный результат. Видать корни оттуда растут.- грубо говоря использование в старом коде оправдано. Когда метод занимается Всем, то он соответственно размером в несколько страниц. И простыми ретурнами выйти нельзя, а оборачивать всё в "if"ы слишком громозко. Хотя именно так и появлялись флаги "bool lastStatus... if(lastStatus) ..."
1
|
||
|
|
|
| 13.08.2021, 18:19 | |
|
На Бейсике без goto было ни куда. В далеких 80-х... А потом, какие-то парни вдруг посчитали, что скачки по программе в неизвестные места - это плохо. От сюда пошло это неписанное правило. Но как бы там ни было - оно прижилось.
0
|
|
|
Модератор
|
|||||
| 13.08.2021, 19:19 | |||||
|
Goto очень присущ процедурному программированию. И тогда это было обоснованно. При всех прочих, конструкции с goto легче оптимизируются, дают меньший и более быстрый код. Любой вызов метода - это сравнительно длительная и ресурсная операция. Эпоха процедурного программирования - это эра относительно слабых компов. И там приходилось экономить, оптимизировать буквально на всём. Я сам помню, когда подсчитывал каждый бай в скомпилированной программе, вообще не использовал call в пользу jump. Но мы же говорим о другой эпохе. ООП само по себе, при любых раскладах, затратнее и объёмнее процедурного силя. Цель его совсем в ином: упростить работу программистов (в первую очередь коллективного программирования) за счёт большей нагрузки на железо. А этом отношении VB.Net - это не Basic и не QBasic. Это полноценный ООП ЯП, возможно, с несколько устаревшим (на мой взгляд) синтаксис, но это не мешает на нём реализовывать решения с соблюдением всех принципов ООП и SOLID. Призыв к отказу от GoTo тоже относится к этой эпохе, когда преимущества получаемые от его применения стали не существенными на фоне его недостатков для современного понимания качества кода. Поэтому при выборе в пользу Goto нельзя основываться на его более быстром выполнении и компактной компиляции. Это имеет значение только в крайне редких задачах. Скажем так "относительно низкоуровневых", например уровень библиотек .Net. Но кроме них, на мой взгляд, бывают задачи где использование Goto позволяет сделать код метода более прозрачным, легче понимаемым и т.д. Я приводил в пример Фортран. Но если переход Goto на метку в пределах "одного взгляда", если это позволяет избавиться от дублирования кода, если для замены его приходится вводить метод, если .... и многие ситуации в которых goto улучшает код и делает его качественнее, то использовать его не только допустимо, но и НУЖНО. Для тех кто глубоко, хорошо понимает ООП, теорию и происхождение принципов, правил, рекомендаций в нём - Goto никогда не был под запретом. Да, из-за развития ЯП в реальном программирование эффективное и оправданное его использование очень снизилось. Если не брать "низкоуровневое программирование", то можно сказать, что его почти полностью исключили из применения. Но это никак не исключает того, что в какой-то очередной задаче вы можете наткнуться на условия которые лучше всего реализовать используя goto. И если такое произойдет, то не надо это отвергать из-за нарушений религиозных табу.
0
|
|||||
|
|
|||
| 13.08.2021, 19:30 | |||
|
0
|
|||
|
Модератор
|
|||
| 13.08.2021, 19:56 | |||
|
Религия, конечно, здесь используется не в прямом смысле этого слова, а как термин для обозначения строгого следования каким-то традициям и правилам без обоснования их полезности, эффективности, с неприятием любого отличного мнения без рассмотрения его аргументов. На практике, в простой теме мне только один раз встретился случай когда на мой взгляд всё же стоит реализовать используя goto. Ранее я давал ссылку на соответствующее обсуждение. kolorotur, на сколько помню, написал, что ему на практике вообще ни разу не приходилось его использовать. Но тем не менее, я, он и некоторые другие, считают, что если нам не попадалось такой задачи задачи, это не значит, что она не может попасть кому-то другому. И коды .Net прекрасное доказательство для обоснованности такой позиции.
0
|
|||
|
|
|||
| 13.08.2021, 20:04 | |||
|
Элд Хасп, так и я не запрещаю никому его использовать.
0
|
|||
|
Модератор
|
||
| 13.08.2021, 22:16 | ||
|
В контексте обсуждения именно goto, априори, подразумевается, что по остальным критериям код соответствует всем требованиям. То есть речь идёт о том, делает либо код применение в нём goto автоматически "кривым" даже, если применение в данной задаче для данных условий оптимально: без него появляется дублирование, или надо вводить одноразовые методы, делегаты, или требуются дополнительные переменные и проверки условий и т.п.
0
|
||
|
1536 / 544 / 127
Регистрация: 09.01.2018
Сообщений: 1,768
|
|||
| 13.08.2021, 22:21 | |||
|
Да причем здесь религия? В большинстве случаев, код с применением goto можно отрефакторить и избавиться от него. Почему это стоит сделать уже писали выше. Чего ради напевать ему дифирамбы? Потому что в исходниках .NET этот оператор иногда используется? Так это не показатель. Это узко специализированная область, в которой его применение возможно оправдано. Но в точности сказать этого никто, кроме разработчиков .NET скорее всего не сможет. Может есть на то причины, а может и нет их, просто так удобно и вполне законно. Обратите внимание, во всей теме, нет ни одной четко обозначенной причины, почему в таком то куске исходника используется оператор goto. Мне тоже никогда не приходилось его использовать. И я даже сомневаюсь, что когда либо я смогу вспомнить о том, что существует такая возможность. Более вероятно, я буду рассматривать возможности реструктуризации кода, потому что, если goto является единственным выходом, скорее всего с кодом/алгоритмом что то не то и надо над ним еще раз подумать.
0
|
|||
| 13.08.2021, 22:21 | |
|
Ваше отношение к co-working? Ваше отношение к flash-заставкам Ваше отношение к деятельности Anonymous
Ваше отношение к не своим детям Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
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, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|