C # - блок написания метода

2

Это общий вопрос о структурных блоках метода. Кто-нибудь имеет мнение о том, что является лучшим способом разработки методов с учетом двух альтернатив ниже?

private void Method1()
{
    if (!A)
    {
        return;
    }

    if (!B)
    {
        return;
    }

    if (!C)
    {
        return;
    }

    // DO WORK.......

    return;
}

private void Method2()
{
    if (A)
    {
        if (B)
        {
            if (C)
            {
                // DO WORK.......

                return;
            }
        }
    }

    return;
}
  • 0
    Стиль войны: готово ... ИДТИ!
  • 0
    Кроме того, вы должны просто сказать «вернуть», а не «вернуть ноль» в части 1.
Теги:
methods
design

10 ответов

10

Я предпочитаю метод 1, подход "раннего выхода". По-моему, это более понятно. И я действительно стараюсь избегать множества вложенных операторов if.

Кроме того, вы не можете вернуть 'null' в метод void:)

  • 0
    да, я только что видел, хе-хе
  • 0
    Вы можете написать код треугольника и просто вызвать вспомогательную функцию, если вы обнаружите, что вложены слишком глубоко. Мое эмпирическое правило: если вы выполняете 6 в одной функции, ваша функция слишком сложна. YMMV.
Показать ещё 1 комментарий
4

Личные предпочтения.

Думаю, я сделал бы это более как это:

if(A && B && C) {
   // Do Work...
   return;
}
  • 1
    Обратите внимание, что ваша реализация не эквивалентна опубликованной, потому что вы не можете сделать что-то, только если A и! B &! C
  • 0
    silky: правда, но у него есть «// Do Work» в определенном месте, плюс я думаю, что суть вопроса больше в стиле, а не в конкретной проблеме.
2

Метод, который начинается с трех операторов if перед любой полезной работой, может иметь неприятный запах кода.

Если ваш метод начинается с строки операторов if, остановитесь на мгновение, повторите фактор, а затем продолжайте.

Возможно, оператор switch был бы лучшим кандидатом, чем строка операторов if.

2

Первый метод является дискуссионным - личное предпочтение иметь несколько условий или один OR.

Однако второй метод плохой, плохой, плохой. Несколько уровней отступов в одном методе просто требуют ошибок - ремонтопригодность и читаемость идут вниз. Это хорошо известно, широко пишутся и документируются.

  • 0
    Что за ошибки?
  • 0
    что бы вы сделали вместо этого, если первый метод является дискуссионным?
Показать ещё 6 комментариев
1

Логика предварительного условия может быть разбросана по отдельности:

private Boolean CanContinue()
{
  return A && B && C;
}

private void Method1()
{
  if (CanContinue())
  {
    // Do work...
  }
}

Это имеет ряд преимуществ:

  • Логика предварительного условия является потенциальным кандидатом для модульного тестирования.
  • Логика может быть повторно использована.
  • Когда логика сложна, я думаю, что ее намного легче понять и поддерживать, если она инкапсулирована в свой собственный метод.
1

Я стараюсь всегда и всегда искать что-то, что выглядит довольно легко:

private void Method1()
{
    if (!A ||
        !B ||
        !C)
    {
        return;
    }
    else if(D)
    {
        return y;
    }

    // DO WORK...

    return X;
}

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

1

Я выйду на конечность и скажу, что это, вероятно, запах кода. Я не думаю, что нужно догматически придерживаться старой философии кодирования "только один выход", но множество точек выхода в методе может быть таким же кошмаром обслуживания, как и глубоко вложенные выражения IF.

Рефакторинговые огни должны быть разбросаны повсюду при просмотре любого из них.

  • 1
    Многие точки выхода в порядке, в настройке преамбулы. Здесь мы удостоверяемся, что у нас достаточно информации, чтобы делать то, что мы делаем. Как только мы пройдем инициализацию, я согласен: многократные возвраты - плохие новости.
  • 0
    @jeffamaphone: Думаю, я склонен больше думать об инициализации с точки зрения проверки аргументов. Контроль может быть нарушен, если будет выдано исключение, но я понимаю, что вы говорите. У меня есть несколько методов, которые делают 4 или 5 проверок, которые могут привести к возникновению исключения, и в этом случае попытка вложить их - это отстой!
1

Вы торгуете вкладками для операторов возврата. Вы делаете звонок.

Лично мне нравится # 2 для С++, где вы имеете дело с автовоспроизводящими объектами (например, CComPtr, AutoPtr и т.д.), но в С# нет необходимости. Я хотел бы использовать первый пример для С#, так как у вас есть сбор мусора, и вы можете меньше беспокоиться о том, чтобы очистить все на ранних выходах.

0

Как насчет:

if(A && B && C)
{
     //Do work
}

return;

или

if(!A || !B || !C)
{
     return;
}

    //Do work
  • 1
    Зачем оборачивать всю свою рутину в дополнительный уровень отступа, если вы можете рано прервать и забыть об этом состоянии?
  • 0
    Иногда то, что вам действительно нужно, это: GetA (), if (! A) {return}, GetB () и т. Д., Поэтому вы не можете просто проверить существование. Между операторами if существуют подразумеваемые вызовы функций. Думаю. В противном случае, да, это обсуждение является спорным, и ваше предложение является лучшим решением.
Показать ещё 1 комментарий
-1

Ну, во-первых, метод void не может вернуть значение, но при условии, что вы возвращаете int?.

private int? method3 ()
{
  int? retVal;
  if (A && B && C)
  {
    // do work
    retVal = x;
  }
  return retVal;
}
  • 1
    Вы можете использовать ключевое слово return в методах void для немедленного возврата.
  • 0
    Я знаю это. В пустом методе вы не можете вернуть значение. Этот вопрос был изначально задан с возвращаемым значением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню