Это хорошее использование заявления goto? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть фрагмент кода на C #, в котором я использую оператор goto.Это правильное использование оператора goto или есть лучшее альтернативное решение?

bool IsValid(TestObject aObject)
{
   bool aRetVal = false;

   if(condition here)
       goto exit;
   if(condition here)
       goto exit;
   if(condition here)
       goto exit;

   aRetVal = true;
   exit:
   return aRetVal;
}

Причина, по которой я это делаю, заключается в том, что я не хочу нескольких точек выхода в моем методе.

Ответы [ 7 ]

8 голосов
/ 18 ноября 2011

Нет - используйте return вместо. Зачем заставлять того, кто читает ваш код, переходить к точке выхода и , а затем возвращаться? Вы знаете все, что вам нужно сделать на данный момент, поэтому самое ясное решение - вернуться, ИМО.

Идея «не иметь несколько точек выхода» была уместна в языках, где вам нужно было бы выполнять такие вещи, как очистка при выходе из функции, но между сборкой мусора и finally блоками она бессмысленна и контрпродуктивна в C #.

Что вы хотите сделать, если условие выполнено? Вернитесь из метода. Так что сделайте так, чтобы ваш код говорил это. Везде, где вы можете заставить код сказать именно то, что вы имеете в виду , это хорошо. Не усложняй, чем нужно.

Я предполагаю, что ваша реальная ситуация более сложна, чем , просто эти условия, в противном случае я бы использовал что-то вроде ответа Марсело, но, вероятно, записал как:

return !(condition1 || condition2 || condition3);
3 голосов
/ 18 ноября 2011

Нет. Просто напишите это:

return !(<condition 1> || <condition 2> || <condition 3>);
2 голосов
/ 18 ноября 2011

Гото это плохо!Это неструктурированное программирование.Почему они держали его в C #, для меня загадка ... Вы можете прекрасно обходиться без goto.

bool IsValid(TestObject aObject)
{
   return ((condition here) || (condition here) || (condition here));
}

Лучше, нет?

2 голосов
/ 18 ноября 2011

Я не хочу, чтобы в моей функции было несколько точек выхода.

Пожалуйста, объясните, почему нет.

Это не очень хорошее применение goto. Его легко обойти:

bool IsValid(TestObject aObject)
{
    bool aRetVal = false;

    if(condition here)
    {
        //don't goto exit; do other work instead
    }
    else if(condition here)
    {
        // don't goto exit; do other work instead
    }else if(condition here)
    {
        // don't goto exit; do other work instead
    }
    else
    {
        aRetVal = true;
    }

   return aRetVal;
}

Или, если вам не нужно выполнять другую работу, когда ваши совпадения совпадают, вы можете легко сделать следующее:

bool IsValid(TestObject aObject)
{
   return !((condition1 here) || (condition2 here) || (condition3 here));
}
0 голосов
/ 18 ноября 2011

В вашем конкретном случае goto не уточняет код. Когда я читаю код, я должен прочитать условие, найти метку goto и прочитать код под меткой. Это большая работа, и читатель быстро устает и делает ошибки.

Когда я пишу код, я стараюсь иметь в виду, что он будет прочитан больше, чем написан. Я стараюсь заботиться о своих любимых читателях: я думаю KISS (Keep It Simple, Supid) и борюсь со сложностью.

В книге Code Complete есть статья об использовании GOTO . Это может стоить чтения.

0 голосов
/ 18 ноября 2011

Я бы предпочел сделать это:

bool IsValid(TestObject aObject)
{
   bool aRetVal = true;

   if(aRetVal && condition here)
       aRetVal = false;

   if(aRetVal && condition here)
       aRetVal = false;

   if(aRetVal && condition here)
       aRetVal = false;

   return aRetVal;
}

Или просто вернуть false;, как предлагали другие.

0 голосов
/ 18 ноября 2011

Нет, это не очень хорошее использование goto, и в этом нет необходимости. Как насчет этого вместо этого?

bool IsValid(TestObject aObject)
{
    if (condition here)
        return false;

    if (condition here)
        return false;

    if (condition here)
        return false;

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