Welcome to php club

Оператор GOTO


Приведенная ниже информация не касается непосредственно языка PHP, но имеет к нему то отношение, что многие начинающие программисты на языке PHP с удивлением обнаруживают, что в PHP нет оператора безусловного перехода. Возникает естественный вопрос: «почему?»


Введение


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


Например, религиозная война вокруг оператора безусловного перехода – допустимо ли его использование.


Программисты естественным образом разбились на два лагеря: одни считают, что этот оператор – обычный оператор и его использвание так же допустимо, как, например и использование оператора присваивания. Другие считают, что от этого оператора сплошной вред.


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


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


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


Приводя свои примеры, очень часто и те и другие заблуждаются. Показывая, что любую конструкцию можно запрограммировать без оператора GOTO, от оператора GOTO часто избавляются механически – например, вводя дополнительные переменные, но не изменяя при этом саму логику работы. Именно эта ошибка приводит к тому, что поклонники оператора GOTO автоматически получают пример в свою пользу – такие программы действительно становятся еще менее понятными. Общее заблуждение состоит в убежденности, что от оператора GOTO можно избавиться чисто механически. Это не верно.


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


В программировании не может быть войн. Если Вы пишите программы для себя и только для себя – пожалуйста, пользуйтесь любыми удобными для Вас способами. Если Вы пишите для других, то исходите из того, что эта программа предназначена для других – она должна быть ясной и понятной для других. Именно для других, а не только для Вас самих.


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


Внимание! Здесь приведены только цитаты. Полный текст статьи Вы можете прочитать, перейдя по ссылке.




История изгнания оператора GOTO
http://www.inr.ac.ru/~info21/blackbox/disciplina/goto.htm


С оператором GOTO к настоящему времени достигнута полная ясность: в языке программирования для серьезной работы оператора GOTO быть не должно. История его изгнания весьма поучительна.


Наличие GOTO в машинном языке понятно: там важна экономия средств, а с помощью одного этого оператора можно смоделировать любые структуры управления (операторы IF, FOR, WHILE и т.д.). По той же причине в 50-е годы GOTO был автоматически включен в первые языки программирования (например, фортран): ведь еще не было ясно, ни что такое хорошие программы, ни как их строить.


К концу 60-х гг. анализ уже накопленного опыта выявил (см. знаменитое письмо выдающегося теоретика систематического программирования Э.Дейкстры “Go To Statement Considered Harmful”), что бесконтрольное использование GOTO приводит к «спагетти» — программам, хаотически напичканным операторами GOTO, в которых отследить все возможные состояния вычислительного процесса — а следовательно, и убедиться в корректности программы — становится практически невозможно.


Вслед за работами Дейкстры и др. возникла методология структурного программирования.


(Здесь часто говорят о «программировании без GOTO», хотя это слишком грубое упрощение.)


В структурном программировании был найден минимальный набор управляющих структур для систематического построения эффективных программ (IF, WHILE и т.п.; все они представлены в Обероне / Компонентном Паскале).


В 70-е гг. «проблема GOTO» еще активно дискутировалась, но к настоящему времени вопрос исчерпан: GOTO не нужен и вреден, и защищать его не возьмется ни один серьезный специалист. Наличие GOTO в старых языках — следствие необходимости обеспечить совместимость с «программным наследием»; а его наличие в новых — признак некомпетентности проектировщика.


Но почему оператор GOTO следует вообще исключать из языка программирования, ведь, казалось бы, им можно просто не пользоваться, оставив лишь на всякий пожарный случай? Ответ заключается в следующем.


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


Но такие заплатки как ржавчина: стоит ржавчине появиться в одной точке, и она начинает расти, разъедая конструкцию.


Проблема усугубляется в случае программистов-самоучек — а таких большинство, т.к. цифровая революция развивается слишком быстро, требуя бОльшего числа специалистов, нежели может поставлять система образования, сама в значительной степени построенная из самоучек: нередко «образование» сводится к семестровому курсу, в котором объясняется синтаксис фортрана или C под сопровождением благоглупостей вроде «программирование — просто раздел прикладной математики» или «настоящему программисту все равно, на каком языке писать».


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


Из документации, где просто перечислены все средства — как и из большинства руководств, сляпанных по принципу разжевывания документации — невозможно узнать, что то или иное средство было просто сделанной когда-то ошибкой дизайна.


Поэтому наилучшее решение проблемы GOTO — радикальное: просто исключить его из языка.


О структурном программировании и отсутствии GOTO
http://www.inr.ac.ru/~info21/blackbox/disciplina/primerbezgoto.htm
Говорить о структурном программировании, как о «программировании без GOTO» — слишком грубое упрощение. Если просто взять наивную программу с парой вложенных циклов и выходами из них с помощью GOTO и механически исключить GOTO, вводя дополнительные логические переменные, то «исправленная» программа может оказаться еще менее ясной, чем исходная.


Б.В. Керниган, Д.М. Ричи — Язык 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
Эдсгер В. Дейкстра. О вреде оператора go to
Эдсгер В. Дейкстра несколько лет занимался исследованиями, в которых было установлено, что профессионализм программиста тем меньше, чем чаще он использует оператор 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
Чем длиннее процедура, тем труднее ее понять. Если у вас есть хорошее название для метода, то вам не нужно смотреть его тело. Мы следуем эвристике: как только мы чувствуем, что надо написать комментарий, мы вместо этого пишем метод.
Зачастую комментарии используются как дезодорант. Удивительно, как часто смотришь на хорошо комментированный код и видишь, что комментарии написаны потому, что код плохой. Комментарии не причина, а индикатор плохого кода.


Флаги и оператор GOTO
http://popoff.donetsk.ua/text/work/prg/goto/
Когда я собирал приведенные выше материалы, мне показались не достаточно обоснованными те утверждения, которые в этих материалах есть. Никаких исследований не проводилось, а если и проводились, то описаны как-то неясно и – уж тем более – обычный человек вряд ли сможет эти исследования повторить для того, чтобы убедиться в том, что это именно так. Люди, у которых есть достаточно большой опыт программирования, не подвергают сомнению те положения, которые в этих материалах утверждаются – на интуитивном уровне понятно, что оператора GOTO лучше избегать. Но всеже хотелось бы получить какой-нибудь материал, который демонстрирует все недостатки этого оператора не на интуитивном, а на осознанном уровне.


Голосование. Используете ли Вы в своих программах оператор goto?
http://www.delphikingdom.com/asp/voting.asp?VoteID=191


International PHP Magazine. PHPBarnstormer #12 (August 23 – August 29, 2004)
http://php-mag.net/itr/kolumnen/psecom,id,12,nodeid,207.html


Сохраненные копии статей, ссылки на которые здесь приведены:
http://download.popoff.donetsk.ua/phpclub/goto-file.zip


 
Комментариев нет. [Показать комментарии/форму]