Заявления и альтернативы GoTo в VB.NET - PullRequest
9 голосов
/ 23 апреля 2010

Я разместил фрагмент кода на другом форуме с просьбой о помощи, и люди указали мне, что использование GoTo операторов - очень плохая практика программирования. Мне интересно: почему это плохо?

Какие альтернативы GoTo можно использовать в VB.NET, что, как правило, считается более эффективной практикой?

Рассмотрите этот фрагмент ниже, где пользователь должен ввести свою дату рождения. Если месяц / дата / год недействительны или нереальны, я хотел бы вернуться назад и спросить пользователя снова. (Я использую операторы if, чтобы проверить размер целого числа ... если есть лучший способ сделать это, я был бы признателен, если бы вы также сказали мне это: D)

retryday:
    Console.WriteLine("Please enter the day you were born : ")
    day = Console.ReadLine
    If day > 31 Or day < 1 Then
        Console.WriteLine("Please enter a valid day")
        GoTo retryday
    End If

Ответы [ 14 ]

0 голосов
/ 24 апреля 2010

Ваш код в порядке. Это сжато и понятно. Это лучше, чем надувать работу на 50–200% с помощью дополнительных переменных и разных глаголов, которые делают одно и то же.

Если вы просто переходите назад или вперед к началу или концу логического блока, то переходите к нему. «Цикл» или «Конец времени» - это все еще переход, но подразумевается назначение. Единственное преимущество заключается в том, что компилятор не даст вам пересечь две петли, но это невозможно с парой gotos. При использовании goto's не пересекать потоки. Это было бы плохо. - Доктор Шпенглер

Моя другая любимая мозоль - это правило "один вход, один выход". Конечно, у вас может быть только один вход, если вы не пишете на ассемблере. Но правило «одного выхода» глупо. Это просто приводит к куче проверок вложенных границ, которые убирают ваш код с правильного поля. Гораздо понятнее проверить все ваши параметры в начале процедуры и «выйти из подпрограммы», если они недопустимы. Что имеет больше смысла?

if badparam then
  log error
  exit sub
  endif

if badparam2 then
  log error2
  exit sub
  endif

do stuff

или это?

if goodparam then
  if goodparam2 then
    do stuff
  else
    log error2
    endif
else
  log error 
  endif 

Когда у вас есть шесть проверок границ и «материал» - это 60 строк, которые вы не можете разбить на более мелкие части, тогда второй путь превращается в кошмар для тех, кто должен его поддерживать. Лучше закончить то, что вы делали - проверять исключения - чем откладывать всю обработку исключений до конца.

Мои $ 0,02

0 голосов
/ 23 апреля 2010

Часто рекомендуется, чтобы мы следовали советам Дейкстры в Заявлении о намерениях, которое считается вредным.

Дональд Кнут ответил Дейкстре довольно добротно. Этот пример здесь является современной версией одного из его контрпримеров. Лично я пишу бесконечные циклы с внутренними перерывами, когда сталкиваюсь с этим, но есть несколько других редких случаев, когда я буду писать операторы GOTO.

Наиболее распространенными для меня являются разрывы глубоко вложенных циклов и такой шаблон:

ContinueTry:
   Try
        'Worker code
   Catch ex as IO.IOException
        If MessageBox.Show(...) = DialogResult.Retry Then Goto ContinueTry
        Throw
   End Try

У меня также есть два случая больших конечных автоматов с операторами goto, обеспечивающими переходы.

0 голосов
/ 23 апреля 2010

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

См., Как обычно предлагается, заявление Дейкстры о Перейти к мнению, считается вредным

0 голосов
/ 23 апреля 2010
While True
    Console.WriteLine("Please enter the day you were born : ")
    day = Console.ReadLine
    If day > 31 Or day < 1 Then
        Console.WriteLine("Please enter a valid day")
        Continue
    Else
        Break
    End If
End While
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...