ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Стереотипы: goto
  #1  
Старый 25.12.2009, 00:46
Аватар для Algol
Algol
Регистрация: 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;
            }
        }
 
Ответить с цитированием

  #2  
Старый 25.12.2009, 00:59
Аватар для Retimiled
Retimiled
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..
 
Ответить с цитированием

  #3  
Старый 25.12.2009, 01:00
Аватар для desTiny
desTiny
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
 
Ответить с цитированием

  #4  
Старый 25.12.2009, 01:03
Аватар для Algol
Algol
Регистрация: 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;

            }
Эээ.... ну ваще-то этот код не эквивалентен приведенному, и вообще не рабочий. Будьте внимательней )

ЗЫ
Да и кстати даже если бы он был рабочий, он явно менее понятный чем исходный
 
Ответить с цитированием

  #5  
Старый 25.12.2009, 01:05
Аватар для Algol
Algol
Регистрация: 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, ведь суть не меняется, не так ли?
 
Ответить с цитированием

  #6  
Старый 25.12.2009, 01:06
Аватар для Retimiled
Retimiled
Banned
Регистрация: 24.12.2009
Сообщений: 141
Провел на форуме:
487460

Репутация: 45
По умолчанию

писал как ответ 8)) и он делает то же самое ! Написать екзешник ?

... по поводу смотрибельности мой меньше по кол-ву строк! И уж естественно он рабочий 8)))))))))

Последний раз редактировалось Retimiled; 25.12.2009 в 01:14..
 
Ответить с цитированием

  #7  
Старый 25.12.2009, 01:08
Аватар для desTiny
desTiny
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
 
Ответить с цитированием

  #8  
Старый 25.12.2009, 01:15
Аватар для Algol
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от Retimiled  
писал как ответ 8)) и он делает то же самое ! Написать екзешник ?
Пиши

Цитата:
Сообщение от Retimiled  
... по поводу смотрибельности мой меньше по кол-ву строк!
"Смотрибельность" не измеряется в количестве строк. Если бы это было так, то фильм "Аватар" (ок 4ГБ) был бы гораздо сложнее для восприятия чем докзательство теоремы Ферма (ок 40 КБ), что явно не так
 
Ответить с цитированием

  #9  
Старый 25.12.2009, 01:16
Аватар для Retimiled
Retimiled
Banned
Регистрация: 24.12.2009
Сообщений: 141
Провел на форуме:
487460

Репутация: 45
По умолчанию

не буду .... я и так знаю что рабочий


... главное не это ... как то разбирая старый fig-forth заметил что goto там вытворяла НЕЧТО.... дело в том что счетчики for лежали на стеке ... и чтоб выйти по goto форту приходилось такой чисткой и анализом заниматься что КАРАУЛ!

Последний раз редактировалось Retimiled; 25.12.2009 в 01:18..
 
Ответить с цитированием

  #10  
Старый 25.12.2009, 01:18
Аватар для Algol
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме:
2050916

Репутация: 0


По умолчанию

Цитата:
Сообщение от Retimiled  
не буду .... я и так знаю что рабочий
Ну послушай, как код может быть рабочим, если у тебя внутри цикла стоит безусловный return?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как настроить две сетки для сервера CyberPank Windows системы 2 16.07.2009 07:55
Bat Micr0b Windows 2 25.04.2006 19:49



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ