|
Платежеспособный зверь
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
|
|
Оператор GOTO: за и против20.11.2011, 16:38. Показов 15958. Ответов 146
Метки нет (Все метки)
Люди, по ходу, газет не читают:
Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO», который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность. Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения (то есть парадигму структурного программирования), и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO также аннулирует многие возможности компилятора по оптимизации управляющих структур Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный Начало тут
0
|
|
| 20.11.2011, 16:38 | |
|
Ответы с готовыми решениями:
146
Оператор GOTO и его метки Goto - за и против Оператор goto |
|
COM‐пропагандист
|
||
| 19.01.2023, 11:55 | ||
|
Когда нам нужно сохранить результат чего‐то — это необходимость для объявления переменной. Когда эта переменная используется только внутри блока — нам достаточно объявить её внутри блока.
0
|
||
|
Кормпилятор
|
|||||||
| 19.01.2023, 20:21 | |||||||
|
и достаточности - то достаточно будет машинных кодов и никто не докажет, что этого недостаточно. Представь себе баттхёрт мирового сообщества на эту тему. Говорил про довольно важную вещь - что порядок на рабочем столе и в голове важен, это делает рабочий процесс более продуктивным и эффективным и не обязательно более приятным. То как лично тебе приятнее видеть код - мне до этого дела нет, я к профям не лезу, самоорганизация - это их личное дело, можно писать и так и эдак, как угодно, главное чтоб работало(это и есть результат труда, чтобы можно было пользоваться, чтобы труд не пропал). По оформлению говорю про то, как это было ~35 лет тому назад и привожу доводы, что ничего сильно не поменялось. Визуальное восприятие у людей работает всё так же, никаких ноу-хау тут не было и нет. Долгое время этот стиль прослеживался в хорошо оформленных исходниках крупных компаний, таких как Microsoft и ID. А потом "массы поплыли", это стихийно и тут ничего не сделать. И все мои советы касаются прежде всего QB кодеров, впоследствии перешедших на современные BASIC диалекты, советы универсальные, помогают писать код в превосходно читаемом, простом человекоязычном QB стиле, разрабатывать легко портируемый код, который годится на портаж даже на НУ при необходимости. Помогают не дёргаться туда сюда и не страдать хернёй за компом. Негласный "стандарт" оформления кода QB пока из BASIC'о подобных диалектов популяризировался сильнее всего, его и освещаю во всех деталях и подробностях, как правильно, как по фен шую. А т.к. FB создавался как клон QB и поддерживает тот же самый синтаксис и стиль кода, то эти знания можно применить и на нём. Это не единственный допустимый вариант и не настаиваю, но это надёжный и концептуально строго организованный вариант, при котором код, переводя, можно получить на нескольких диалектах относительно без проблем. Добавлено через 37 минут Т.е. ожидаю оформления кода типа такого, если конечно правильно понял, что этот код делает. Ну ещё пожелание делать такие штуки сразу с примерами.
Для QB\QBasic описание заталкивается внутрь функции, для других - можно оставлять снаружи.
0
|
|||||||
|
COM‐пропагандист
|
||||||||||||||||||||||
| 19.01.2023, 22:09 | ||||||||||||||||||||||
|
Теперь по коду.
Можно включить перенос, но это всё равно не спасёт, потому что легко запутаться где конец и где новая строка. С другой стороны, у записи «в столбик» есть преимущество: можно объяснять параметр сразу, вместо дублирования в заголовке:
Почему не создаём переменные вместе с инициализирующим значением? Почему счётчик цикла существует за пределами цикла?
1
|
||||||||||||||||||||||
|
Кормпилятор
|
||||||||
| 20.01.2023, 02:57 | ||||||||
|
чем параметров в прототипе. Да и как показал оформить мне не сложно, для себя же делается. без этих говноскобок закорючек и подчёркиваний, потратить две минуты, оформить код как белый человек. В рабочем коде(с которым идёт работа) в любом случае крайне желательно какое-то внятное описание функции и параметров. А из вида, в котором оформил параметры, легко копировать через двойной щелчок. Про копирование переменных вместо набивки их руками уже много было сказано, много людей на этом подвернули карачку. Это всё удобно и читабельно без закорючек, фентиклюшек и лишней информации в виде BYVAL-ов и типов(эту тех инфу можно посмотреть в прототипе), просто оставим прототип в покое, пусть он живёт своей жизнью, а комментарии своей. Не понимаю зачем туда лезть и нашпиговывать это месево? Именно поэтому в QB нету подчёркивания и по итогу гораздо чище всё выглядит. высекается сначала на бумаге, никак не за компом и всё выверяется заранее где какая функция нужна. Полностью тушки функций не копирую, всегда пишу заново или вставляю точечно код из других участков. Когда идёт копирование большого куска и переименование там пачки переменных - это наиболее частый случай свершения самых разношёрстных ошибок. Касается всех и опытных ребят в т.ч.. Ну, во-первых, потому что завёл его заранее. Вообще часто так делаю, завожу много чего заранее, с чем гарантированно придётся работать. Программа хапнула кусок(завела память) - с ним уже ничего не случится, это банальное и довольно логичное поведение в конкурентной среде, хапнул первым - кормишься, остальные ждут. Есть политика по потребности завёл - по истечению потребности отдал, мне она меньше импонирует, по той причине что проги всё равно не знают кто, когда и сколько хапнет(могут лишь проверить сколько есть сейчас), поэтому использую избирательно исходя из специфики того, как задача работает с памятью. Где-то по другому нельзя, а где-то наоборот нафиг надо усложнять и выцеплять блох (случай проги выше). А что счётчику будет? i, j, k - сто лет как универсальные именования счётчиков их используют не только в каком-то конкретном цикле, если надо - повторно, да хоть 10 раз. Если нужно говорящее название - заводят его, просто счётчики довольно часто используются не только в одном месте, чем меньше длина имени - тем проще читать код. Ну или опять станешь меня лечить про области видимости или "случайное" совпадение имён? Дядь, не надо, это же нифига не смешно. Кучу лет использую глобалки в разных ситуациях - и ни разу не было проблем. Области видимости на то и придумали чтобы ими рулить, а не как страус голову в песок и мол "это не наше", будем локализоваться, "инкапсулироваться". Модная штука, местами полезная, да, но не для старожила от 2\3GL. Добавлено через 6 минут Во всяком случае в рамки не поставит точно. Новые фичи и веяния - это всё уходящее приходящее, а нормально оформленный исходник кочует много и даёт пользу долго. Добавлено через 15 минут Лично я бы так и сделал. Если есть архитектуры, где байт не равен 8 битам, то кривой портаж это будет на совести того, кто этот код бездумно утянет. Это вопрос этики и статистики по типам данных в компиляторах. Не нужно пытаться объять необъятное и вешать на плечи кодера всё, что только возможно. Добавлено через 10 минут Кстати тут хоть один человек видел архитектуры, где байт это не 8 бит? И есть ли там упоминания FreeBASIC? Ну так чисто прояснить вопрос. А то на этот счёт терзают смутные сомнения.
0
|
||||||||
|
Кормпилятор
|
|
| 20.01.2023, 02:57 | |
|
Кстати тут хоть один человек видел архитектуры, где байт это не 8 бит? И есть ли там упоминания FreeBASIC?
Ну так чисто прояснить вопрос. А то на этот счёт терзают смутные сомнения.
0
|
|
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
|||||||||||
| 24.01.2023, 18:26 | |||||||||||
|
Гото переход
Гото переход
1
|
|||||||||||
|
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
|
||||||
| 27.01.2023, 18:38 | ||||||
|
Например как ассемблером очки игры запомнить?
0
|
||||||
|
Кормпилятор
|
|
| 27.01.2023, 21:00 | |
|
STAR WARS, тебе ещё рано про ассемблер лопотать. Азам бейсика научись для начала.
0
|
|
|
COM‐пропагандист
|
|
| 28.01.2023, 06:56 | |
|
В языке достаточно средств чтобы обойтись без всяких GOTO: циклы, функции, условия.
Поэтому такие GOTO в коде однозначно выдают горе‐писателя как не знающего базового синтаксиса языка.
0
|
|
|
|
||
| 28.01.2023, 11:35 | ||
|
if <выражение> then <метка> Операторы после then не допускались. Был всего один цикл for. И вот этого набора хватало на всё. Кстати, такой код поощряет комментарии, так как он не структурирован по принципу структурной парадигмы, которая, по словам её изобретателей, должна была обеспечить линейное (сквозное) понимание кода без комментариев. Состояния там неявны (не имеют имен), между тем, как в машине Тьюринга состояния всегда явны и составляют логическую часть этой машины. Практика опровергла эти виртовские идеи. Вам уже несколько раз указывалось, что goto часто просто нечем заменить. Иначе придется городить костыли, которые не имеют отношения к принципу решения той или иной задачи, но вы упорно гнете свое. Костыли в виде переменных-флагов, излишних процедур и пр.
0
|
||
|
COM‐пропагандист
|
||||
| 28.01.2023, 14:05 | ||||
|
Такие вещи как «Basic от Курта и Кемени» представляет только исторический интерес, и на практике не используются. Я правильно понимаю, что ваш идеальный язык — это где весь этот шлак удалён, и оставлен только Brainfuck с verbose синтаксисом?
0
|
||||
|
|
|||||
| 28.01.2023, 14:32 | |||||
|
1. язык есть вещь в себе, то есть отделен от особенностей ОС. 2. в нем нет ничего лишнего. Это есть дзен, когда чем проще тем лучше, но не более того, что приносит неудобства. Неудобства в плане изучения языка и его использования. Basic от Кемени, конечно не являлся профессиональным языком, но позиционировался в качестве языка для обучения студентов азам программирования. И это был идеальный язык для этого, так как был близок к ассемблеру по возможностям алгортмизации. С появлением структурной парадигмы мы пошли в сторону от алгоритма к способам, которые якобы должны обеспечить удобочитаемость программного кода сверху вниз. При этом тому, кто разбирает подобный код приходится удерживать в памяти все вложенные конструкции, следить за форматированием ибо если этого не делать становится трудно отслеживать завершения блоков. В языке Кемени когда встречался оператор goto или переход по условию, то в памяти нужно было удержать лишь одно слово - имя метки. На метку можно было повесить коммент - что означает вход в это состояние, если метка сама по себе смыслового имени не имеет. Отсутствие комментов и числовые метки и привело к тому, что такой код и стали считать макаронным. Для меня лично макаронный код это код из десятков вложенных if, циклов и пр, который к тому же растянут на сотни и тысячи строк кода - в стиле структурного программирования. Предположим у меня есть два или три вложенных блоков if. Эти блоки безымянные, как и следует из принципа структурного программирования. Входя во внутренний блок я должен не забывать внешний и где он кончается. Ведь дядюшка Вирт именно так и говорил, что, мол, надо читать программу сверху вниз. При входе в третий вложенный блок я должен помнить о двух предыдущих. Это большая нагрузка на память. Гораздо легче дать имя блоку кода и тогда надо помнить всего одно это имя. Одно имя - одно состояние программы. Когда мы поняли его, переходим к другому имени-метке обозначающему блок кода. Это снимает нагрузку с нашего мышления, так как оно привыкло думать словами, именами, а не визуальной структурой блоков.
1
|
|||||
|
COM‐пропагандист
|
||||||||||||
| 28.01.2023, 15:08 | ||||||||||||
0
|
||||||||||||
|
|
||
| 28.01.2023, 15:46 | ||
|
Говорящее имя функции не одно и то же, с тем каким способом она реализована. А комментарий призван объяснить способ реализации, используемый алгоритм, назначение некоторых переменных и пр. Ведь часто нужно понять как реализована функция, что-то изменить в ней и пр.
0
|
||
|
COM‐пропагандист
|
||||||||||||||||||||||
| 28.01.2023, 16:13 | ||||||||||||||||||||||
0
|
||||||||||||||||||||||
|
|
|
| 28.01.2023, 17:17 | |
|
Тяжелый случай..
1
|
|
|
Кормпилятор
|
||||||
| 28.01.2023, 20:40 | ||||||
|
при наличии адекватных комментов, расклад в голове такого кода лишь упрощается. И дело не только в структуризации, дело ещё и в предметной области и алгоритмах, с которыми человек, шерстящий в коде может быть слабо знаком. Причём даже с какой-либо конкретной сортировкой может быть не знаком, уже не говоря про гибридные вариации. Про кастомщину вообще молчу. И то последний генерирует код для DPMI. Там в нутрах такая дичь, что в это лезть даже не хочется, лучше под винду писать. но вот слегка подобосрались уже обсуждалось где, а прогресс ушёл ещё дальше в 4GL, где абстракционного тру макаронинга в сотни раз больше... Имеем что имеем, берём лучшее отовсюду соединяем и пользуем. Чем более популярная идеология - тем больше увальней там рукожопых. что технически делает эта функция, нам надо знать что она делает в контексте задачи. И FindString() - действительно придётся прошерстить(если контекст задачи не подразумевает, что вокруг этого кода уже всё изучено), чтобы понять что оно там внутри точно делает. Профи лично для себя, если код не надо никому показывать, может писать хоть в 1 линию, без пробелов в формулах и прототипах, без комментов и пояснений. Для людей же надо делать по-человечески. Комменты это не универсум, они должны упрощать работу с кодом. Пишутся по необходимости, а не вопреки. Понятно, что не объяснят всего что есть в функции(хотя можно и описание нафигарить если это важно), их задача сфокусировать внимание на главном, чтобы человек понимал что происходит в общих чертах без тупняка с разматыванием всего кода. Больше, наверное, архитектурные нюансы, чем технические. Вот прототип движка RTS, написано ровно 10 лет назад, на флагах(каскады триггерной логики), 300 тыс юнитов на карте, обсчёт корректный, там всё на флагах и таблицах, довольно быстро считает: Состояния в коде - это геморой. Есть случаи, когда твоя бошка просто откажется структурировать даже небольшие куски кода, нужно знать где применять и зачем. Просто ты крупных и логически серьёзных прог ещё не писал и не особо понимаешь где и какую методологию применить.
1
|
||||||
|
|
|||
| 29.01.2023, 11:50 | |||
|
0
|
|||
|
Кормпилятор
|
||||
| 29.01.2023, 15:14 | ||||
|
Ведь чтобы сопровождать больше логики нужно больше мозгов. Очевидно? Логично? - Да! Отсюда можно сделать два вывода, что флаги это не вселенское зло, тем паче в качестве параметров и второй - кода должно быть меньше на единицу логики, это означает что всяческие горе писатели непосредственно за компами должны пересесть за письменные столы и работать над формализацией, чтобы "говнологика" превратилась в просто логику. Структурный код с флагами переписать несложно, а макаронницу из полусотни состояний - что-то близкое к невозможному, знаем, на своей шкуре сталкивались. Так что про миллион это "сильное заявление". И да флаги и сливы формул в переменные - это бóльшая структуризация, нежели просто условия, это идеальный вид, так сейчас не пишут и этому противятся. При этом люди говорят, что компиляторы прекрасные и творят чудеса, есть в этом здравая доля сомнения, коли у тех, кто говорит, есть равная доля сомнения в том, что такую простую вещь компилятор не сможет оптимизировать. Добавлено через 24 минуты и функций, а RETURN - это уже следствие современной "гибридизации" диалектов, имхо лишний. Да и вообще, в текущем FB виде - это оператор си. С другой стороны присваивание функции значения в бейсике должно делать автовозврат из функции, к сожалению этого не сделали. Поэтому претензии Замабувараева касаемо исполнения двух операций, вместо одной, в Quick Basic - обоснованны. Это не косяк идеологии и синтаксиса, это косяк разрабов, нужно это понимать. Конечно, можно ещё порешать, что после вычисления значения функции, она ещё может пошевелиться и что-то там сделать техническое - но это уже такое себе. Особо хитрожопые даже начнут такой хернёй страдать, но это конечно не кодинг.
0
|
||||
|
|
|||||
| 29.01.2023, 17:01 | |||||
|
По поводу модульности - есть много мнений на этот счет, иногда крайне противоположенных. В паскалеподобных языках модуль (unit) это некий набор процедур вместе с типами данных, которые обслуживают эти процедуры. В Си это отдельный файл с кодом. Но все это - искусственное деление.. Это скорее классификация по родству.. Между тем, в моем представлении, модуль это независимая сущность. Если код состоит из модулей, то выдернуть один модуль не означает того, что отвалятся все остальные, которые пользуют его интерфейс. А если будут отваливаться, то это не модуль, а просто классификация по родству.. Вот в чем дело! Но где это есть?. Модуль должен отвечать за конкретный функционал программы. Если его изьять, то отвалиться только отдельный функционал, но прога будет продолжать работать. А отдельная процедура есть модуль? Нет. Потому что это винтик в машине модуля. Это примитив часто доступный всем модулям. Не поймите меня не правильно: я не имею в виду флаги, которые обозначают состояния конкретных объектов программы. Но даже в этом случае состояние конкретного объекта должно быть присваиваемо одной единственной переменной, которая может быть частью структуры описывающей конкретный объект. например объект в виде игрового робота. Ведь в каждый момент времени этот робот может находиться лишь в одном единственном состоянии. А этих состояний может быть десятки и сотни. Эти состояния есть константы, а не флаги. Нам не надо сотни флагов, и проверки каждого из них в цикле или через case. В каждом состоянии (блоке кода) мы просто изменяем состояние объекта в зависимости от того, в каком состоянии этот объект находится в данный момент. Вместо флагов у нас блоки кода, при этом исключаются проверки на принадлежность состоянию. Это совсем другое мышление и парадигма. Это проще сопровождать. Писать по другому просто нельзя..
0
|
|||||
| 29.01.2023, 17:01 | |
|
Оператор goto
оператор GoTo Безусловный оператор GoTo Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|