Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/67: Рейтинг темы: голосов - 67, средняя оценка - 4.90
Платежеспособный зверь
 Аватар для кот Бегемот
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2011, 16:38
Ответы с готовыми решениями:

Оператор GOTO и его метки
Здесь я хотел раз и навсегда разобраться с метками оператора GOTO. 1) Если метка является идентификатором, то есть начинается с...

Goto - за и против
С удивлением обнаружил на форуме аж двух сторонников оператора goto. Посему объявляю опрос.

Оператор goto
Здравствуйте. Я в лабораторной работе проверяю введенные данные на различные ошибки. Я это все сделал, каждую ошибку мне выдает. То...

146
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.01.2023, 11:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Чтобы быстро найти нужную переменную в начале программы\подпрограммы или соотв. быстро понять
задекларирована она или нет.
Объявление переменных подчиняется законам необходимости и достаточности.
Когда нам нужно сохранить результат чего‐то — это необходимость для объявления переменной.
Когда эта переменная используется только внутри блока — нам достаточно объявить её внутри блока.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
19.01.2023, 20:21
Цитата Сообщение от Замабувараев Посмотреть сообщение
Объявление переменных подчиняется законам необходимости и достаточности.
Так то оно так, но это палка о двух концах, если программирование подчинить сугубо законам необходимости
и достаточности - то достаточно будет машинных кодов и никто не докажет, что этого недостаточно.
Представь себе баттхёрт мирового сообщества на эту тему.

Говорил про довольно важную вещь - что порядок на рабочем столе и в голове важен, это делает рабочий
процесс более продуктивным и эффективным и не обязательно более приятным. То как лично тебе
приятнее видеть код - мне до этого дела нет, я к профям не лезу, самоорганизация - это их личное дело,
можно писать и так и эдак, как угодно, главное чтоб работало(это и есть результат труда, чтобы можно
было пользоваться, чтобы труд не пропал).
По оформлению говорю про то, как это было ~35 лет тому назад и привожу доводы, что ничего сильно не поменялось.
Визуальное восприятие у людей работает всё так же, никаких ноу-хау тут не было и нет. Долгое время
этот стиль прослеживался в хорошо оформленных исходниках крупных компаний, таких как Microsoft и ID.
А потом "массы поплыли", это стихийно и тут ничего не сделать.

И все мои советы касаются прежде всего QB кодеров, впоследствии перешедших на современные BASIC
диалекты, советы универсальные, помогают писать код в превосходно читаемом, простом человекоязычном
QB стиле, разрабатывать легко портируемый код, который годится на портаж даже на НУ при необходимости.
Помогают не дёргаться туда сюда и не страдать хернёй за компом.

Негласный "стандарт" оформления кода QB пока из BASIC'о подобных диалектов популяризировался сильнее
всего, его и освещаю во всех деталях и подробностях, как правильно, как по фен шую. А т.к. FB создавался
как клон QB и поддерживает тот же самый синтаксис и стиль кода, то эти знания можно применить и на нём.
Это не единственный допустимый вариант и не настаиваю, но это надёжный и концептуально строго
организованный вариант, при котором код, переводя, можно получить на нескольких диалектах относительно
без проблем.

Добавлено через 37 минут
Т.е. ожидаю оформления кода типа такого, если конечно правильно понял, что этот код делает.
Ну ещё пожелание делать такие штуки сразу с примерами.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'$LANG: "FB"
#INCLUDE "Windows.bi"
 
 
CONST UBYTESZ = SizeOf(UBYTE)
 
'
'   /  FindStringA  / -  поиск подстроки в строке
'
'  pBufer   -   указатель на подстроку (на сам буфер ZSTRING)
'  BufferLength  - длина буфера
'  pStr      -   указатель на строку (на буфер ZSTRING)
'  Length  -  длина подстроки
'
FUNCTION FindStringA( BYVAL pBufer AS UBYTE PTR, BYVAL BufferLength AS INTEGER, BYVAL pStr AS UBYTE PTR, BYVAL Length AS INTEGER) AS UBYTE PTR
 
  DIM i AS INTEGER               '  Счётчик цикла(позиция символа от нуля)
  DIM Finded AS LONG             '  Флаг нахождения совпадения
  DIM pDestination AS UBYTE PTR  '  Указатель назначения
  DIM BytesCount AS  INTEGER     '  Указатель
 
  BytesCount = Length * UBYTESZ  ' Длина буфера
    
    '  Сопоставляем и сравниваем подстроку в каждой позиции строки
    FOR i = 0 To BufferLength - Length
       pDestination = VARPTR(pBufer[i])  '  Адрес первого символа подстроки в строке, для сравнения
       Finded = memcmp(pDestination, pStr, BytesCount)
 
       IF Finded = 0 THEN                '  Если нашли
         FindStringA = pDestination      '  Вернём указатель
         EXIT FUNCTION                   '  Выход из функции
       END IF
    NEXT
    
  FindStringA = NULL             '  Если не нашли
 
END FUNCTION
 
 
DIM MyStr AS ZSTRING * 8 = "Testing"
DIM Podst AS ZSTRING * 3 = "ti"
DIM Res AS ZSTRING PTR
 
PRINT CHR(10); " Original  : "; MyStr
PRINT " Desired   : "; Podst
PRINT " Found pos : ";
Res = FindStringA (SADD(MyStr), 7, SADD(Podst), 2)
IF Res THEN PRINT *(Res)
SLEEP
Добавлено через 6 минут
Для QB\QBasic описание заталкивается внутрь функции, для других - можно оставлять снаружи.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
19.01.2023, 22:09
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Т.е. ожидаю оформления кода типа такого, если конечно правильно понял, что этот код делает.
Всё верно, функция ищет подстроку в строке.
Теперь по коду.

PureBasic
1
FUNCTION FindStringA( BYVAL pBufer AS UBYTE PTR, BYVAL BufferLength AS INTEGER, BYVAL pStr AS UBYTE PTR, BYVAL Length AS INTEGER) AS UBYTE PTR
Название функции выходит не просто за 80 символов, но и вообще за границу окна. Горизонтальная прокрутка — это зло.
Можно включить перенос, но это всё равно не спасёт, потому что легко запутаться где конец и где новая строка.

С другой стороны, у записи «в столбик» есть преимущество: можно объяснять параметр сразу, вместо дублирования в заголовке:
PureBasic
1
2
3
4
5
6
Function FindStringA( _                  /' поиск подстроки в строке '/
        ByVal pBufer As UByte Ptr, _     /' указатель на подстроку (на сам буфер ZSTRING) '/
        ByVal BufferLength As Integer, _ /' длина буфера '/
        ByVal pStr As UByte Ptr, _       /' указатель на строку (на буфер ZSTRING) '/
        ByVal Length As Integer _        /' длина подстроки '/
    )As UByte Ptr
(Вы же сами так делаете: разбиваете абзац на строки, в которых максимум 110 символов.)

PureBasic
1
2
FindStringA = pDestination
FindStringA = NULL
Лучше сразу делать «Return результат». Во‐первых, нет смысла расщеплять операцию возврата значения на два действия. Во‐вторых, завтра у вас функция сменит название, следовательно, потребует переименования всех мест внутри функции где оно встречается.

PureBasic
1
CONST UBYTESZ = SizeOf(UBYTE)
Зачем её выносить за пределы функции, она нужна только внутри.

Почему не создаём переменные вместе с инициализирующим значением?
Почему счётчик цикла существует за пределами цикла?
Миниатюры
Оператор GOTO: за и против  
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
20.01.2023, 02:57
Цитата Сообщение от Замабувараев Посмотреть сообщение
Горизонтальная прокрутка — это зло
В контексте прототипов - ни от одного человека, кроме вас, пока не слышал этого.

Цитата Сообщение от Замабувараев Посмотреть сообщение
(Вы же сами так делаете: разбиваете абзац на строки, в которых максимум 110 символов.)
Форум это другое. Мне просто не нравится как текст вытягивается слево направо. Текста гораздо больше,
чем параметров в прототипе. Да и как показал оформить мне не сложно, для себя же делается.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Можно включить перенос
Не нужно включать перенос, он укокошит всё так, что мало не покажется. Просто сделать по-человечески 1 раз,
без этих говноскобок закорючек и подчёркиваний, потратить две минуты, оформить код как белый человек.
В рабочем коде(с которым идёт работа) в любом случае крайне желательно какое-то внятное описание функции
и параметров. А из вида, в котором оформил параметры, легко копировать через двойной щелчок.
Про копирование переменных вместо набивки их руками уже много было сказано, много людей
на этом подвернули карачку. Это всё удобно и читабельно без закорючек, фентиклюшек и лишней
информации в виде BYVAL-ов и типов(эту тех инфу можно посмотреть в прототипе), просто оставим
прототип в покое, пусть он живёт своей жизнью, а комментарии своей. Не понимаю зачем туда лезть
и нашпиговывать это месево? Именно поэтому в QB нету подчёркивания и по итогу гораздо чище всё выглядит.

Цитата Сообщение от Замабувараев Посмотреть сообщение
вместо дублирования
На себе не экономлю, дискового места в достатке(уж для текстового файла то), и никому не рекомендую.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Во‐вторых, завтра у вас функция сменит название,
Ну уж нет, у меня уже проименованные функции ни с хрену не меняют названия.))) Потому что функционал
высекается сначала на бумаге, никак не за компом и всё выверяется заранее где какая функция нужна.
Полностью тушки функций не копирую, всегда пишу заново или вставляю точечно код из других участков.
Когда идёт копирование большого куска и переименование там пачки переменных - это наиболее частый
случай свершения самых разношёрстных ошибок. Касается всех и опытных ребят в т.ч..

Цитата Сообщение от Замабувараев Посмотреть сообщение
Почему счётчик цикла существует за пределами цикла?
Немного странная претензия.
Ну, во-первых, потому что завёл его заранее. Вообще часто так делаю, завожу много чего заранее, с чем
гарантированно придётся работать. Программа хапнула кусок(завела память) - с ним уже ничего не случится,
это банальное и довольно логичное поведение в конкурентной среде, хапнул первым - кормишься, остальные ждут.
Есть политика по потребности завёл - по истечению потребности отдал, мне она меньше импонирует, по той причине
что проги всё равно не знают кто, когда и сколько хапнет(могут лишь проверить сколько есть сейчас),
поэтому использую избирательно исходя из специфики того, как задача работает с памятью. Где-то по другому
нельзя, а где-то наоборот нафиг надо усложнять и выцеплять блох (случай проги выше).
А что счётчику будет? i, j, k - сто лет как универсальные именования счётчиков их используют не только в каком-то
конкретном цикле, если надо - повторно, да хоть 10 раз. Если нужно говорящее название - заводят его,
просто счётчики довольно часто используются не только в одном месте, чем меньше длина имени - тем
проще читать код.
Ну или опять станешь меня лечить про области видимости или "случайное" совпадение имён? Дядь, не надо, это
же нифига не смешно. Кучу лет использую глобалки в разных ситуациях - и ни разу не было проблем.
Области видимости на то и придумали чтобы ими рулить, а не как страус голову в песок и мол "это не наше",
будем локализоваться, "инкапсулироваться". Модная штука, местами полезная, да, но не для старожила от 2\3GL.

Добавлено через 6 минут
Во всяком случае в рамки не поставит точно. Новые фичи и веяния - это всё уходящее приходящее, а нормально
оформленный исходник кочует много и даёт пользу долго.

Добавлено через 15 минут
Цитата Сообщение от Замабувараев Посмотреть сообщение
она нужна только внутри
Боюсь она там вообще не нужна, байт он и в африке байт. Можно было убрать это лишнее умножение.
Лично я бы так и сделал. Если есть архитектуры, где байт не равен 8 битам, то кривой портаж это
будет на совести того, кто этот код бездумно утянет. Это вопрос этики и статистики по типам данных
в компиляторах. Не нужно пытаться объять необъятное и вешать на плечи кодера всё, что только возможно.

Добавлено через 10 минут
Кстати тут хоть один человек видел архитектуры, где байт это не 8 бит? И есть ли там упоминания FreeBASIC?
Ну так чисто прояснить вопрос. А то на этот счёт терзают смутные сомнения.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
20.01.2023, 02:57
Кстати тут хоть один человек видел архитектуры, где байт это не 8 бит? И есть ли там упоминания FreeBASIC?
Ну так чисто прояснить вопрос. А то на этот счёт терзают смутные сомнения.
0
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
24.01.2023, 18:26
Гото переход
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
DEF SEG = 10
B = PEEK(1)
PRINT "1" ; B
PRINT "2" ; B
GOTO BBOD
PRINT "OOOOO"
BBOD:
PRINT "3" ; B
Добавлено через 7 минут
Гото переход
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
SCREEN 13
PRINT "GOTO1"
SLEEP 5
GOTO BBOD
PRINT "OOOOO"
BBOD:
PRINT "GOTO2 = GOTO1"
PRINT "SCREEN 13"
1
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
27.01.2023, 18:38
Например как ассемблером очки игры запомнить?
QBasic/QuickBASIC
1
2
3
4
5
START:
SCREEN 13
PRINT "OOOOO"
SLEEP 5
GOTO START
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
27.01.2023, 21:00
STAR WARS, тебе ещё рано про ассемблер лопотать. Азам бейсика научись для начала.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.01.2023, 06:56
В языке достаточно средств чтобы обойтись без всяких GOTO: циклы, функции, условия.
Поэтому такие GOTO в коде однозначно выдают горе‐писателя как не знающего базового синтаксиса языка.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.01.2023, 11:35
Цитата Сообщение от Замабувараев Посмотреть сообщение
Поэтому такие GOTO в коде однозначно выдают горе‐писателя как не знающего базового синтаксиса языка.
Какого "языка"? Говорите, да не заговаривайтесь. Или для вас бейсик всего один на свете? Basic от Курта и Кемени имел только одну форму оператора IF:
if <выражение> then <метка>
Операторы после then не допускались.
Был всего один цикл for. И вот этого набора хватало на всё.
Кстати, такой код поощряет комментарии, так как он не структурирован по принципу структурной парадигмы, которая, по словам её изобретателей, должна была обеспечить линейное (сквозное) понимание кода без комментариев. Состояния там неявны (не имеют имен), между тем, как в машине Тьюринга состояния всегда явны и составляют логическую часть этой машины. Практика опровергла эти виртовские идеи.
Вам уже несколько раз указывалось, что goto часто просто нечем заменить. Иначе придется городить костыли, которые не имеют отношения к принципу решения той или иной задачи, но вы упорно гнете свое. Костыли в виде переменных-флагов, излишних процедур и пр.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.01.2023, 14:05
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Какого "языка"?
Как минимум QBASIC.
Такие вещи как «Basic от Курта и Кемени» представляет только исторический интерес, и на практике не используются.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Кстати, такой код поощряет комментарии
Понятный код в комментариях не нуждается.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Вам уже несколько раз указывалось, что goto часто просто нечем заменить
То есть функции, циклы, операторы Exit, Continue, Return — это костыли?
Я правильно понимаю, что ваш идеальный язык — это где весь этот шлак удалён, и оставлен только Brainfuck с verbose синтаксисом?
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.01.2023, 14:32
Цитата Сообщение от Замабувараев Посмотреть сообщение
Такие вещи как «Basic от Курта и Кемени» представляет только исторический интерес, и на практике не используются.
Потому что такие как вы их перековеркали на свой лад. И теперь они стали похожи друг на друга как клоны.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Понятный код в комментариях не нуждается.
"Понятный" это понятие растяжимое. Код может быть понятен его автору, но не понятен стороннему человеку. Потому что если отсутствуют комменты, то вообще не понятно для чего этот код предназначен, и он становится на вроде ребуса-головоломки. Такой код проще выбросить на помойку, что кстати и делают с кодом, в котором вообще отсутствуют комменты. Это признак непрофессионала.
Цитата Сообщение от Замабувараев Посмотреть сообщение
То есть функции, циклы, операторы Exit, Continue, Return — это костыли?
Это излишние сущности, которые усложняют язык. Exit и Return это нужно, потому что не относится к определенной парадигме структуризации. А вот Continu, break и т.п - относятся, так как вместо одного слова goto произвели его замену на 2, 3 и более слов.
Цитата Сообщение от Замабувараев Посмотреть сообщение
Я правильно понимаю, что ваш идеальный язык — это где весь этот шлак удалён, и оставлен только Brainfuck с verbose синтаксисом?
verbose это когда плодят сущности, которых можно было бы и не плодить, обойтись без них. Это как раз у вас. Идеальный язык, это когда:
1. язык есть вещь в себе, то есть отделен от особенностей ОС.
2. в нем нет ничего лишнего. Это есть дзен, когда чем проще тем лучше, но не более того, что приносит неудобства. Неудобства в плане изучения языка и его использования.
Basic от Кемени, конечно не являлся профессиональным языком, но позиционировался в качестве языка для обучения студентов азам программирования. И это был идеальный язык для этого, так как был близок к ассемблеру по возможностям алгортмизации. С появлением структурной парадигмы мы пошли в сторону от алгоритма к способам, которые якобы должны обеспечить удобочитаемость программного кода сверху вниз. При этом тому, кто разбирает подобный код приходится удерживать в памяти все вложенные конструкции, следить за форматированием ибо если этого не делать становится трудно отслеживать завершения блоков.
В языке Кемени когда встречался оператор goto или переход по условию, то в памяти нужно было удержать лишь одно слово - имя метки. На метку можно было повесить коммент - что означает вход в это состояние, если метка сама по себе смыслового имени не имеет. Отсутствие комментов и числовые метки и привело к тому, что такой код и стали считать макаронным.
Для меня лично макаронный код это код из десятков вложенных if, циклов и пр, который к тому же растянут на сотни и тысячи строк кода - в стиле структурного программирования.
Предположим у меня есть два или три вложенных блоков if. Эти блоки безымянные, как и следует из принципа структурного программирования. Входя во внутренний блок я должен не забывать внешний и где он кончается. Ведь дядюшка Вирт именно так и говорил, что, мол, надо читать программу сверху вниз. При входе в третий вложенный блок я должен помнить о двух предыдущих. Это большая нагрузка на память. Гораздо легче дать имя блоку кода и тогда надо помнить всего одно это имя. Одно имя - одно состояние программы. Когда мы поняли его, переходим к другому имени-метке обозначающему блок кода. Это снимает нагрузку с нашего мышления, так как оно привыкло думать словами, именами, а не визуальной структурой блоков.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.01.2023, 15:08
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Потому что если отсутствуют комменты, то вообще не понятно для чего этот код предназначен, и он становится на вроде ребуса-головоломки
PureBasic
1
2
3
4
DrawRectangle() — совершенно непонятно что делает этот код
SetUserName() — что это такое вообще?
FindString() — ребус‐головоломка
CreateSocket() — такой код проще выбросить на помойку!
С другой стороны:
PureBasic
1
2
3
4
DrawRectangle() ' рисуем прямоугольник
SetUserName() ' устанавливаем имя пользователя
FindString() ' ищем подстроку в строке
CreateSocket() ' создаём сокет
Теперь‐то стало гораздо понятнее!
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.01.2023, 15:46
Цитата Сообщение от Замабувараев Посмотреть сообщение
Теперь‐то стало гораздо понятнее!
Вы, все-таки, чего-то до сих пор не поняли..
Говорящее имя функции не одно и то же, с тем каким способом она реализована. А комментарий призван объяснить способ реализации, используемый алгоритм, назначение некоторых переменных и пр. Ведь часто нужно понять как реализована функция, что-то изменить в ней и пр.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
28.01.2023, 16:13
Цитата Сообщение от CoderHuligan Посмотреть сообщение
А комментарий призван объяснить способ реализации, используемый алгоритм
Действительно:
PureBasic
1
2
BubbleSort() — какой алгоритм использует эта функция? Решительно непонятно!
LinearGradientBrush() — способ реализации не указан, фтопку
Так‐то лучше:
PureBasic
1
2
Sort() ' Функция сортировки пузырьком
Br() ' кисть с линейным градиентом
Как и переменные:
PureBasic
1
2
3
Dim Distance As Integer — что за левая переменная?
Dim Width As Long — а это что такое? зачем она нужна в коде?
Dim DateOfBirth As Integer — не описано назначение = образцовый пример плохого кода
Так‐то лучше:
PureBasic
1
Dim a, b, c ' расстояние, ширина, дата рождения
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.01.2023, 17:17
Тяжелый случай..
1
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
28.01.2023, 20:40
Цитата Сообщение от Замабувараев Посмотреть сообщение
Понятный код в комментариях не нуждается.
Это неверное утверждение. Объясняю, какой бы понятный код не был, но в любом случае
при наличии адекватных комментов, расклад в голове такого кода лишь упрощается.
И дело не только в структуризации, дело ещё и в предметной области и алгоритмах, с которыми
человек, шерстящий в коде может быть слабо знаком. Причём даже с какой-либо конкретной
сортировкой может быть не знаком, уже не говоря про гибридные вариации. Про кастомщину
вообще молчу.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Как минимум QBASIC.
Такие вещи как «Basic от Курта и Кемени» представляет только исторический интерес, и на практике не используются.
QBasic тоже не применяется. Под DOS применялся Quick BASIC, Turbo BASIC, Free BASIC.
И то последний генерирует код для DPMI. Там в нутрах такая дичь, что в это лезть даже не хочется,
лучше под винду писать.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Практика опровергла эти виртовские идеи.
Практика опровергла макаронинг. Виртовские же идеи на деле не Виртовские и так они вроде бы ничего,
но вот слегка подобосрались уже обсуждалось где, а прогресс ушёл ещё дальше в 4GL,
где абстракционного тру макаронинга в сотни раз больше... Имеем что имеем, берём лучшее отовсюду
соединяем и пользуем. Чем более популярная идеология - тем больше увальней там рукожопых.

Цитата Сообщение от Замабувараев Посмотреть сообщение
SetUserName() — что это такое вообще?
Применительно к задаче - да хрен знает что это и коммент написан неверно, нам не надо знать
что технически делает эта функция, нам надо знать что она делает в контексте задачи.
И FindString() - действительно придётся прошерстить(если контекст задачи не подразумевает,
что вокруг этого кода уже всё изучено), чтобы понять что оно там внутри точно делает.

Профи лично для себя, если код не надо никому показывать, может писать хоть в 1 линию,
без пробелов в формулах и прототипах, без комментов и пояснений. Для людей же надо делать по-человечески.


Комменты это не универсум, они должны упрощать работу с кодом. Пишутся по необходимости, а не вопреки.
Понятно, что не объяснят всего что есть в функции(хотя можно и описание нафигарить если это важно),
их задача сфокусировать внимание на главном, чтобы человек понимал что происходит в общих чертах
без тупняка с разматыванием всего кода. Больше, наверное, архитектурные нюансы, чем технические.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Костыли в виде переменных-флагов, излишних процедур и пр.
Флаги это костыли в умах людей, кто в них не умеет, ими нужно уметь пользоваться, как и любой методологией.
Вот прототип движка RTS, написано ровно 10 лет назад, на флагах(каскады триггерной логики), 300 тыс юнитов
на карте, обсчёт корректный, там всё на флагах и таблицах, довольно быстро считает:

Состояния в коде - это геморой. Есть случаи, когда твоя бошка просто откажется структурировать
даже небольшие куски кода, нужно знать где применять и зачем.
Просто ты крупных и логически серьёзных прог ещё не писал и не особо понимаешь где и какую методологию
применить.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2023, 11:50
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Практика опровергла макаронинг.
Макароны могут быть везде, в любой парадигме, если делать все через одно место.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Флаги это костыли в умах людей, кто в них не умеет
Флаги это параметризация кода. И чем их больше, тем труднее их все сопровождать. Я имел в виду использование флагов в качестве параметров, благодаря которым мы решаем какой блок кода будет выполнен. Это просто замена явных переходов. вместо флагов можно просто прыгать в соответствующие блоки, при этом миллион флагов сразу куда-то испаряется.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
29.01.2023, 15:14
Цитата Сообщение от CoderHuligan Посмотреть сообщение
И чем их больше, тем труднее их все сопровождать
Эти же слова равносильны следующему: чем больше кода - тем труднее его сопровождать.
Ведь чтобы сопровождать больше логики нужно больше мозгов. Очевидно? Логично? - Да!
Отсюда можно сделать два вывода, что флаги это не вселенское зло, тем паче в качестве параметров
и второй - кода должно быть меньше на единицу логики, это означает что всяческие горе писатели
непосредственно за компами должны пересесть за письменные столы и работать над формализацией,
чтобы "говнологика" превратилась в просто логику.

Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это просто замена явных переходов. вместо флагов можно просто прыгать в соответствующие блоки, при этом миллион флагов сразу куда-то испаряется.
Для миллиона - есть кейсы, для не миллиона - простые условия. "разруха не в клозетах, а в головах!"
Структурный код с флагами переписать несложно, а макаронницу из полусотни состояний - что-то близкое
к невозможному, знаем, на своей шкуре сталкивались. Так что про миллион это "сильное заявление".
И да флаги и сливы формул в переменные - это бóльшая структуризация, нежели просто условия,
это идеальный вид, так сейчас не пишут и этому противятся. При этом люди говорят, что компиляторы
прекрасные и творят чудеса, есть в этом здравая доля сомнения, коли у тех, кто говорит, есть равная
доля сомнения в том, что такую простую вещь компилятор не сможет оптимизировать.

Добавлено через 24 минуты
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это излишние сущности, которые усложняют язык.
EXIT - нет, его ввели как раз для структуризации, когда появилась модульность в виде процедур
и функций, а RETURN - это уже следствие современной "гибридизации" диалектов, имхо лишний.
Да и вообще, в текущем FB виде - это оператор си.
С другой стороны присваивание функции значения в бейсике должно делать автовозврат из функции,
к сожалению этого не сделали. Поэтому претензии Замабувараева касаемо исполнения двух
операций, вместо одной, в Quick Basic - обоснованны. Это не косяк идеологии и синтаксиса,
это косяк разрабов, нужно это понимать. Конечно, можно ещё порешать, что после вычисления
значения функции, она ещё может пошевелиться и что-то там сделать техническое - но это уже
такое себе. Особо хитрожопые даже начнут такой хернёй страдать, но это конечно не кодинг.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
29.01.2023, 17:01
Цитата Сообщение от Quiet Snow Посмотреть сообщение
EXIT - нет, его ввели как раз для структуризации, когда появилась модульность в виде процедур
и функций
В Си exit принудительно прекращает программу в целом, при этом не нужно делать никаких освобождений памяти и пр. Как там в других языках - не знаю.
По поводу модульности - есть много мнений на этот счет, иногда крайне противоположенных. В паскалеподобных языках модуль (unit) это некий набор процедур вместе с типами данных, которые обслуживают эти процедуры. В Си это отдельный файл с кодом. Но все это - искусственное деление.. Это скорее классификация по родству.. Между тем, в моем представлении, модуль это независимая сущность. Если код состоит из модулей, то выдернуть один модуль не означает того, что отвалятся все остальные, которые пользуют его интерфейс. А если будут отваливаться, то это не модуль, а просто классификация по родству.. Вот в чем дело! Но где это есть?. Модуль должен отвечать за конкретный функционал программы. Если его изьять, то отвалиться только отдельный функционал, но прога будет продолжать работать.
А отдельная процедура есть модуль? Нет. Потому что это винтик в машине модуля. Это примитив часто доступный всем модулям.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Это не косяк идеологии и синтаксиса,
это косяк разрабов, нужно это понимать.
Это наследие старых реализаций, которые просто тупо повторили.
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Так что про миллион это "сильное заявление".
И да флаги и сливы формул в переменные - это бóльшая структуризация
Флаги это - проверки, всегда проверки этих флагов. На проверки переменных уходит время. Дейкстра в конце концов также пришел к этому выводу: программа должна иметь всего один единственный флаг, которому присваивается имя конкретного состояния. Только тогда программа может быть легко верифицируема, т.е. её правильность легко доказать, так как в каждый момент времени эта единственная переменная несет имя конкретного состояния, в котором может находиться программа.
Не поймите меня не правильно: я не имею в виду флаги, которые обозначают состояния конкретных объектов программы. Но даже в этом случае состояние конкретного объекта должно быть присваиваемо одной единственной переменной, которая может быть частью структуры описывающей конкретный объект. например объект в виде игрового робота. Ведь в каждый момент времени этот робот может находиться лишь в одном единственном состоянии. А этих состояний может быть десятки и сотни. Эти состояния есть константы, а не флаги. Нам не надо сотни флагов, и проверки каждого из них в цикле или через case. В каждом состоянии (блоке кода) мы просто изменяем состояние объекта в зависимости от того, в каком состоянии этот объект находится в данный момент. Вместо флагов у нас блоки кода, при этом исключаются проверки на принадлежность состоянию.
Это совсем другое мышление и парадигма. Это проще сопровождать. Писать по другому просто нельзя..
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ведь чтобы сопровождать больше логики нужно больше мозгов. Очевидно? Логично? - Да!
Ну да. Только логика должна быть сосредоточена в одном месте, а не размазана по всему коду..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2023, 17:01

Оператор GOTO
Дано 50 вещественных чисел. Определить наибольшую величину из них. С помощью оператора GOTO

Оператор goto
Как передать управление из одного класса в другой c помощью goto(или как то по другому)?

Оператор GOTO
GOTO в топку. В нормальных языках нужны только циклы, а GOTO пусть останется только для *.bat, и *.cmd файлов.

оператор GoTo
Ввести с клавиатуры произвольное целое число X в диапазоне от 80 до 500. Если введенное число X не соответствует указанному диапазону, с...

Безусловный оператор GoTo
Доказать (путем перебора возможных значений), что для любых величин А,В,С типа Boolean следующие пары логических выражений имеют одинаковые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера 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С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru