Недавно один мой знакомый был повергнут в шок, увидев в моем коде оператор goto. Попытки объяснить что не все так плохо не были восприняты Нынче в институтах учат, что применение goto - не кошерно, не тру и ваще отстой. Применение goto считается преступлением перед мировой общественностью. Жаль только, что ВУЗы не учат тому, что каждому овощу - свое блюдо. Ни в коей мере не преувеличивая важность goto, приведу все же два примера, в которых решение без goto было бы некрасиво и сложнее для восприятия: C# Code: /// <summary> /// Функция проверяет, что во всех матрицах есть хотя бы один нуль /// </summary> /// <param name="listOfMatrix"></param> /// <returns></returns> public bool HasZero(List<int[,]> listOfMatrix) { foreach (int[,] matrix in listOfMatrix) { for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) if(matrix[i, j] == 0) goto nextMatrix;//<----- return false; nextMatrix: ; } return true; } C# Code: /// <summary> /// Создание tcp-сокета, с несколькими попытками подключения /// </summary> /// <param name="host"></param> /// <returns></returns> public TcpClient Connect(IPEndPoint host) { TcpClient client = new TcpClient(); int maxTryCount = 5; tryAgain: try { maxTryCount--; client.Connect(host); return client; } catch (SocketException) { if(maxTryCount>0) goto tryAgain;//<----- else throw; } }
Code: foreach (int[,] matrix in listOfMatrix) { for (int i = 0,nextMatrix=false; i < matrix.GetLength(0) && !nextMatrix; i++) for (int j = 0; j < matrix.GetLength(1) && !nextMatrix; j++) if(matrix[i, j] == 0) nextMatrix=true;//<----- return nextMatrix; }
Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены Code: outer: for(int i = 0; ....){ for(int j = 0; ....){ if(...) continue outer; if(...) break outer; } } но goto удобен, когда проще написать его, чем переконопачивать весь код
Эээ.... ну ваще-то этот код не эквивалентен приведенному, и вообще не рабочий. Будьте внимательней ) ЗЫ Да и кстати даже если бы он был рабочий, он явно менее понятный чем исходный
писал как ответ 8)) и он делает то же самое ! Написать екзешник ? ... по поводу смотрибельности мой меньше по кол-ву строк! И уж естественно он рабочий 8)))))))))
суть не меняется, просто читабельность и логичность кода - немного повышается ) Конечно же, я не спорю - goto решает! )
Пиши "Смотрибельность" не измеряется в количестве строк. Если бы это было так, то фильм "Аватар" (ок 4ГБ) был бы гораздо сложнее для восприятия чем докзательство теоремы Ферма (ок 40 КБ), что явно не так
не буду .... я и так знаю что рабочий ... главное не это ... как то разбирая старый fig-forth заметил что goto там вытворяла НЕЧТО.... дело в том что счетчики for лежали на стеке ... и чтоб выйти по goto форту приходилось такой чисткой и анализом заниматься что КАРАУЛ!
Code: foreach (int[,] matrix in listOfMatrix) { for (int i = 0,nextMatrix=false; i < matrix.GetLength(0) && !nextMatrix; i++) for (int j = 0; j < matrix.GetLength(1) && !nextMatrix; j++) if(matrix[i, j] == 0) nextMatrix=true;//<----- тут циклы заканчиваются printf("Этот код не выполнится в циклах for только в foreach 8-Ь"); return nextMatrix; }
К счастью, в C# таких проблем нет В общем случае неуправляемых языков - конечно я согласен, что goto может привести к очень плохим последствиям.
я имел в виду, что для большинства ясно, что иногда goto очень даже полезен крис касперски. вспомнил его, так как пример уж больно похож а вообще хотелось бы побольше подобных заметок со всякими тонкостями