[Закрыть]
 
popoff.donetsk.ua
Эмоции - это красивая обёртка для лжи. /Popoff/
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Статьи - Программирование - Технологии программирования - Флаги и оператор GOTO
Я это делаю
Персональное меню
Голосование
Деньги, либо любимое занятие? Постоянный адрес этого вопроса
Деньги, но неинтересная работа и невозможность уделить время семье
Интересная работа, возможность саморазвиваться, но нищенский заработок
Ваш возраст (не обязательно)
Почему? (не обязательно)

Голосование закрыто.

Поиск по сайту
Реклама
Программное обеспечение любой сложности
koins.com.ua
Статистика

Флаги и оператор GOTO

Постоянный адрес статьи

Флаги и оператор GOTO -- Сначала в этом разделе планировалось рассмотреть, чем плох оператор GOTO. Рассматривая этот оператор, я обнаружил, что по существу этот оператор мало чем отличается от использования флагов. Флаги часто используют, чтобы избавиться от этого оператора, но смысл - непонятность программы - от простой замены одной плохой конструкции на другую - не меняется. Немного позже обнаружилось, что флаги и оператор GOTO - не единственные «плохие конструкции». В этом разделе я буду рассматривать эти конструкции и искать ответ на вопрос, почему от этих конструкций не хотят избавляться.

Содержание

Когда я собирал материалы по оператору GOTO, мне показались не достаточно обоснованными те утверждения, которые в этих материалах есть. Никаких исследований не проводилось, а если и проводились, то описаны как-то неясно и - уж тем более - обычный человек вряд ли сможет эти исследования повторить для того, чтобы убедиться в том, что это именно так. Люди, у которых есть достаточно большой опыт программирования, не подвергают сомнению те положения, которые в этих материалах утверждаются - на интуитивном уровне понятно, что оператора GOTO лучше избегать. Но все же хотелось бы получить какой-нибудь материал, который демонстрирует все недостатки этого оператора не на интуитивном, а на осознанном уровне.
Cоблазн поставить быструю «заплатку» — соблазн зачастую непреодолимый под давлением жесткого графика. Но такие заплатки как ржавчина: стоит ржавчине появиться в одной точке, и она начинает расти, разъедая конструкцию.
Пусть дан массив из n целочисленных элементов. Про этот массив известно, что один из элементов равен x. Требуется найти этот элемент и записать его позицию в целую переменную i (на Обероне/Компонентном Паскале)
Есть программа с флагами, в качестве теста попробуйте понять, что она делает? (на языке Си)
Условие: есть массив строк. Нужно выбрать часть массива, которая находится между первым элементом, содержащим в себе одну подстроку и следующим элементом, длина которого меньше 10. (на языке PHP)
Поиск минимума в списке (на Прологе) - как эту задачу решают в процедурных языках при помощи циклов и почему такой подход принципиально не подходит при использовании рекурсии
Что еще свойственно людям, которым нравится использовать оператор GOTO, флаги или накапливающие аргументы?
Дополнительная информация

Введение

Постоянный адрес статьи

Когда я собирал материалы по оператору GOTO, мне показались не достаточно обоснованными те утверждения, которые в этих материалах есть. Никаких исследований не проводилось, а если и проводились, то описаны как-то неясно и - уж тем более - обычный человек вряд ли сможет эти исследования повторить для того, чтобы убедиться в том, что это именно так. Люди, у которых есть достаточно большой опыт программирования, не подвергают сомнению те положения, которые в этих материалах утверждаются - на интуитивном уровне понятно, что оператора GOTO лучше избегать. Но все же хотелось бы получить какой-нибудь материал, который демонстрирует все недостатки этого оператора не на интуитивном, а на осознанном уровне.

Фраза «этот оператор делает программу плохо читаемой» мне не кажется достаточно обоснованной фразой. Наверняка найдутся люди, которые напишут программу с этим оператором и будут говорить, что «мне так понятнее». И они будут правы - им действительно так понятнее. Возможно, нужно копать в сторону - для чего эти люди так говорят? А повод есть и вполне резонный - чтобы избавить себя от размышлений о том, как сделать программу лучше; вариант с GOTO - это первый пришедший в голову вариант и согласиться с тем, что «так - не понятно» - фактически означает, что требуется тратить время и прилагать усилия для того, чтобы сделать этот вариант понятным. Более того, это означает, что этот человек должен будет согласиться с тем, что «первыми мне приходят в голову плохие варианты». Никому не хочется думать о себе плохо. Не может также не броситься в глаза сопутствующее этому оператору: «конечно! эту задачу невозможно (сложно; иначе - она непременно станет непонятной) решить по-другому!»

Рассуждения о том, что «сложно построить граф выполнения программы и выяснить, в какой момент в каком месте программа будет выполняться» кажутся вполне обоснованными, но обычный человек задастся вопросом: «а зачем мне нужно строить этот граф? я уже давно успешно программирую, никогда ни над чем подобным не задумывался и не вижу необходимости в том, чтобы теперь начинать задумываться.» И этот человек тоже будет прав - важность этих графов описана весьма размыто.

Рассуждения о том, что «в машинных языках без этого оператора не обойтись» призваны расслабить читателя перед тем, как ему промоют мозги тем, что goto - плохой оператор. Нашему исследованию эти рассуждения, на самом деле, мало что дают. ДА, есть места, где без этого оператора не обойтись, НО в других местах он не нужен. Чем-то напоминает игру «Почему бы тебе не... - Да, но...»

Еще один момент, о котором раньше не упоминалось - это флаги. Флаги - это фактически продолжение оператора GOTO, просто о них не говорят. Сюда же я отнес бы и выходы из нескольких циклов. Эти вопросы вообще никак не освещаются.

Еще один вариант, в сторону которого можно было бы покопать - это собрать коллекцию типичных алгоритмов, в которых используются операторы GOTO или флаги и привести примеры без них.

Некоторые могут сказать, что «мы, профессионалы, знаем как писать и дополнительное обоснование вредности этого оператора нам не требуется, а если какие-то непонятные люди хотят использовать этот оператор - пусть используют себе на здоровье, нам с их программами не работать.» Если Вы относитесь к этим людям, то Вы вполне можете сделать то, что делаете всегда - отгородитесь от этого исследования и не принимайте в нем участие. Это исследование предназначено для тех людей, которым подобная модель поведения не подходит.

Кто-то может спросить: «а чем это Вам так насолил этот оператор, что Вы против него развернули такое исследование?» Я отвечу, что нет, мне этот оператор ничем не насолил. Те люди, которые используют этот оператор, тоже мне ничем не насолили. Я равнодушен к объекту этого исследования также, как и к объектам многих других исследований, которыми я занимаюсь или когда-либо занимался. Я не равнодушен к той лжи, которая прячется за этим оператором. Ложь состоит в том, что те люди, которые отстаивают возможность использования этого оператора, заблуждаясь, лгут себе и другим. Те люди, которые понимают вредность этого оператора, часто тоже заблуждаются, осознавая лишь часть правды. Но часть правды - это не есть правда. Не подумайте, что эта ложь имеет для меня какое-то особое значение по сравнению с какой-нибудь другой ложью. Здесь, на этом сайте, я занимаюсь исследованием лжи как отдельного независимого объекта. В целом, можно было бы сказать, что вся наука психология занимается исследованием лжи.

Возможно, некоторым вопрос, поднятый в этом топике, покажется каким-то ненужным или несущественным. На это я мог бы задать Вам вопрос, сформулированный Фрейдом в лекции «Ошибочные действия» лет, наверное, сто назад: «а не подменяете ли Вы в Вашей критике важность проблемы ее внешней яркостью?» Изгнать страх из сознания - не есть способ избавиться от этого страха. Не говорить об операторе GOTO - не есть способ избавиться от него.

Опытные программисты знают, что написать хорошую программу - это великое искусство. Что начинающие программисты пишут кривые программы не потому, что «они дурные», а потому что у них нет опыта. Рассматривая тот вопрос, который я здесь поднял, рассматривая примеры кода, как обычно решают задачи начинающие программисты и как их решают программисты с опытом, я фактически делюсь своим опытом (и опытом других людей) с начинающими.

Я, наверное, обманул бы Вас, говоря, что меня интересуют только технические особенности использования этого оператора. На самом деле меня скорее интересует ответ на вопрос «почему этот оператор могут хотеть использовать?». Тем не менее, технические особенности мне, как программисту, тоже интересны.

В этом разделе я буду собирать материалы для этого исследования. Если у Вас есть, что предложить по этому вопросу, я был бы рад получить от Вас информацию.

Смотрите также

Постоянный адрес статьи

Оператор GOTO - с чего началось мое исследование
http://phpclub.ru/faq/goto
Приведенная здесь информация не касается непосредственно языка PHP, но имеет к нему то отношение, что многие начинающие программисты на языке PHP с удивлением обнаруживают, что в PHP нет оператора безусловного перехода. Возникает естественный вопрос: «почему?»

Б.В. Керниган, Д.М. Ричи -- Язык C. Оператор GOTO и метки.
http://sanych99.narod.ru/New_Site/books/kr/045.html
В языке Си сложно выйти сразу из нескольких циклов.

Операторы break и continue в РНР.
http://www.php.net/break
http://www.php.net/continue
Почему проблемы выхода из вложенных циклов нет в РНР - операторы break и continue работают не так, как в ANSI-C. Эти операторы позволяют выходить из циклов любой вложенности. Однако в комментариях пользователей можно найти информацию о том, что использование этой возможности не рекомендуется. Если у Вас появилась такая необходимость, то посмотрите внимательно на Вашу программу и подумайте, как Вашу задачу можно было бы решить по-другому. Скорее всего Вы плохо продумали составленный Вами алгоритм.

Edsger W. Dijkstra. Go To Statement Considered Harmful
Эдсгер В. Дейкстра. О вреде оператора goto
Эдсгер В. Дейкстра несколько лет занимался исследованиями, в которых было установлено, что профессионализм программиста тем меньше, чем чаще он использует оператор goto в своих программах. Через некоторое время Дейкстра выяснил, почему использование этого оператора имеет такое пагубное действие и пришел к выводу, что оператор GOTO должен быть исключен из всех языков программирования высокого уровня. В этом письме Дейкстра объясняет, почему.

GOTO Operator (на английском языке)
http://www.zend.com/lists/php-dev/200407/msg00748.html
Обсуждение оператора GOTO разработчиками PHP (нужно кликать на Next By Thread, чтобы читать следующее сообщение)

Дурно пахнущий код
http://xprogramming.ru/Articles/CodeSmells.html
Чем длиннее процедура, тем труднее ее понять. Если у вас есть хорошее название для метода, то вам не нужно смотреть его тело. Мы следуем эвристике: как только мы чувствуем, что надо написать комментарий, мы вместо этого пишем метод. Зачастую комментарии используются как дезодорант. Удивительно, как часто смотришь на хорошо комментированный код и видишь, что комментарии написаны потому, что код плохой. Комментарии не причина, а индикатор плохого кода.

Последняя модификация: 19.01.07 21:57

Не проходите мимо! Оставьте Ваш комментарий в форуме! >>>