Это общий вопрос о структурных блоках метода. Кто-нибудь имеет мнение о том, что является лучшим способом разработки методов с учетом двух альтернатив ниже?
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;
}
Я предпочитаю метод 1, подход "раннего выхода". По-моему, это более понятно. И я действительно стараюсь избегать множества вложенных операторов if.
Кроме того, вы не можете вернуть 'null' в метод void:)
Личные предпочтения.
Думаю, я сделал бы это более как это:
if(A && B && C) {
// Do Work...
return;
}
Метод, который начинается с трех операторов if перед любой полезной работой, может иметь неприятный запах кода.
Если ваш метод начинается с строки операторов if, остановитесь на мгновение, повторите фактор, а затем продолжайте.
Возможно, оператор switch
был бы лучшим кандидатом, чем строка операторов if.
Первый метод является дискуссионным - личное предпочтение иметь несколько условий или один OR.
Однако второй метод плохой, плохой, плохой. Несколько уровней отступов в одном методе просто требуют ошибок - ремонтопригодность и читаемость идут вниз. Это хорошо известно, широко пишутся и документируются.
Логика предварительного условия может быть разбросана по отдельности:
private Boolean CanContinue()
{
return A && B && C;
}
private void Method1()
{
if (CanContinue())
{
// Do work...
}
}
Это имеет ряд преимуществ:
Я стараюсь всегда и всегда искать что-то, что выглядит довольно легко:
private void Method1()
{
if (!A ||
!B ||
!C)
{
return;
}
else if(D)
{
return y;
}
// DO WORK...
return X;
}
но поскольку другие упоминали об этом полностью личный префикс, если ваше рабочее место не указывает один стандарт выше других.
Я выйду на конечность и скажу, что это, вероятно, запах кода. Я не думаю, что нужно догматически придерживаться старой философии кодирования "только один выход", но множество точек выхода в методе может быть таким же кошмаром обслуживания, как и глубоко вложенные выражения IF.
Рефакторинговые огни должны быть разбросаны повсюду при просмотре любого из них.
Вы торгуете вкладками для операторов возврата. Вы делаете звонок.
Лично мне нравится # 2 для С++, где вы имеете дело с автовоспроизводящими объектами (например, CComPtr, AutoPtr и т.д.), но в С# нет необходимости. Я хотел бы использовать первый пример для С#, так как у вас есть сбор мусора, и вы можете меньше беспокоиться о том, чтобы очистить все на ранних выходах.
Как насчет:
if(A && B && C)
{
//Do work
}
return;
или
if(!A || !B || !C)
{
return;
}
//Do work
Ну, во-первых, метод void не может вернуть значение, но при условии, что вы возвращаете int?.
private int? method3 ()
{
int? retVal;
if (A && B && C)
{
// do work
retVal = x;
}
return retVal;
}