![]() |
Стереотипы: goto
Недавно один мой знакомый был повергнут в шок, увидев в моем коде оператор goto. Попытки объяснить что не все так плохо не были восприняты :)
Нынче в институтах учат, что применение goto - не кошерно, не тру и ваще отстой. Применение goto считается преступлением перед мировой общественностью. Жаль только, что ВУЗы не учат тому, что каждому овощу - свое блюдо. Ни в коей мере не преувеличивая важность goto, приведу все же два примера, в которых решение без goto было бы некрасиво и сложнее для восприятия: C# Код:
/// <summary>Код:
/// <summary> |
Код:
foreach (int[,] matrix in listOfMatrix) |
Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
Код:
outer: |
Цитата:
ЗЫ Да и кстати даже если бы он был рабочий, он явно менее понятный чем исходный :) |
Цитата:
|
писал как ответ 8)) и он делает то же самое ! Написать екзешник ? :D
... по поводу смотрибельности мой меньше по кол-ву строк! И уж естественно он рабочий 8))))))))) |
Цитата:
Конечно же, я не спорю - goto решает! ) |
Цитата:
Цитата:
|
не буду .... :p я и так знаю что рабочий
... главное не это ... как то разбирая старый fig-forth заметил что goto там вытворяла НЕЧТО.... дело в том что счетчики for лежали на стеке ... и чтоб выйти по goto форту приходилось такой чисткой и анализом заниматься что КАРАУЛ! |
Цитата:
|
по-моему, довольно очевидная вещь
было у Криса в трюках |
он стоит в цикле foreach ... как и у тебя .... присмотрись
|
Цитата:
|
Цитата:
Кто такой Крис, и какая именно вещь очевидна ? |
Код:
foreach (int[,] matrix in listOfMatrix) |
Цитата:
В общем случае неуправляемых языков - конечно я согласен, что goto может привести к очень плохим последствиям. |
ну согласен ... но постоянно в мозгу а КАК ТАМ НА СТЕКЕ 8)))))))))))))
.... стекофобия 8))) |
Цитата:
Трассировка нас рассудит :D |
кстати return - это тот же goto только в фас!
|
я имел в виду, что для большинства ясно, что иногда goto очень даже полезен
крис касперски. вспомнил его, так как пример уж больно похож :) а вообще хотелось бы побольше подобных заметок со всякими тонкостями |
Цитата:
ЗЫ Да и еще yield, как же ж без него, родимого, структурного нашего.... |
:D да goto приближает нас к низкоуровневому программированию ... ведь никто не пытается сказать ничего против джампов в ассемблере
... и поскольку у Си С++ положение аморфное .... то GOTO живет там как засланец мышыных кодов! давненько было помню как z0mbie в своей теории недектируемости вируса (делал попытки на Goto выстроить матрицу исполнения, которая по его мнению могла завести любую эвристику в ступор) ... делал он именно на GOTO ... :p поэтому GOTO живет и будет жить ... НО Я ГОВОРЮ НЕ О ВЕЩАХ УПРОЩАЮЩИХ ПОНИМАНИЕ, а наоборот 8)))) , вообще вопрос риторический должен ли антивирус понимать код вируса! |
Цитата:
Код:
public TcpClient Connect(IPEndPoint host) |
Я иногда использую goto что бы неплодить ненужных вложенных циклов.
|
Цитата:
Да, может быть именно в твоей ситуации goto и смотрится лучше, но в других случаях, как правило, это лишь усложняет программу, особенно если ее пишут "неопытные" программисты, которые скачут с goto по программе вдоль и поперек. Поэтому, используй goto только тогда когда это НЕ ЗАПУТАЕТ код программы. Во :) |
циклы могут выходить стандартными средствами не делая скачков и не делая ненужных проходов.... просто обычно люди сравнение в for(....;X<Y;....) делают одно а досточно описать флаг выхода и вы выйдите из любого количества циклов без лишних проходов.... for(....,ex=0;X<Y && ex==0;....)
Код:
for(....,ex=0;X<Y && ex==0;....) |
Цитата:
|
Retimiled, вообще то глубокой вложенности нужно избегать - с помощью выделения кода в методы\функции, ибо глубоко вложенные циклы нечитабельное говно с любой стороны - что с goto, что с флагами, что с break/continue.
|
2 Ra$cal
да .... если не заботишься об быстродействии и не отсчитываешь такты на PUSHA POPA , то конечно нужно оформлять в виде функций а как ты растащишь вот такой код Код:
for(....,ex=0;X<Y && ex<10;....) |
В перле goto как будто медленнее работает, чем, например, redo.
|
Цитата:
Не дотнетчик я - импровизировал ) |
Цитата:
|
Цитата:
|
Я бы вынес проверку одной матрицы на наличие нуля в отдельную функцию и делал бы return true если бы встретился хотя бы один ноль. А общий цикл оформил бы примерно так (псевдокод):
Код:
|
Цитата:
п.с. о вкусах не спорят) если тебе так удобнее почемубы и нет) в бою все средства... |
Цитата:
1) Этот код будет разбирать не только автор 2) Возможно даже через несколько лет. |
Цитата:
Я же привожу конкретные примеры, в котором метка - самое простое и наглядное решение. Цитата:
Но в целом точка зрения ясна. |
Цитата:
|
Цитата:
|
Цитата:
|
| Время: 21:52 |