Форум программистов, компьютерный форум, киберфорум
Наши страницы
CoderHuligan
Войти
Регистрация
Восстановить пароль
Рейтинг: 2.33. Голосов: 6.

Бритва Оккама

Запись от CoderHuligan размещена 26.06.2019 в 15:09
Обновил(-а) CoderHuligan 26.06.2019 в 15:12

Бритва оккама - известный методологический принцип в философии, который гласит примерно следующее: "Не следует привлекать новые сущности без крайней на то необходимости.". Оккам писал:
Цитата:
…множественность никогда не следует полагать без необходимости… [но] всё, что может быть объяснено из различия материй по ряду оснований, — это же может быть объяснено одинаково хорошо или даже лучше с помощью одного основания.
Из вики:
"Принцип «бритвы Оккама» состоит в следующем: если некое явление может быть объяснено двумя способами: например, первым — через привлечение сущностей (терминов, факторов, фактов и проч.) А, В и С, либо вторым — через сущности А, В, С и D, — и при этом оба способа дают одинаковый результат, то следует предпочесть первое объяснение. Сущность D в этом примере лишняя, и её привлечение избыточно. "
Применительно к нашей теме программирования данный принцип часто нарушается. Игнорирование же его приводит к переусложнению языков и компиляторов, сложности образовательного процесса и т.п.
Индустрия должна зарабатывать деньги и её не интересуют какие-то принципы и философия.. К сожалению. Индустрия создаёт свои собственные инструменты. Индустрия создаёт своих собственных специалистов, которые её будут обслуживать.. Тут уже философией и не пахнет. Если чувствуется аромат денег, то всё остальное отступает на второй план. Во главу угла ставится конкуренция, конкуренция во всём: в отсеве специалистов, в стилях программирования, соглашениях и пр.
Так как я пропагандирую "народное программирование", то с обычным нам не по пути. Я обьясню.
Не говоря уже о том, что структурная парадигма (СП) крайне усложнила воплощение в код достаточно сложных алгоритмов, она ещё к тому же не следует принципу Оккама.
Если какую-либо сущность можно обьяснить более простыми средствами, то не нужно привлекать дополнительные.
Если полную условную конструкцию можно выразить через :
C
1
2
3
4
5
if (/*логич_выражение*/) goto L1;
/*выражение/я;*/ goto L2;
L1:
//выражение/я;
L2:
то не следует эмулировать её при помощи дополнительных сущностей:
C
1
2
3
4
5
6
7
8
if (/*логич_выражение*/) 
{
   // выражение/я;
}
else 
{
    //выражение/я;
}
первое к тому же более понятно.
Для эмулирования циклов создали аж до трёх разных их разновидностей. Цикл for, while, do while. Пришлось к тому же вводить новые сущности: continue, break. В разных языках по разному. А ведь циклы реализуются на goto гораздо проще, чем даже полная условная конструкция. Причём, заметьте, что завершение тела цикла гораздо понятнее именно применяя goto:
C
1
2
3
4
Loop1:
if (/*логич_выражение*/) goto L2;
/* выражение/я;*/ goto Loop1;
L2:
Встретив goto Loop1 мы сразу понимаем где искать его "голову", особенно если эта голова где-то на другой странице листинга.
А в такой конструкции "правильного" цикла мы встречаем не метку, а безликую скобку:
C
1
2
3
4
while (/*условие*/) 
{
    // тело цикла
}
поэтому здесь не понятно где начинается цикл. Отступы помогают не всегда. Да и эти пресловутые отступы не являясь частью языка в принципе, на практике ими являются, что уже как-то настораживает, ибо без них ну, очень трудно разобраться в нагромождениях структурных конструкций(прямо скажем: чисто искусственных).
Попытка приблизить язык, который понимает компьютер, к языку, на котором разговаривают люди обречена на провал потому, что чем ближе к естественному для человека языку мы приближаемся, тем все менее возможной становится способность выражать на нём алгоритмические построения.. Мы приближаемся к тупику, и только совсем мало думающий человек не видит этого.. Принцип "каждая кухарка может управлять государством" на практике не подтверждается..
Размещено в Без категории
Просмотров 3176 Комментарии 268
Всего комментариев 268
Комментарии
  1. Старый комментарий
    Аватар для liv
    Цитата:
    первое к тому же более понятно.
    сомнительное и абсолютное субъективное мнение.
    Цитата:
    А в такой конструкции "правильного" цикла мы встречаем не метку, а безликую скобку <...> поэтому здесь не понятно где начинается цикл
    Глупость чистейшей воды. Все прекрасно понятно! Кому не понятно, тот не знает языка!
    Цитата:
    Отступы помогают не всегда
    Еще как помогают! Ни разу не было проблем! Если у Вас были проблемы, то так и скажите...
    Цитата:
    заметьте, что завершение тела цикла гораздо понятнее именно применяя goto
    Вам да, мне нет Хотя бы потому, что на метку можно попасть как угодно и откуда угодно. Какое же это завершение цикла? Все обезличено! Скажу больше, формально в конструкциях с goto вообще нет такого понятия, как цикл! Есть только переходы... Вы же сами ратуете за переход куда угодно и откуда угодно...

    Между прочим, Вы не обратили внимание на конец фразы: "без крайней на то необходимости". А вот необходимость как раз имеется... Именно нагромождение большого количества goto делает трудным понимание кода, особенно чужого.
    Миллионы программистов по всему миру с Вами явно не согласны... Они все малодумающие? Не слишком ли много Вы берете на себя? Скажите честно, Вы мессия? Которого осенило новое (старое) видение подхода к программированию...
    Запись от liv размещена 26.06.2019 в 15:48 liv вне форума
  2. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Хотя бы потому, что на метку можно попасть как угодно и откуда угодно. Какое же это завершение цикла?
    Можно в принципе всё что угодно испортить, запороть и пр. Даже в вашем любимом стиле. Но ведь не солнышко ясным днём решает куда нам переходить или что присвоить переменной, а программист. Или вы считаете программиста безответственным к тому, что делает? Если он не может контролировать то пусть идёт в дворники.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Все обезличено! Скажу больше, формально в конструкциях с goto вообще нет такого понятия, как цикл! Есть только переходы...
    Как это? У каждой метки есть своё уникальное имя. А любое имя, любая именованная сущность уже представляет из себя чистую абстракцию. Компилятор не даст вам создать две одинаковые метки втой же самой программной сущности. Метка, которая обозначает начало некоторого блока кода, придает ему осмысленное существование. Так что вы не правы. Это как раз у вас скобочки ничего не именуют.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Между прочим, Вы не обратили внимание на конец фразы: "без крайней на то необходимости". А вот необходимость как раз имеется... Именно нагромождение большого количества goto делает трудным понимание кода, особенно чужого.
    Ещё раз повторяю, что код это ещё не вся документация. Нагромождение флагов, скобочек, сотен операторов, как например в языке Си++, это просто какой-то кошмар. Даже Бьерн Страуструп ("дохлый страус") писал, что не знает свой же язык в полном обьёме.. Давайте запихнём в язык ещё что-нибудь, а потом ещё и ещё, что новое.. Никлаус Вирт сказал, что язык должен быть компактным и простым. Добавлю - и расширяемым своими базовыми вещами. Пока к этому приблизился лишь один язык - Форт. Хотя я не очень в восторге даже от него..

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Миллионы программистов по всему миру с Вами явно не согласны... Они все малодумающие? Не слишком ли много Вы берете на себя? Скажите честно, Вы мессия? Которого осенило новое (старое) видение подхода к программированию...
    А вы спрашивали у этих миллионов, чтобы так категорично.?.
    Я не мессия. И ничего на себя не беру. Просто говорю то, что думаю, а это не принято в современном мире. Но кто-то же должен это делать.. "Всё новое это хорошо забытое старое".. Я просто указываю, что в старом подходе было явно здоровое зерно истины, которое к сожалению, было успешно похоронено последующими "инновациями"..
    Запись от CoderHuligan размещена 26.06.2019 в 16:29 CoderHuligan вне форума
  3. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Какое же это завершение цикла?
    Кстати, цикл, не является самостоятельной сущностью в смысле структуризации кода. Со всеми вытекающими из этого следствиями..
    Запись от CoderHuligan размещена 26.06.2019 в 16:35 CoderHuligan вне форума
  4. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Хотя бы потому, что на метку можно попасть как угодно и откуда угодно.
    Извне функции или из функции во вне - нельзя.
    Запись от CoderHuligan размещена 26.06.2019 в 16:44 CoderHuligan вне форума
  5. Старый комментарий
    Аватар для liv
    Цитата:
    Сообщение от CoderHuligan
    Как это? У каждой метки есть своё уникальное имя
    Метки-то есть, а вот законченных операторов цикла нет! Операторы цикла обезличены! Все сведено к набору переходов и меток...
    Тем самым убираем возможность компилятору проконтролировать целостность того же оператора цикла.
    Да, так пишется на Ассемлере... Сам большой любитель Ассемблера...
    Только вот почему-то приверженцев Ассемблера не сильно много. Не задумывались, почему?
    Наверное, хотят, чтобы было проще писать и было меньше возможностей ошибиться...
    Цитата:
    Кстати, цикл, не является самостоятельной сущностью в смысле структуризации кода
    И почему это? Как раз является!
    Цитата:
    Извне функции или из функции во вне - нельзя
    Мы, кажется, говорим об операторе цикла. Не валите все в кучу.
    Да и кто запрещает написать все в одной main()? Вот тут есть где разгуляться с переходами и метками...

    Даже если и есть зерно истины, не стоит делать из этого панацею от всего! Никто не говорит о том, что вообще нельзя использовать goto. Но сводить все к goto - это перебор!
    Запись от liv размещена 26.06.2019 в 16:48 liv вне форума
    Обновил(-а) liv 26.06.2019 в 16:52
  6. Старый комментарий
    Глубокоуважаемый CoderHuligan,
    мне кажется, что отступы и GOTO друг другу не мешают. Пустые строки тоже как бы лишние? Но я с удовольствием вставляю их в свой код.
    Другой пример.
    В математике есть функция sin(x). Её вполне достаточно, чтобы решить любую тригонометрическую задачу. Но добавили (для сервиса) ещё функции ... cos(x), tg(x) ... . Зачем? Бритва Оккама не сработала. Просто куча функций более удобна.
    ...
    Но в целом я с вами согласен. Цикл с помощью GOTO позволяет использовать тело цикла и для других вычислений, проникнув в это тело по метке и не плодить лишний код. Хотя цикл FOR можно было бы ввести для сервиса. А так действительно введено много лишнего, чтобы любой ценой избавиться от GOTO. Лучше GOTO есть только GOTO!
    Запись от нтч размещена 26.06.2019 в 16:52 нтч на форуме
  7. Старый комментарий
    Аватар для liv
    Цитата:
    Сообщение от нтч
    Цикл с помощью GOTO позволяет использовать тело цикла и для других вычислений, проникнув в это тело по метке и не плодить лишний код
    Кто мешает оформить тело цикла отдельной функцией? Вызывай ее в любом месте, кто мешает? А вот скакать туда-сюда... Применять нестандартные подходы - это прямой путь к бессонным ночам поисков ошибок, особенно тех, кто будет после Вас править Ваш код... Да, можно так делать... Язык позволяет! И goto никто не запрещает! Но стоит ли овчинка выделки?
    Цитата:
    В математике есть функция sin(x)
    Действительно, зачем еще косинусы там разные, тангенсы? Можно же обойтись одним синусом?
    Так что Ваше аппелирование к Бритве Оккамы совершенно неуместно...
    Запись от liv размещена 26.06.2019 в 16:58 liv вне форума
    Обновил(-а) liv 26.06.2019 в 17:49
  8. Старый комментарий
    Уважаемый liv,
    вы во многом правы и я не буду с вами спорить только для того, чтобы показать, что я что-то знаю.
    Но вот согласитесь,
    Обезличенные скобки {} в Си++ (как и begin - end в Паскале) - это не самое лучшее решение. Я не против обычных циклов. Но они (особенно скобки и когда их много) ничем не лучше GOTO. Подчеркну, что я не против циклов. Но вот парадокс. Даже в Бейсике цикл FOR - NEXT лучше, чем тот же цикл в Си++.
    Запись от нтч размещена 26.06.2019 в 17:14 нтч на форуме
  9. Старый комментарий
    Аватар для liv
    Цитата:
    Но вот согласитесь
    не соглашусь. Наличие массы меток еще хуже.
    А вот выстроенные стройными рядами с отступами пары скобок говорят о структуре программы очень много.
    Для начала и конца того же цикла совершенно не надо знать имена этих мест. Более, чем достаточно, видеть их соответствие.

    Разумеется, если код писать абы как, то можно в скобках и запутаться...
    Это задача программиста писать так, чтобы было понятно.

    Скобки хороши тем, что позволяют показать структуру программы! А это немало! Особенно, при анализе чужой программы!

    нтч, представьте, чисто гипотетически, к Вам попадает некая программа, в которой Вам требуется изменить две функции.
    При этом одна из них вся построена из безчисленных переходов и меток, причем переходы и во внутрь "циклов" и как угодно...
    Вторая же построена без goto и красиво выстроена с отступами по парам скобок.
    Какую из них Вы поймете и исправите быстрее?
    Запись от liv размещена 26.06.2019 в 17:22 liv вне форума
    Обновил(-а) liv 26.06.2019 в 17:44
  10. Старый комментарий
    liv,
    всё правильно, всё верно. Это с одной стороны. Но есть ещё и другая сторона.
    О чём мы собственно говоря спорим? А вот о чём. Насколько целесообразно заменить циклы с оператором GOTO на циклы без этого оператора. Но лично я и не против. (То, что я высказался по поводу циклов в языке Си++ никак не означает, что я против циклов). Итак, цикл имеет право на существование. Хотя я поддерживаю ТС, но я против тотального применения оператора GOTO. Слава GOTO! ... но в разумных количествах и там, где он необходим.
    ...
    liv,
    я выберу второй вариант. Почему? Я употребляю GOTO только "по праздникам". Но могу понять ТС, когда пытаются заменить GOTO любой ценой. А вот эту цену я платить никогда не буду.
    Запись от нтч размещена 26.06.2019 в 17:49 нтч на форуме
    Обновил(-а) нтч 26.06.2019 в 17:54
  11. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Метки-то есть, а вот законченных операторов цикла нет! Операторы цикла обезличены! Все сведено к набору переходов и меток...
    Они и не нужны. Вас просто приучили мыслить в терминах структурных конструкций. А нужно учиться мыслить в терминах состояний программного кода.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Только вот почему-то приверженцев Ассемблера не сильно много. Не задумывались, почему?
    Потому что в ассемблере надо оперировать понятиями команд процессора, что не каждому по плечу.


    Цитата:
    Сообщение от liv Просмотреть комментарий
    Но сводить все к goto - это перебор!
    Причём здесь goto? Это просто оператор безусловного перехода. Можно назвать его другим словом. В будущем может быть опять скроют этот оператор, но уверен, что тогда будут мыслить состояниями, переходы между которыми всё-равно как-то надо обозначать, ибо это сущность любого алгоритма.
    Запись от CoderHuligan размещена 26.06.2019 в 17:54 CoderHuligan вне форума
  12. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от нтч Просмотреть комментарий
    мне кажется, что отступы и GOTO друг другу не мешают. Пустые строки тоже как бы лишние? Но я с удовольствием вставляю их в свой код.
    Я не против отступов. Сам их всегда применяю.

    Цитата:
    Сообщение от нтч Просмотреть комментарий
    В математике есть функция sin(x). Её вполне достаточно, чтобы решить любую тригонометрическую задачу. Но добавили (для сервиса) ещё функции ... cos(x), tg(x) ... . Зачем? Бритва Оккама не сработала. Просто куча функций более удобна.
    Функции не должны быть базовой частью языка, они должны реализовываться подключаемыми библиотеками.

    Цитата:
    Сообщение от нтч Просмотреть комментарий
    Но в целом я с вами согласен. Цикл с помощью GOTO позволяет использовать тело цикла и для других вычислений, проникнув в это тело по метке и не плодить лишний код. Хотя цикл FOR можно было бы ввести для сервиса. А так действительно введено много лишнего, чтобы любой ценой избавиться от GOTO. Лучше GOTO есть только GOTO!
    Ну, хоть один человек меня немножко поддержал! Спасибо!
    Запись от CoderHuligan размещена 26.06.2019 в 17:57 CoderHuligan вне форума
  13. Старый комментарий
    Аватар для liv
    Цитата:
    Сообщение от CoderHuligan
    Они и не нужны
    Ой ли? Совсем? Уже не надо отрабатывать циклические операции?
    Не, я понимаю, можно такие операции реализовать и переходами... Но зачем усложнять себе жизнь? Когда есть оператор, которые призван это делать... И правильность написания которого может проверить компилятор...
    Цитата:
    в терминах состояний программного кода
    Почему это должно противоречить терминам "структурных конструкций"? Я чего-то не уловил... Я всегда пишу код "в терминах состояния программного кода"... Это должно меня подвигнуть писать везде goto?
    Цитата:
    Причём здесь goto?
    Я имею в виду весь Ваш подход использования только операторов перехода и меток.
    Цитата:
    В будущем может быть опять скроют этот оператор
    Так он уже сейчас скрыт...
    Я никак не возьму в толк, каким образом "мысление состояниями" должно приводить к повсеместному использованию goto?
    Я использую состояния, дальше что?...

    Я за свои 35 лет в программировании (из них на С/С++ пишу лет 20) использовал goto всего пару раз, и то это было на ранних стадиях моей программистской жизни, более того, можно было бы и обойтись... И убежден, что можно написать все, что угодно, при этом, не используя goto. А вот это уже зависит от алгоритмического мышления программиста. Если его нет, то можно (чего ж нельзя? Все можно!) с помощью goto закрутить так, что потом никто не разберется... Или, по крайней мере, сильно подпортить жизнь тем, кто будет ковырять Ваш код...
    Цитата:
    хоть один человек меня немножко поддержал
    Заметьте, поддержал далеко не во всем... А еще кто? Все остальные против...
    Запись от liv размещена 26.06.2019 в 18:26 liv вне форума
  14. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Ой ли? Совсем? Уже не надо отрабатывать циклические операции?
    Не, я понимаю, можно такие операции реализовать и переходами... Но зачем усложнять себе жизнь? Когда есть оператор, которые призван это делать...
    Циклических конструкций не бывает в природе. В природе есть нахождение некоторое время в определённом состоянии.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Я чего-то не уловил... Я всегда пишу код "в терминах состояния программного кода"... Это должно меня подвигнуть писать везде goto?
    Ой ли? Вы всегда определяете имена состояниям? Вы переходите из одного состояния в другое? Или вы под термином "состояние" понимаете нечто совершенно противоположенное тому, как это понимаю я? Традиционный структурный подход препятствует где только можно мышлению в терминах состояний. Он прячет состояния. Как вы программируете мне не совсем ясно.


    Цитата:
    Сообщение от liv Просмотреть комментарий
    Я никак не возьму в толк, каким образом "мысление состояниями" должно приводить к повсеместному использованию goto?
    Я же ранее показывал на примере задачи подсчёта слов, что такое состояние и с чем его едят. Без состояний нет и переходов. Где состояния там и переходы между ними. Это машина Тьюринга. Так реализуются конечные автоматы. Если вы такой продвинутый математик, то должны знать о теории конечных автоматов. КА оперирует множеством состояний и переходов между ними. Что именно вы понимаете под состоянием мне неведомо.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Я использую состояния, дальше что?...
    .
    Покажите как вы используете состояния.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Если его нет, то можно (чего ж нельзя? Все можно!) с помощью goto закрутить так, что потом никто не разберется... Или, по крайней мере, сильно подпортить жизнь тем, кто будет ковырять Ваш код...
    А представьте себе, что вы пишете коммерческий код и вам нужно специально его обфусцировать. Лучшего решения трудно придумать. С goto можно писать просто и понятно, но можно и запутанно. Всё зависит от мотиваций.

    Цитата:
    Сообщение от liv Просмотреть комментарий
    Все остальные против...
    Опять вы за всех трёте..
    Запись от CoderHuligan размещена 26.06.2019 в 18:54 CoderHuligan вне форума
  15. Старый комментарий
    Аватар для Usaga
    Цитата:
    то не следует эмулировать её при помощи дополнительных сущностей:
    Вот как раз метки и goto и являются дополнительным сущностями.

    Цитата:
    "Не следует привлекать новые сущности без крайней на то необходимости."
    Речь о крайности. Но крайность - палка о двух концах. Оккам говорил о переусложнеии. Есть и противоположная крайность - Primitive Obsession - стремление (почти всегда неосознанное) - делать как можно проще, даже в ущерб себе.
    Запись от Usaga размещена 26.06.2019 в 19:00 Usaga вне форума
  16. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Вот как раз метки и goto и являются дополнительным сущностями.
    Метка и goto это всего лишь две сущности.
    Запись от CoderHuligan размещена 26.06.2019 в 19:13 CoderHuligan вне форума
  17. Старый комментарий
    Аватар для Usaga
    А структурированный код вообще без сущностей обходится, которые эту структуру поддерживают. Тоже самое, что именованный забор. Забор имени Ленина, например. Вот с метками тоже самое.
    Запись от Usaga размещена 26.06.2019 в 19:22 Usaga вне форума
  18. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    А структурированный код вообще без сущностей обходится, которые эту структуру поддерживают. Тоже самое, что именованный забор. Забор имени Ленина, например. Вот с метками тоже самое.
    Скобочки, else и т.п. не сущности разве?
    Запись от CoderHuligan размещена 26.06.2019 в 19:51 CoderHuligan вне форума
  19. Старый комментарий
    Ребята, я считаю, что есть целый ряд ситуаций, когда применение GOTO оправдано.
    1. выход из цикла, процедуры
    2. досрочное завершение цикла, процедуры или иной сложной конструкции.
    3. выход из оператора выбора, когда выбор сделан
    4. замена сложных (вложенных) условных операторов. Здесь даже тройное вложение способно ввести в шок любого структурного программиста (и не только). Зачем такие сложности? Тут GOTO выглядит небесным ангелом.
    5. В то же время я считаю, что GOTO должен использоваться для спуска вниз программы. Иными словами, GOTO должен быть выше своей метки. Или, метка должна знать своё место и "не летать над GOTO"
    6. Но я спокойно воспринимаю стремление ТС прояснить свою позицию. Есть два лагеря бойцов. Одни травят оператор GOTO, другие его на руках носят. Истина посредине. Надо просто выслушать обе стороны, не впадая в крайности. Я много воспринял для себя от всех участников этой битвы. И всем вам благодарен за это.
    7. Я полагаю, что в будущем будут текстовые редакторы, которые, например, будут подсвечивать GOTO и соответствующую ему метку. Да много что можно сделать...
    Запись от нтч размещена 26.06.2019 в 20:04 нтч на форуме
  20. Старый комментарий
    Аватар для Usaga
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Скобочки, else и т.п. не сущности разве?
    Нет. Сущность имеет идентичность. Что-то, что её может однозначно идентифицировать среди других такого же типа. Скобочки - границы блока. Забор. else - часть конструкции ветвления.

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

    Разбиение кода на структурные блоки от этой проблемы позволяет уйти. У такого блока есть конкретное начало и конкретный конец. Отсутствие меток внутри гарантирует, что в обход этих двух точек в этот блок не попасть. Так же, границы блока не требуют именований как метки. Количество состояний в таком блоке кода определяется количеством переменных, что зайдействованы в нём. А с применением меток, это количество состояний дополнительно умножается ведь блок становится частью другого блока со своим состоянием.

    Безусловные прыжки по коду связывают весь код в один здоровенный ком, усложняя его поддержку, отладку и просто чтение.

    Сравните:

    Код:
    {
        x *= y;
        z += x;
    }
    Код:
    {
        x *= y;
    L173:
        z += x;
    }
    Что происходит в первом блоке однозначно понятно. Переменные изменяются строго в определённом порядке и по определённому алгоритму. А во втором что? Откуда мы можем попасть в эту метку? Сколькими путями? Это уже нужно искать по коду. Какое значение будет у x? Это тоже неизвестно! Тоже придётся искать!

    Второй блок кода безоговорочно хуже.
    Запись от Usaga размещена 27.06.2019 в 06:14 Usaga вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru