|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
Оператор GOTO: за и против20.11.2011, 16:38. Показов 15036. Ответов 146
Метки нет (Все метки)
Люди, по ходу, газет не читают:
Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO», который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность. Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения (то есть парадигму структурного программирования), и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO также аннулирует многие возможности компилятора по оптимизации управляющих структур Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный Начало тут
0
|
|
| 20.11.2011, 16:38 | |
|
Ответы с готовыми решениями:
146
Оператор GOTO и его метки Goto - за и против Оператор goto |
|
Кормпилятор
|
|||||
| 30.01.2017, 15:14 | |||||
|
The trick по делу пишет. Терпеть каскады If\End If - да ну нафиг... О таком угандошивании
кода яростные сторонники структурного программирования упомянуть забыли. экстраполируются на что-то более ёмкое, неопределённое, где софт пишется далеко не с первой попытки даже имея разработанный вариант архитектуры. И реструктуризация по примеру выше(например при сложном парсинге) может вылиться в каскад конструкций на три четыре экрана в ширину, разумеется если программист вообще в силах будет такое мутить, но дерут сомнения в этом.
насколько всё соответствует действительности, а то вдруг перед нами российский клон Кена Сильвермана... позволит ни один более менее осведомлённый программист.
0
|
|||||
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
||||||
| 01.02.2017, 17:02 | ||||||
|
Переключение между блоками.
1
|
||||||
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
|
| 21.04.2017, 21:29 | |
|
Я сейчас программирую на языке Python а GOTO переход там не как найти не могу.Теперь буду там программировать хоть я не сторонник удаления GOTO перехода...
1
|
|
|
|
|
| 22.04.2017, 11:01 | |
|
они нашли друг-друга)
0
|
|
|
0 / 4 / 0
Регистрация: 02.04.2017
Сообщений: 61
|
||
| 12.05.2017, 21:34 | ||
0
|
||
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
|
| 15.01.2023, 19:35 | |
|
Как с помощью CALL ABSOLUTE и DEF SEG преодолеть GOTO переход?...
![]() ![]()
0
|
|
|
COM‐пропагандист
|
|
| 15.01.2023, 20:54 | |
|
Преодолеть — в смысле убрать? Откройте редактор и уберите оттуда GOTO.
0
|
|
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
|
| 15.01.2023, 21:43 | |
|
Гото переход все выключает а информация из включённой программы передаётся.ассемблером со стороны из компьютера памяти!,.......,..............
0
|
|
|
Супер-модератор
|
||||||
| 17.01.2023, 11:47 | ||||||
|
Дискуссия вокруг GoTo - это типичный психологический феномен массового сознания. Дейкстра, разумеется, прав - избыточное использование GoTo приводит к плохому коду. GoTo превратился в мем. А массовое сознание к мышлению не способно. Оно "мыслит" клипово: "Раз Goto, значит плохо". Так же "мыслит" и нейросеть...
Но каждый, кто достаточно хорошо знаком с программированием, понимает: императивное программирование на низком уровне (на существующих архитектурах) вообще невозможно без Goto. Есть Goto и во внутренних языках виртуальных машин (мне так кажется). Есть он и в ряде языков (напр. в C/С++). Известно также, что все конструкции с GoTo можно реализовать и без него. Но вот эти реализации могут быть довольно неуклюжими. Типичный пример - выход из группы вложенных циклов на самый верхний уровень. Без GoTo это можно сделать с помощью флаговых переменных. Но - довольно "стрёмно". А вот в "политкорректной" джаве GoTo, разумеется, нет. Но! Вот как решается в джаве приведенная выше проблема:
Конечно, это не переход в чистом виде, но нечто весьма к нему близкое!
1
|
||||||
|
COM‐пропагандист
|
||||||
| 17.01.2023, 19:20 | ||||||
|
Просто засовываете этот двойной цикл в функцию и делаете Return когда надо. Вот код на FreeBASIC:
0
|
||||||
|
Кормпилятор
|
|||
| 18.01.2023, 02:21 | |||
|
Плохой код это тот, который не работает или содержит баги. Лично у меня нет вопросов к спецам, чей код работает прекрасно, есть ли там макароны или нет. А дядя Эдсгер и его последователь Вирт совместно обосрались по этой теме, добавив в своё творение goto, вместо предполагаемых "технических средств"(реструктуризация кода), Вирт был не дураком по мозгам, но болваном по жизни, доверяться нужно не хлипкому теоретику, а толковому практику который делом может показать, а не словом пустым. Если выразиться простым языком - мы теряем идеологически чистую модульность. Это не макароны, конечно, но такой прям неприятно рваный код с кучей перебежек туда сюда, которые распыляют внимание. Добавлено через 5 минут Но это не о коде выше, а о чём-то потолще.
0
|
|||
|
COM‐пропагандист
|
||
| 18.01.2023, 04:02 | ||
|
Обычно там где кусок кода с двойным циклом — это что‐то для поиска. Потому что как нашли нам нужно выйти, дальнейшая беготня по циклу не нужна. Логично создать функцию вроде FindЧтото и запихнуть туда этот цикл. Иногда даже так и пишут в комментариях рядом: /' ищем то‐то и то‐то в массиве '/ что тоже явный признак отдельного логического блока. И таким блокам следует давать название и выносить в функцию.
0
|
||
|
Супер-модератор
|
||
| 18.01.2023, 08:00 | ||
|
0
|
||
|
Кормпилятор
|
|||
| 18.01.2023, 18:11 | |||
|
(это его личное дело), более того сейчас есть всякие обфускаторы которые намеренно запутывают код, в этом смысл даже есть для защиты информации. Но сейчас люди(нормальные) и не пишут макароны, им для себя же не выгодно это. И разумеется к этому не призываю, а лишь говорю что таких обязательств нет. которую человек хочет изучить или почему например не кусок кода с формулами? Уверен, что понимаешь что такое модульность и зачем она нужна? Ты же сам радел за сборку объектных файлов. Представь себе многосложные процедуры по 100, 200, 500, 1000 строк, это же совсем другое дело они кишат кучей конструкций которые могут делать много всего и где важных деталей не одна и не две, но процесс должен быть локализован в процедуре, чтобы не тащить лишних деталей в более высокоуровневую логику программы. Чем более грамотно разбита прога, тем проще по итогу работать с функционалом кода, проще читать и разбирать код незнакомому человеку. И вот смотри чел заходит в функцию A и видит 10 вызовов B, C, D, E, F, G, H, I ,J, K и на этом месте его клинит, потому что теперь он должен в уме припаивать одну к другой, чтобы собрать общую картину. А так он бы просто читал код, без беготни туда сюда по процедурам. Модульность как идеология ломается малозначимостью этих B...K функций. И не потому что они не могут быть короткими, а потому что в них сугубо циклы эти драные, они разбиты не потому что требуют декомпозиции или выделения по общим признакам задачи или в виде "чёрного ящика"(того что под капотом, чтобы лишний раз не лезть), а именно разбито просто так, без особого на то смысла. Человек, привыкнувший к нормальной модульности будет долго ломать бошку зачем это сделали. Мы получаем излишнюю декомпозицию и бонусом издержки ЦП на вызов этих функций, потому что их, возможно, будет много, коли всюду придерживаться такой специфики. Это не та цена, которую стоило бы платить за отказ от GOTO. Лучше GOTO, либо таки воспользоваться флагами. Вообще внешнее кольцо цикла можно заменить на цикл DO, тогда можно будет выскочить через EXIT DO не прибегая к клепанию процедур, но даже это плохо(мы это уже обсуждали, кстати), потому как конкретные конструкции не зря придумали. Городить всегда ради этого процедуру, другой вид цикла или ещё что-нибудь - ну такое себе. Плюс на практике редко бывает вложенность выше 3-х. Главная проблема GOTO это не его наличие, а переплетение прыжков, когда прыжки идут в разные места. И к примеру один прыжок пересекается с другим(одна ветвь кода начинает как-бы рекурсивно по ходу дела включать в себя другую), т.е. один идёт сверху вниз, второй наоборот. Когда GOTO локализованы, не пересекаются или имеют чёткую структуру(прыжки в одно место) с ними обычно проблем нет. GOTO по большей части применяется ситуативно, когда без него реально трудно обойтись. И количество таких применений - единицы на несколько килострок. Т.е. ничтожно мало. Нет смысла его избегать. И опять же когда идёт дедлайн и нет времени реструктурирвоать код, реструктуризация большого куска вещь опасная, можно запороть весь код, запутаться и обосраться по дедлайну переписывая код заново. При инженерном подходе где прорабатывается вся архитектура - GOTO исключаются полностью. Т.е. это не проблема сделать без GOTO. Проги с ситуативным GOTO - скорее признак того, что прога писалась на время. P.S: Вообще не люблю код, который увидел выше, в нём вообще ноль от бейсика, там и _ подчёркивания голимые, когда можно и нужно без них, они портят весь вид кода, потом выполнение функции сразу во время инициализации. Как-бы понятно зачем, но визуально выглядит адски хреново. Если коду нужна критическая скорость проще написать его на ассемблере, будет адекватнее и прогер сразу всё поймёт, что это критический кусок и там нужна скорость. Плюс нету комментов. Т.е. оформление кода, чтобы его удобно было читать, тут - на двоечку. Попытка усидеть на трёх стульях: выдержать стиль с++, написать критический по производительности код на бейсике(что лучше не делать) и при этом уйти от GOTO, разрушая модульность(важнейшую вещь). Программируя на Бейсике лучше сохранять каноны ЯП, например @ можно было бы заменить VARPTR, SizeOf(UByte) задекларировать как константу оператором CONST в начале программы, не выполнять memcmp во время DIM (завести переменные до цикла) т.к. это нагромождение двух действий в одну строку. Раньше очень даже правильно декларации переменных\массивов были отдельно и не было такой возможности, потому что пихать в них код - ну это писец, это два концептуально разных действия.
0
|
|||
|
COM‐пропагандист
|
|||||||||
| 18.01.2023, 19:15 | |||||||||
|
А вот выпрыгивать наружу из циклов и даже двойных — это нужно. В VB.NET для этого сделали Exit For For (повторяем столько раз, сколько нужно прыжков). Если сделать Dim Finded As Long — это сначала создат переменную и обнулит её, а потом на следующей строка Finded = memcmp(), мы записываем результат функции в Finded. Спрашивается, зачем мы обнуляем переменную, если нуль мы всё равно перезаписываем? Гоняем процессор вхолостую?
0
|
|||||||||
|
Кормпилятор
|
||||||
| 18.01.2023, 20:01 | ||||||
|
Но если этот функционал нежелательно видеть в других процедурах - то его и не надо туда пихать. 500-1000 для меня норм, если внутри всё концептуально собрано. Человек в любом случае должен будет держать весь этот код в памяти иначе он с ним ничего не сделает, просто чем больше он технического кода сможет распихать по процедурам строго по смыслу - тем читабельнее будет. Просто когда начнёшь именовать ничего не значащие концептуально куски кода, то станет трудно это адекватно делать длина имён станет невообразимой, а читающий код вылупит глаза, как в фильме "вспомнить всё".
_ этого _ должен _ быть _ хелпер _ в _ среде _ разработки _, _ а _ не _ эта _ срань _ в _ коде _. Есть CTRL + вправо, для быстрой пробежки по словам, есть Home\End, можно в теле процедуры (или перед ней) выделять блок с комментариями и там в подобном стиле растолковывать каждый параметр, это полезно для больших прог. Некоторые редакторы дают возможность уменьшать масштаб колёсиком. Короче технических средств много. А это забивает весь экран этими самыми _, неприятно это видеть в коде и читать такой код.
1
|
||||||
|
Кормпилятор
|
|||
| 18.01.2023, 23:00 | |||
|
А одно лишнее зануление, по отношению к циклу, где действий делается в сотни\тысячи раз больше - ровным счётом ни на что не повлияет. Да и если на то пошло, что доходит до того, что мы вынуждены считать зануления и мелкие аспекты внутренней работы операторов бейсика, то это звоночек, что пора уже писать на уровне ниже или использовать память вручную, а не вымучивать всё это на бейсике, так хотя бы прозрачнее. Ну если уровень заморочек вырос настолько. А так да FB гибок, наворотили по-взрослому, но для старожилов от Бейсика это выглядит как-то совсем с ног на голову. Чтобы быстро найти нужную переменную в начале программы\подпрограммы или соотв. быстро понять задекларирована она или нет. Банально, пишешь прогу, тебя отвлекли, отошёл, вернулся, уже не помнишь что где декларировал, проверять несколько сот строк пестрящих переменными - как бы идея не очень. А так вернулся в начало функции, последние задекларированные видно сразу, сразу проверил чего не хватает и тут же дописал. Обычно вешаю закладку на начало и на место, где сейчас пишется код. 1 клик - и уже в нужном месте. В общем-то ничего нового и отсебятинского не говорю, люди на QB с давних пор, так делали, группировали, константы, декларации типов, прототипы процедур, декларации массивов, потом шёл код и процедуры. Когда у тебя в программе всё по полочкам - совсем другое дело, на неё приятно смотреть. Мне не всегда удаётся этому следовать, FB и современные IDE сильно развращают, но как бы эталон есть эталон, не просто так в QB это было сделано, реально приучало к порядку. На асме например тоже было важно настроить и заассумить сегменты сразу, это просто давало порядок в программе. Это примерно как порядок на рабочем месте, отвёртка в одном месте, молоток в другом и т.п. Конечно это не помешает разложить код, просто немного пофыркаю, делая оформительскую работу за другого человека, всё равно это время и его жалко.
0
|
|||
| 18.01.2023, 23:00 | |
|
Помогаю со студенческими работами здесь
100
Оператор goto
оператор GoTo Безусловный оператор GoTo Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера 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. Пошагово создадим проект для загрузки изображения. . .
|