Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Стереотипы: goto (https://forum.antichat.xyz/showthread.php?t=165949)

Algol 25.12.2009 00:46

Стереотипы: 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;
            }
        }


Retimiled 25.12.2009 00:59

Код:

          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;
            }

:)

desTiny 25.12.2009 01:00

Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
Код:

outer:
for(int i = 0; ....){
  for(int j = 0; ....){
      if(...) continue outer;
      if(...) break outer;
  }
}

но goto удобен, когда проще написать его, чем переконопачивать весь код

Algol 25.12.2009 01:03

Цитата:

Сообщение от 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;

            }

:)

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

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

Algol 25.12.2009 01:05

Цитата:

Сообщение от desTiny
Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
Код:

outer:
for(int i = 0; ....){
  for(int j = 0; ....){
      if(...) continue outer;
      if(...) break outer;
  }
}

но goto удобен, когда проще написать его, чем переконопачивать весь код

Ну от того что goto назвать continue, ведь суть не меняется, не так ли?

Retimiled 25.12.2009 01:06

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

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

desTiny 25.12.2009 01:08

Цитата:

Сообщение от Algol
Ну от того что goto назвать continue, ведь суть не меняется, не так ли?

суть не меняется, просто читабельность и логичность кода - немного повышается )
Конечно же, я не спорю - goto решает! )

Algol 25.12.2009 01:15

Цитата:

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

Пиши :D

Цитата:

Сообщение от Retimiled
... по поводу смотрибельности мой меньше по кол-ву строк!

"Смотрибельность" не измеряется в количестве строк. Если бы это было так, то фильм "Аватар" (ок 4ГБ) был бы гораздо сложнее для восприятия чем докзательство теоремы Ферма (ок 40 КБ), что явно не так :)

Retimiled 25.12.2009 01:16

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


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

Algol 25.12.2009 01:18

Цитата:

Сообщение от Retimiled
не буду .... :p я и так знаю что рабочий

Ну послушай, как код может быть рабочим, если у тебя внутри цикла стоит безусловный return? :D


Время: 15:32