Стиль если: вкладывать или не вкладывать - PullRequest
7 голосов
/ 26 мая 2010

Мой коллега и я обсудили следующий вопрос передового опыта.
Большинство функций / методов начинаются с проверки некоторых параметров.

Я защищаю следующий стиль, который избегает вложения.

if (parameter one is ugly) return ERROR;
if (parameter two is nonsense || it is raining) return ERROR;
// do the useful stuff
return result;

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

if (parameter one is ok) {
   if (parameter two is ok && the sun is shining) {
      // do the useful stuff
      return result
   }
}
return ERROR;

Какой из них вы бы предпочли и почему?

Ответы [ 9 ]

12 голосов
/ 26 мая 2010

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

Полагаю, это некое разделение проблем на микроуровне.

5 голосов
/ 26 мая 2010

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

2 голосов
/ 26 мая 2010

В случае двух проверок, в любом случае, все нормально, как только вы добавляете больше, вариант 1 быстро становится все более и более желательным!

1 голос
/ 26 мая 2010

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

0 голосов
/ 26 мая 2010

Наш внутренний стиль состоит в том, чтобы избежать нескольких return баллов, а также ограничить количество вложений, поэтому я, вероятно, объединил бы ваши проверки работоспособности перед условием и сделал бы что-то вроде:

result_t result = OKAY;    

// Sanity checks
if ((parameter_one == ugly) || (parameter_two == nonsense) || (weather == raining))
{
    result = ERROR; 
}
else
{
    // do the useful stuff 
}

return result; 
0 голосов
/ 26 мая 2010

На мой взгляд, это зависит только от того, какой тип проверки ошибок вам необходим.
Если, например, параметр один равен ugly, но в следующем коде вы можете изменить его состояние на pretty, то предпочтительнее использовать второй метод.
Однако, если ошибка роковая и не может быть обработана, вы должны немедленно вернуться.
Здесь есть третий вариант, где второй стиль подходит больше всего, и это когда вы хотите собрать все ошибки в одно связное сообщение об ошибке.
Второй стиль должен проверять не на достоверность, а на недействительность.
Что касается личных предпочтений, я был бы намного счастливее с первым стилем.

0 голосов
/ 26 мая 2010

Самый читаемый стиль:

if (parameter one is ok) 
{
   if (parameter two is ok && the sun is shining) 
   {
      // do the useful stuff
      return result
   }
   else
   {
      // do other things
   }
}
return ERROR;

По крайней мере, для меня:)

РЕДАКТИРОВАТЬ: Извините, неправильно понял вопрос. Я голосую за первое, не люблю глубокое вложение.

0 голосов
/ 26 мая 2010

Я предпочитаю первое. 5298529357 уровни отступов просто терзают мне нервы.

Добавьте к этому тот факт, что, когда вы сразу же возвращаетесь, становится очевидным, что (параметр один уродлив) - ошибка

0 голосов
/ 26 мая 2010

Второй, который я предпочел бы обычно, , если , то все тело функции будет заключено в число X операторов if. Если это так, я бы выбрал первый вариант.

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