Проблемы, которые могут возникнуть при использовании оператора GOTO только для перехода вниз? - PullRequest
0 голосов
/ 08 февраля 2010

Есть ли вред от использования оператора GOTO только для перехода вниз? Или мы в полной безопасности?

Я имею в виду, что это мой код,

Some code ...
...

GOTO whereToJump

Some code ...
...

whereToJump: 

Some code ...

Когда точка whereToJump всегда находится ниже оператора GOTO, есть ли проблемы с безопасностью?

Ответы [ 8 ]

2 голосов
/ 08 февраля 2010

Это тема одной из самых известных статей по информатике. Перейти к заявлению, признанному вредным от Dijkstra. По сути, в нем говорится, что никто никогда не нуждается в goto (я знаю, что, как всегда, есть несколько исключений).

Это 1968, но все еще очень читабельно сегодня.

1 голос
/ 24 февраля 2011

Я использую операторы goto, когда необходимо перетаскивать блок кода из многих мест вниз. Обычно без оператора goto для этого может потребоваться написать другую функцию (чтобы вышеупомянутый блок кода не повторялся в первой функции) и вызывать ее внутри первой. goto не менее эффективен, чем операторы if или switch, поскольку он также использует одно из операторов jumb (jz, jnz и т. д.), которые используются if, switch и т. д.

1 голос
/ 08 февраля 2010

Основная причина, по которой GOTO следует избегать в наши дни, заключается в том, что программисты вообще больше не привыкли к GOTO (и это хорошо). Поэтому, если вы пишете код, который широко использует GOTO, скорее всего, ваши коллеги-программисты с трудом поймут и расширят его.

Хуже того, GOTO здесь и там может привести к синдрому разбитого окна, поскольку коллеги начинают использовать все больше и больше GOTO, пока не останется большая миска спагетти.

xkcd ставит лучше ...

alt text

1 голос
/ 08 февраля 2010

В любом более сложном примере, конечно, если вы можете решить использовать GOTO только для перехода вперед в той же области , вы можете использовать оператор if. (Если это не в той же области, это не просто «прыгать вперед», не так ли?)

(И, конечно, если ваш реальный код не сложнее этого, вы можете просто избавиться от этого второго блока "Some code ...")

1 голос
/ 08 февраля 2010

Имеет смысл, что только нисходящие прыжки создают гораздо меньший потенциал для спагетти-кода. (по моему опыту, 75% головной боли при отладке унаследованного кода на основе GOTO происходит из-за того, что восходящее gotos приводит к хаотичному циклу)

Однако, учитывая, что вы используете только нисходящие переходы, должно быть очень легко конвертировать код, не основанный на goto. Я не уверен, насколько улучшит ваш gotos.

0 голосов
/ 14 июня 2012

С этим комментарием я не поощряю использование GOTO, но просто хочу подчеркнуть, что в некоторых очень специфических случаях это может быть полезно. До сих пор на практике я не видел ни одного кода, который использует операторы goto для перемещения вверх или вниз, но есть один конкретный случай использования, где я считаю goto более читабельным. Вот пример кода, где я думаю, что goto имеет больше смысла.

void fun_test ()
{
    .code..
    allocate dynamic memory.
    acquire_lock();

    //do some action, call api. 
    if (some error) {
       print error;
       free memory;
       unlock();
       return FAIL;
    } else {
        // some code.
    }

    if (some_other error) {
        print error;
        free memory;
        unlock();
        return FAIL;
   }
   :
   :
   // more error condition checks.
   :
   return SUCCESS

}

void fun_test_withgoto ()
{
    error_code rc = SUCCESS;
   .code..
   allocate dynamic memory.
   acquire_lock();

   //do some action, call api.
   if (some error) {
       rc = <Failure id>;
       goto function_cleanup;
   } else {
      // some code.
   }

   if (some_other error) {
      rc = <failure id>;
      goto function_cleanup;      
   }
:
:
// more error conditions.
:

function_cleanup:
    if (rc == SUCCESS) {
        print "Success..";
    } else {
        print "Error : <failure id>";
    }
    free_memory();
    unlock();
    return(rc);
}
0 голосов
/ 08 февраля 2010

Ну, на самом деле проблем нет. Этот код эквивалентен:

Some code ...
...

if (false)
{
Some code ...
...
}

Some code ...

Тем не менее, я бы не стал этого делать. Хорошие варианты использования для goto действительно редки, а другие конструкции управления потоком более идиоматичны в C #.

0 голосов
/ 08 февраля 2010

goto не делает код менее безопасным независимо от того, как вы прыгаете.

Вы структурируете свой код так, как вам нравится. Это ваш код, который решает, является ли код хорошим / плохим. в некоторых случаях может быть уместно (нет, я могу показать пример :-))

Проблема с goto заключается в том, что он может скрыть поток выполнения в программе и привести к путанице в коде. Но если вы создаете легко читаемый / поддерживаемый код, тогда это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...