| |||||
Оператор GOTOПриведенная ниже информация не касается непосредственно языка PHP, но имеет к нему то отношение, что многие начинающие программисты на языке PHP с удивлением обнаруживают, что в PHP нет оператора безусловного перехода. Возникает естественный вопрос: «почему?» Введение Казалось бы, что может быть миролюбивее программирования. Обычное себе дело – сидишь, программируешь в свое удовольствие. Но нет. Лень и нежелание думать приводят к тому, что и здесь разворачивается война. Например, религиозная война вокруг оператора безусловного перехода – допустимо ли его использование. Программисты естественным образом разбились на два лагеря: одни считают, что этот оператор – обычный оператор и его использвание так же допустимо, как, например и использование оператора присваивания. Другие считают, что от этого оператора сплошной вред. Те, кто считают оператор GOTO не допустимым, аргументируют свои слова тем, что программы, содержащие этот оператор, сложнее отлаживать, в них сложнее разобраться и их сложнее сопровождать. В качестве примеров часто показывают, что любую конструкцию можно запрограммировать без использования этого оператора. Те, кто считают оператор GOTO допустимым, говорят о том, что язык должен предоставлять программисту максимум возможностей и что это выбор программиста, писать ли ему хороший или плохой код. В качестве примеров приводят случаи, в которых использование оператора GOTO приводит к упрощению кода и который без этого оператора был бы гораздо сложнее. Это только некоторые аргументы. И у тех, и у других есть также много других аргументов в свою пользу. Приводя свои примеры, очень часто и те и другие заблуждаются. Показывая, что любую конструкцию можно запрограммировать без оператора GOTO, от оператора GOTO часто избавляются механически – например, вводя дополнительные переменные, но не изменяя при этом саму логику работы. Именно эта ошибка приводит к тому, что поклонники оператора GOTO автоматически получают пример в свою пользу – такие программы действительно становятся еще менее понятными. Общее заблуждение состоит в убежденности, что от оператора GOTO можно избавиться чисто механически. Это не верно. Я не обратил бы внимания на эту войну, если бы вокруг этого оператора не было столько эмоций. Те, кто считают этот оператор допустимым, реагируют на его отсутствие в РНР так, будто у них последний кусок хлеба отобрали. А у тех, кто не любит этот оператор, начинается нервная дрожь от одного только воспоминания об этом операторе. Впрочем, я немного преувеличиваю. В программировании не может быть войн. Если Вы пишите программы для себя и только для себя – пожалуйста, пользуйтесь любыми удобными для Вас способами. Если Вы пишите для других, то исходите из того, что эта программа предназначена для других – она должна быть ясной и понятной для других. Именно для других, а не только для Вас самих. Эта последняя фраза означает, что те люди, которые считают оператор GOTO допустимым, игнорируют сообщения о том, что в программах, которые содержат этот оператор, сложно разобраться. Тот, кто говорит фразу типа «здесь и так все понятно!», понимает, что эта фраза фактически означает «МНЕ здесь и так все понятно!», но слово «мне» он специально не говорит, в надежде, что тот, кто эту фразу слушает, воспримет ее как «ВСЕМ здесь все понятно!». Внимание! Здесь приведены только цитаты. Полный текст статьи Вы можете прочитать, перейдя по ссылке.
История изгнания оператора GOTO С оператором 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
Б.В. Керниган, Д.М. Ричи — Язык C. Оператор GOTO и метки.
Операторы break и continue в РНР. Читайте документацию!
Дополнительная информация
GOTO operator
Дурно пахнущий код
Флаги и оператор GOTO
Голосование. Используете ли Вы в своих программах оператор goto?
International PHP Magazine. PHPBarnstormer #12 (August 23 – August 29, 2004)
Сохраненные копии статей, ссылки на которые здесь приведены:
Комментариев нет.
[Показать комментарии/форму]
| |||||