C # - метод записи блоков - PullRequest
       5

C # - метод записи блоков

2 голосов
/ 25 августа 2009

это общий вопрос относительно блочных структур методов. У кого-нибудь есть мнение о том, что является лучшим способом разработки методов, учитывая 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;
}

Ответы [ 10 ]

10 голосов
/ 25 августа 2009

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

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

4 голосов
/ 25 августа 2009

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

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

if(A && B && C) {
   // Do Work...
   return;
}
2 голосов
/ 25 августа 2009

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

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

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

2 голосов
/ 25 августа 2009

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

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

1 голос
/ 25 августа 2009

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

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

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

Это имеет несколько преимуществ:

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

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

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

    // DO WORK...

    return X;
}

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

1 голос
/ 25 августа 2009

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

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

1 голос
/ 25 августа 2009

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

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

0 голосов
/ 25 августа 2009

А как же:

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

return;

или

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

    //Do work
0 голосов
/ 25 августа 2009

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

private int? method3 ()
{
  int? retVal;
  if (A && B && C)
  {
    // do work
    retVal = x;
  }
  return retVal;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...