Каждый, кто против - goto
, прямо или косвенно цитирует статью Эдсгера Дейкстры GoTo, которая считается вредной , чтобы обосновать свою позицию. Жаль, что статья Дейкстры практически не имеет ничего общего с тем, как в наши дни используются операторы * 1006 и, следовательно, то, что говорится в статье, практически не применимо к современной сцене программирования. Безмолвный мем теперь граничит с религией, вплоть до ее священных писаний, диктуемых свыше, его первосвященников и избегания (или еще хуже) воспринимаемых еретиков.
Давайте поместим статью Дейкстры в контекст, чтобы пролить немного света на эту тему.
Когда Дейкстра написал свою статью, популярные языки того времени были неструктурированными процедурными, такими как бейсик, фортран (более ранние диалекты) и различные языки ассемблера. Люди, использующие языки более высокого уровня, довольно часто перепрыгивали по всей своей кодовой базе в искаженных, искаженных потоках выполнения, что породило термин «код спагетти». Вы можете увидеть это, перейдя к классической игре Trek , написанной Майком Мэйфилдом и попытавшись выяснить, как все работает. Потратьте несколько минут, чтобы просмотреть это.
НАСТОЯЩЕЕ - это «необузданное использование утверждения« идти к »», против которого Дейкстра ругался в своей газете в 1968 году. эта бумага. Возможность прыгать в любом месте вашего кода в любое удобное для вас место было тем, что он критиковал и требовал, чтобы его остановили. Сравнивать это с анемичными способностями goto
в C или других подобных более современных языках просто невозможно.
Я уже слышу возвышенные крики культистов, когда они сталкиваются с еретиком. «Но, - будут повторять они, - вы можете сделать код очень трудным для чтения с goto
в C.» О да? Вы также можете сделать код очень трудным для чтения без goto
. Как этот:
#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
}
Не goto
в поле зрения, поэтому его должно быть легко читать, верно? Или как насчет этого:
a[900]; b;c;d=1 ;e=1;f; g;h;O; main(k,
l)char* *l;{g= atoi(* ++l); for(k=
0;k*k< g;b=k ++>>1) ;for(h= 0;h*h<=
g;++h); --h;c=( (h+=g>h *(h+1)) -1)>>1;
while(d <=g){ ++O;for (f=0;f< O&&d<=g
;++f)a[ b<<5|c] =d++,b+= e;for( f=0;f<O
&&d<=g; ++f)a[b <<5|c]= d++,c+= e;e= -e
;}for(c =0;c<h; ++c){ for(b=0 ;b<k;++
b){if(b <k/2)a[ b<<5|c] ^=a[(k -(b+1))
<<5|c]^= a[b<<5 |c]^=a[ (k-(b+1 ))<<5|c]
;printf( a[b<<5|c ]?"%-4d" :" " ,a[b<<5
|c]);} putchar( '\n');}} /*Mike Laman*/
Нет goto
там тоже. Поэтому он должен быть читаемым.
Какой смысл в этих примерах? Это не языковые функции, которые делают нечитаемый, не поддерживаемый код. Это не синтаксис, который делает это. Это плохие программисты, которые вызывают это. И плохие программисты, как вы можете видеть в этом пункте, могут сделать любую языковую функцию нечитаемой и непригодной для использования. Как for
петли там. (Вы можете их видеть, верно?)
Теперь, чтобы быть справедливым, некоторые языковые конструкции легче злоупотреблять, чем другие. Однако, если вы программист на C, я бы посмотрел гораздо ближе примерно на 50% случаев использования #define
задолго до того, как отправился бы в поход против goto
!
Итак, для тех, кто потрудился прочитать это далеко, есть несколько ключевых моментов, на которые следует обратить внимание.
- Статья Дейкстры о
goto
заявлениях была написана для среды программирования, где goto
был лот
более опасно, чем в большинстве современных языков, которые не являются ассемблером.
- Автоматически отбрасывать все случаи использования
goto
, потому что это примерно так же рационально, как сказать: «Я пытался
когда-то веселились, но мне это не нравилось, так что теперь я против ».
- Существует законное использование современных (анемичных)
goto
операторов в коде, которые не могут быть адекватно
заменены другими конструкциями.
- Есть, конечно, незаконное использование тех же утверждений.
- Существует также незаконное использование современных управляющих операторов, таких как мерзость "
godo
", где всегда ложная петля do
не используется break
вместо goto
. Они часто хуже, чем разумное использование goto
.