Стереотипы: 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
    Ну не скажи. Во-первых кроме return тут большая компания: continue, break, throw... А во-вторых для этих операторов не требуется метка, точка выхода для них - более очевидна, чем для goto. Поэтому они считаются более-менее "структурными".

    ЗЫ
    Да и еще yield, как же ж без него, родимого, структурного нашего....
     
    #21 Algol, 25 Dec 2009
    Last edited: 25 Dec 2009
  2. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    :D да goto приближает нас к низкоуровневому программированию ... ведь никто не пытается сказать ничего против джампов в ассемблере

    ... и поскольку у Си С++ положение аморфное .... то GOTO живет там как засланец мышыных кодов!


    давненько было помню как z0mbie в своей теории недектируемости вируса (делал попытки на Goto выстроить матрицу исполнения, которая по его мнению могла завести любую эвристику в ступор) ... делал он именно на GOTO ... :p поэтому GOTO живет и будет жить ...

    НО Я ГОВОРЮ НЕ О ВЕЩАХ УПРОЩАЮЩИХ ПОНИМАНИЕ, а наоборот 8)))) , вообще вопрос риторический должен ли антивирус понимать код вируса!
     
    #22 Retimiled, 25 Dec 2009
    Last edited: 25 Dec 2009
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Code:
            public TcpClient Connect(IPEndPoint host)
            {
                TcpClient client = new TcpClient();
                for(int maxTryCount = 5; maxTryCount; maxTryCount--) {
                    try
                    {
                        client.Connect(host);
                        return client;
                    }
                    catch (SocketException) {}
                }
                throw;
            }
     
  4. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я иногда использую goto что бы неплодить ненужных вложенных циклов.
     
  5. Huster

    Huster Member

    Joined:
    8 May 2009
    Messages:
    42
    Likes Received:
    18
    Reputations:
    0
    Да, и в книгах об этом пишут, а ты не думал почему ? Может быть потому что многолетний опыт подсказывает что и правда лучше отказаться от goto ? Если бы было все так просто, то не создавали б другие циклы ( do..while, for, whlie )
    Да, может быть именно в твоей ситуации goto и смотрится лучше, но в других случаях, как правило, это лишь усложняет программу, особенно если ее пишут "неопытные" программисты, которые скачут с goto по программе вдоль и поперек.
    Поэтому, используй goto только тогда когда это НЕ ЗАПУТАЕТ код программы. Во :)
     
  6. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    циклы могут выходить стандартными средствами не делая скачков и не делая ненужных проходов.... просто обычно люди сравнение в for(....;X<Y;....) делают одно а досточно описать флаг выхода и вы выйдите из любого количества циклов без лишних проходов.... for(....,ex=0;X<Y && ex==0;....)
    Code:
    for(....,ex=0;X<Y && ex==0;....)
       for(....;K<L && ex==0;....)
         for(....;M<N && ex==0;....)
             ....
               for(....;F<G && ex==0;....)
                 if(BLABLA==TUTU)
                     ex=1;
    
    
     
  7. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    throw чего ?
     
  8. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Retimiled, вообще то глубокой вложенности нужно избегать - с помощью выделения кода в методы\функции, ибо глубоко вложенные циклы нечитабельное говно с любой стороны - что с goto, что с флагами, что с break/continue.
     
    1 person likes this.
  9. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    2 Ra$cal
    да .... если не заботишься об быстродействии и не отсчитываешь такты на PUSHA POPA , то конечно нужно оформлять в виде функций а как ты растащишь вот такой код
    Code:
    for(....,ex=0;X<Y && ex<10;....)
       for(....;K<L && ex<9;....)
         for(....;M<N && ex<8;....)
             ....
               for(....;F<G && ex<1;....)
                 if(BLABLA==TUTU)
                     ex=8; //  то есть я могу уйти в рамках цикла на люой уровень вложенности 8))
    
     
  10. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    В перле goto как будто медленнее работает, чем, например, redo.
     
    _________________________
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    А хз ) Синтаксиса не помню уже ) Но там переписать не сложно без goto с меньшими затратами =)
    Не дотнетчик я - импровизировал )
     
  12. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ну не знаю, мне например в голову не приходит как там переписать без goto с меньшими затратами :)
     
  13. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    В целом да, так и есть. Но опять же есть специфические случаи, когда это очень геморно. В основном из-за того что нужно передавать кучу параметров в такую функцию. Да и семантика такой функции не всегда понятна (К примеру, при перемножении матриц нужно делать три вложенных цикла, если два из них вынести в функцию, то как назвать такую функцию? func1() ? :) ).
     
  14. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Я бы вынес проверку одной матрицы на наличие нуля в отдельную функцию и делал бы return true если бы встретился хотя бы один ноль. А общий цикл оформил бы примерно так (псевдокод):

    Code:
    
    public boolean checkMatrix(Matrix m) {
     for(List list: m) {
      if(!checkForZeroValue(list))
        return false;
     }
     return true;
    }
    
    private boolean checkForZeroValue(List list) {
     for(Item i: list)
        if(встретился_ноль) return true;
    
     return false;
    }
    
    Читабельность имхо выше, чем всякие разные метки искать. Ну а в целом, я иногда использую continue; но никогда не приходилось использовать goto.
     
    #34 Qwazar, 25 Dec 2009
    Last edited: 25 Dec 2009
  15. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90
    помню-помню когда-то в школе использовал его) но это была только одна задача) а прошло уже много лет)
    п.с. о вкусах не спорят) если тебе так удобнее почемубы и нет) в бою все средства...
     
  16. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    В данном случае о вкусах спорят, т.к.:
    1) Этот код будет разбирать не только автор
    2) Возможно даже через несколько лет.
     
  17. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Псевдокод это конечно хоршо и кошерно, но реальные программы пишутся не на псевдокоде.
    Я же привожу конкретные примеры, в котором метка - самое простое и наглядное решение.
    Странно, у меня continue чуть ли не в каждом втором цикле.

    Но в целом точка зрения ясна.
     
  18. Qwazar

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

    Joined:
    2 Jun 2005
    Messages:
    989
    Likes Received:
    904
    Reputations:
    587
    Моё решение более наглядно, не запутаешься во вложенных циклах, и не придётся смотреть по коду, где находится метка, на которую ты скачешь. Да и псевдокод очень даже приближен к реальности :)
     
  19. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Увидев первый сурс я тоже был повергнут в шок :(
     
  20. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ээ... Ну это понятно, а что-то по обсуждаемой теме есть :confused: