Сколько комбинаций в этом заявлении If - PullRequest
5 голосов
/ 25 января 2010

Хорошо - у меня есть кто-то, с кем я работаю, и написал что-то вроде этого

if()
   if()
      if()
         if()
         if()

Мне это не нравится !!

Если существует десять различных логических флагов, сколько существует комбинаций?

10 факториал?

Я пытаюсь объяснить, почему это плохо

Ответы [ 4 ]

3 голосов
/ 25 января 2010

2 в 10-й степени = 1024

Я пытаюсь объяснить, почему это плохо

Это не обязательно плохо. Каждое условие отсекает половину случаев. Если вы знаете, что вам нужно что-то сделать только тогда, когда выполняется первое условие, вы уже отбрасываете 512 случаев. В этом смысл этих проверок.

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

if(c1 && c2 && c3 && c4 && c5)
2 голосов
/ 25 января 2010

Два состояния на флаг и 10 флагов означают 2 ^ 10 = 1024

1 голос
/ 25 января 2010

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

Является ли это типичной ошибкой новичка при проверке всех состояний ошибки одним большим комком в верхней части функции?

Если это так, вы можете попросить автора кода изменить его на последовательность операторов if, а не на эту сильно вложенную конструкцию.

if(error1) {
    /* report error 1 and exit */
}

if(error2) {
    /* report error 2 and exit */
}

if(error3) {
    /* report error 3 and exit */
}

...

Упрощает тестирование кода, а также предоставляет специализированную информацию о конкретной ошибке, а не одно общее утверждение "что-то плохое".

0 голосов
/ 25 января 2010

Не более 2 ^ 10 = 1024 путей (максимум достигается, если условия полностью независимы)

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

Сложность не обязательно является проблемой: некоторые решения проблем имеют присущую им сложность, которую нельзя устранить. Другими словами, некоторые проблемы окончательно трудно найти решения. В этих случаях вы можете уменьшить локальную сложность, разделив сложные методы на более мелкие (очевидно, это не уменьшает глобальную сложность).

В остальных случаях снимите дополнительную сложность: найдите более простое решение (легко сказать, я знаю); -)

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