2010-01-25 16 views
5

Ok - ja mam kogoś pracować który napisał somthing jak tenIle kombinacji W tej instrukcji jeśli

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

I dont like this !!

Jeśli istnieje dziesięć różnych flag binarnych, ile jest ich kombinacji?

10 silni?

Próbuję wyjaśnić, dlaczego to jest złe

+0

jestem zainteresowany jak byłaby ten kod ... –

+0

nie widzę dlaczego to jest złe, może to być najlepszy sposób rozwiązania problemu, nad którym pracuje – harryovers

+0

. Będzie taka sama liczba flag i kombinacji, bez względu na to, jak zorganizujesz swoje "jeśli". – Kobi

Odpowiedz

2

Dwa stany na flagi i 10 flagi oznacza 2^10 = 1024

3

2 w 10. stopniu = 1024

Próbuję wyjaśnić, dlaczego to jest złe

To niekoniecznie musi być zły . Każdy warunek odcina połowę przypadków. Jeśli wiesz, że musisz zrobić coś tylko wtedy, gdy pierwszy warunek jest prawdziwy, upuściłeś już 512 przypadków. To jest punkt tych czeków.

Można jednak przerobić go lepiej wyglądające i bardziej czytelne:

if(c1 && c2 && c3 && c4 && c5) 
+0

To znaczy 2 ** 10 lub 1024. –

+0

@Ignacio: Masz na myśli 2^10. ;) – Bobby

+2

@Bobby: Inteligentni programiści wiedzą, że 2^10 równa się 8; P –

1

Większość dobrych statyczne analizatory kodowe mają maksymalny poziom wcięcia z tego powodu. Bardzo trudno jest obsłużyć wszystkie logiczne przypadki z tak wysokim poziomem zagnieżdżania.

Czy jest to typowy błąd początkującego sprawdzenia wszystkich błędów w jednej dużej bryle u góry funkcji?

Jeśli tak, możesz chcieć, aby autor kodu zmienił go na ciąg instrukcji if, a nie na silnie zagnieżdżoną konstrukcję.

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

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

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

... 

sprawia, że ​​znacznie łatwiej przetestować kod, a także w celu zapewnienia konkretnych informacji na temat konkretnego błędu zamiast jednego „coś jest złe” oświadczenie generycznych.

+0

Ułatwia refactor, jeśli istnieje wiele oświadczeń zwrotnych ... – cjk

+0

@ck, W ogóle, jeśli zamiar instrukcji return jest jasne, jak w sześciu zwrotów w funkcji. Pięć u góry dla poszczególnych przypadków błędów i jedna na dole dla dobrego wyniku. Jednakże, mając instrukcje zwrotne, które zostały przekierowane dookoła funkcji zwracającej różne rzeczy * to * zdecydowanie jest trudny do naprawienia! –

0

najwyżej 2^10 = 1024 ścieżki (osiągnięte zostanie maksimum, gdy warunki są całkowicie niezależne)

uwzględniając wiele ścieżek w jednej metody nazywane o wysokiej złożoności. Tak duża złożoność wpływa na łatwość utrzymania i na testowalność. Oczywiście złożone metody są bardziej podatne na błędy i trudniejsze do testowania i konserwacji.

Złożoność niekoniecznie stanowi problem: niektóre rozwiązania problemów mają nieodłączną złożoność, której nie można usunąć. Innymi słowy, niektóre problemy są zdecydowanie trudne do znalezienia. W tych przypadkach można zmniejszyć lokalną złożoność, dzieląc złożone metody na mniejsze (nie zmniejsza to oczywiście ogólnej złożoności).

W pozostałych przypadkach usunąć dodatkową złożoność: znaleźć prostsze rozwiązanie (łatwo powiedzieć, wiem) ;-)

Powiązane problemy