Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

25.12.2009, 00:46
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Стереотипы: goto
Недавно один мой знакомый был повергнут в шок, увидев в моем коде оператор goto. Попытки объяснить что не все так плохо не были восприняты
Нынче в институтах учат, что применение goto - не кошерно, не тру и ваще отстой. Применение goto считается преступлением перед мировой общественностью.
Жаль только, что ВУЗы не учат тому, что каждому овощу - свое блюдо.
Ни в коей мере не преувеличивая важность goto, приведу все же два примера, в которых решение без goto было бы некрасиво и сложнее для восприятия:
C#
Код:
/// <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#
Код:
/// <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;
}
}
|
|
|

25.12.2009, 00:59
|
|
Banned
Регистрация: 24.12.2009
Сообщений: 141
Провел на форуме: 487460
Репутация:
45
|
|
Код:
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;
}

Последний раз редактировалось Retimiled; 25.12.2009 в 01:37..
|
|
|

25.12.2009, 01:00
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
Код:
outer:
for(int i = 0; ....){
for(int j = 0; ....){
if(...) continue outer;
if(...) break outer;
}
}
но goto удобен, когда проще написать его, чем переконопачивать весь код
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

25.12.2009, 01:03
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от Retimiled
Код:
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;
}

Эээ.... ну ваще-то этот код не эквивалентен приведенному, и вообще не рабочий. Будьте внимательней )
ЗЫ
Да и кстати даже если бы он был рабочий, он явно менее понятный чем исходный 
|
|
|

25.12.2009, 01:05
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от desTiny
Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
Код:
outer:
for(int i = 0; ....){
for(int j = 0; ....){
if(...) continue outer;
if(...) break outer;
}
}
но goto удобен, когда проще написать его, чем переконопачивать весь код
Ну от того что goto назвать continue, ведь суть не меняется, не так ли?
|
|
|

25.12.2009, 01:06
|
|
Banned
Регистрация: 24.12.2009
Сообщений: 141
Провел на форуме: 487460
Репутация:
45
|
|
писал как ответ 8)) и он делает то же самое ! Написать екзешник ?
... по поводу смотрибельности мой меньше по кол-ву строк! И уж естественно он рабочий 8)))))))))
Последний раз редактировалось Retimiled; 25.12.2009 в 01:14..
|
|
|

25.12.2009, 01:08
|
|
Reservists Of Antichat - Level 6
Регистрация: 04.02.2007
Сообщений: 1,152
Провел на форуме: 3008839
Репутация:
1502
|
|
Сообщение от Algol
Ну от того что goto назвать continue, ведь суть не меняется, не так ли?
суть не меняется, просто читабельность и логичность кода - немного повышается )
Конечно же, я не спорю - goto решает! )
__________________
Bedankt euch dafür bei euch selbst.
H_2(S^3/((z1, z2)~(exp(2pi*i/p)z1, exp(2pi*q*i/p)z2)))=Z/pZ
|
|
|

25.12.2009, 01:15
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от Retimiled
писал как ответ 8)) и он делает то же самое ! Написать екзешник ? 
Пиши
Сообщение от Retimiled
... по поводу смотрибельности мой меньше по кол-ву строк!
"Смотрибельность" не измеряется в количестве строк. Если бы это было так, то фильм "Аватар" (ок 4ГБ) был бы гораздо сложнее для восприятия чем докзательство теоремы Ферма (ок 40 КБ), что явно не так 
|
|
|

25.12.2009, 01:16
|
|
Banned
Регистрация: 24.12.2009
Сообщений: 141
Провел на форуме: 487460
Репутация:
45
|
|
не буду ....  я и так знаю что рабочий
... главное не это ... как то разбирая старый fig-forth заметил что goto там вытворяла НЕЧТО.... дело в том что счетчики for лежали на стеке ... и чтоб выйти по goto форту приходилось такой чисткой и анализом заниматься что КАРАУЛ!
Последний раз редактировалось Retimiled; 25.12.2009 в 01:18..
|
|
|

25.12.2009, 01:18
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от Retimiled
не буду ....  я и так знаю что рабочий
Ну послушай, как код может быть рабочим, если у тебя внутри цикла стоит безусловный return? 
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|