Стереотипы: goto

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Algol, 24 Dec 2009.

  1. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Недавно один мой знакомый был повергнут в шок, увидев в моем коде оператор 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;
                }
            }
     
  2. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    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;
                }
    
    
    :)
     
    #2 Retimiled, 24 Dec 2009
    Last edited: 25 Dec 2009
    1 person likes this.
  3. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Несмотря на всю мою ненависть к яве, в ней для таких случаев предусмотрены
    Code:
    outer:
    for(int i = 0; ....){
       for(int j = 0; ....){
          if(...) continue outer;
          if(...) break outer;
       }
    }
    
    но goto удобен, когда проще написать его, чем переконопачивать весь код
     
  4. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Эээ.... ну ваще-то этот код не эквивалентен приведенному, и вообще не рабочий. Будьте внимательней )

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

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ну от того что goto назвать continue, ведь суть не меняется, не так ли?
     
  6. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    писал как ответ 8)) и он делает то же самое ! Написать екзешник ? :D

    ... по поводу смотрибельности мой меньше по кол-ву строк! И уж естественно он рабочий 8)))))))))
     
    #6 Retimiled, 25 Dec 2009
    Last edited: 25 Dec 2009
  7. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    суть не меняется, просто читабельность и логичность кода - немного повышается )
    Конечно же, я не спорю - goto решает! )
     
  8. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Пиши :D

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

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    не буду .... :p я и так знаю что рабочий


    ... главное не это ... как то разбирая старый fig-forth заметил что goto там вытворяла НЕЧТО.... дело в том что счетчики for лежали на стеке ... и чтоб выйти по goto форту приходилось такой чисткой и анализом заниматься что КАРАУЛ!
     
    #9 Retimiled, 25 Dec 2009
    Last edited: 25 Dec 2009
  10. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ну послушай, как код может быть рабочим, если у тебя внутри цикла стоит безусловный return? :D
     
  11. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    по-моему, довольно очевидная вещь
    было у Криса в трюках
     
  12. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    он стоит в цикле foreach ... как и у тебя .... присмотрись
     
  13. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Да нет, не как у меня, присмотрись лучше ты :D
     
  14. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Не очень понятное замечание.
    Кто такой Крис, и какая именно вещь очевидна ?
     
  15. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    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;
    
                }
    
    
     
  16. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    К счастью, в C# таких проблем нет :)
    В общем случае неуправляемых языков - конечно я согласен, что goto может привести к очень плохим последствиям.
     
  17. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    ну согласен ... но постоянно в мозгу а КАК ТАМ НА СТЕКЕ 8)))))))))))))

    .... стекофобия 8)))
     
  18. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ты все же напиши экзешник :)
    Трассировка нас рассудит :D
     
  19. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    кстати return - это тот же goto только в фас!
     
  20. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    я имел в виду, что для большинства ясно, что иногда goto очень даже полезен
    крис касперски. вспомнил его, так как пример уж больно похож :) а вообще хотелось бы побольше подобных заметок со всякими тонкостями