Оператор goto – использовать или нет?

Сегодня с коллегами в груп-чате обсуждали поднятую мною тему относительно оператора goto. Копаясь в коде большой пребольшой системы наткнулся на использование оператора goto. Честно говоря, поначалу был несколько фрустрирован данным фактом, но немного размышлений и комментарии коллег поставили в моей голове все на место.

Те, кто хотя бы немного учился в университете на IT-специальности получали хотя бы базовое образование по программированию. В наиболее продвинутых ВУЗах сразу учили на С, в менее на Pascal (или, о shit, Basic). Но все преподаватели на единой волне твердили: «goto оператор есть, но его использование карается неудом и его нельзя использовать в своих программах». И конечно же, наиболее прилежные студенты честно городили огромные конструкции if, else, фигурных скобок, в лучшем случае, case. Но, как показывает практика, оператор goto в некоторых случаях является наиболее лучшим вариантом решения.

Наиболее весомым аргументом преподавателей было утверждение: «Злоупотребление goto приводит к плохой читаемости кода, большей вероятностью появления ошибок», а менее весомым: «goto – это архаичный оператор, который не потребно употреблять в программировании». На самом деле большинство преподавателей далеко не правы в своих утверждениях, точнее, не дают аргументов «ЗА» оператор, которые тоже имеются.

Если внимательно прочитать первое утверждение преподавателей, то можно понять, что говорят именно про «злоупотребление», а не про использование вовсе. На мой, и не только, взгляд, оператор goto удобнее использовать в случаях когда необходимо проверить много условий и в случае неудачной (или наоборот удачной) проверки сразу перекинуть исполнению программы к выводу ошибки (или положительного результата). Без использования goto это бы превратилось в приличную лестницу на десятки строк с множеством условий if-else c выводом одного или нескольких вариантов выхода из функции. В тоже же время с оператором goto можно задать единственную точку выхода из функции и слать в неё интерпретатор/компилятор при всех ошибках. В этом случае количество кода значительно сокращается, а читать его одно удовольствие.

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

Кстати, а в Ассемблере вообще толком ни одной программы не напишешь без аналога goto – JUMP.

Подтверждать свои слова кодом я тут не буду, а лучше просто отправлю всех на Википедию.

Метки: ,

Четверг, февраля 4, 2010 Общее

Комментировать

При копировании материалов указывайте ссылку на http://kuaa.ru