2010-01-25 6 views
5

Ok - ich habe jemanden, den ich mit, die arbeiten somthing wie dieseWie viele Kombinationen in diesem Wenn Statement

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

geschrieben hat ich so nicht !!

Wenn es zehn verschiedene boolesche Flags gibt, wie viele Kombinationen gibt es?

10 Fakultät?

ich zu erklären versuchen, warum dies schlecht ist

+0

ich bin daran interessiert, wie Sie diesen Code Refactoring ... –

+0

ich sehe nicht, warum Das ist schlecht, es könnte sehr gut der beste Weg sein, das Problem zu lösen, an dem er/sie arbeitet. – harryovers

+0

Es wird die gleiche Anzahl von Flaggen und Kombinationen geben, egal wie Sie Ihre 'if's arrangieren. – Kobi

Antwort

2

Zwei Staaten pro Flag und 10 Flaggen bedeutet 2^10 = 1024

3

2 in dem 10. Grad = 1024

Ich versuche zu erklären, warum dies schlecht ist

Das ist nicht unbedingt schlecht sein kann . Jede Bedingung schneidet die Hälfte der Fälle ab. Wenn Sie wissen, dass Sie nur etwas tun müssen, wenn die erste Bedingung zutrifft, löschen Sie bereits 512 Fälle. Das ist der Sinn dieser Kontrollen.

Sie können es jedoch umschreiben, besser zu sein suchen und besser lesbar:

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

Das heißt, 2 ** 10 oder 1024. –

+0

@Ignacio: Sie meinen 2^10. ;) – Bobby

+2

@Bobby: Smart Programmierer wissen, dass 2^10 gleich 8; P –

1

Die meisten guten statischen Code-Analysatoren haben einen maximalen Pegel der Einrückung aus genau diesem Grund. Es wird sehr schwierig, alle logischen Fälle mit solch hohen Verschachtelungsebenen zu behandeln.

Ist das der typische Newbie-Fehler beim Überprüfen aller Fehlerzustände in einem großen Knoten an der Spitze einer Funktion?

Wenn dies der Fall ist, möchten Sie vielleicht den Autor des Codes dazu bringen, ihn in eine Folge von if-Anweisungen anstatt dieses stark verschachtelten Konstrukts zu ändern.

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

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

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

... 

macht es viel einfacher, den Code zu testen und auch eher als eine generisch „schlecht ist etwas“ maßgeschneiderte Informationen zu einem bestimmten Fehler zu liefern Aussage.

+0

macht es schwieriger zu refaktorieren, wenn es mehrere Return-Anweisungen gibt ... – cjk

+0

@ck, Überhaupt nicht, wenn die Absicht der Rückgabeanweisungen klar ist, wie in sechs Return-Anweisungen in einer Funktion. Fünf oben für einzelne Fehlerfälle und einer unten für ein gutes Ergebnis. Aber Rückmeldungen gibt es überall um eine Funktion, die verschiedene Dinge zurückgibt * ist * definitiv ein Schmerz zu refactor! –

0

höchstens 2^10 = 1024 Pfade (das Maximum erreicht ist, wenn die Bedingungen vollständig unabhängig sind)

viele Pfade in einem Verfahren zu haben ist eine hohe Komplexität aufweist genannt. Diese hohe Komplexität wirkt sich auf die Wartbarkeit und auf die Testbarkeit aus. Offensichtlich sind komplexe Methoden fehleranfälliger und schwieriger zu testen und zu warten.

Komplexität ist nicht unbedingt ein Problem: Einige Problemlösungen haben eine inhärente Komplexität, die nicht beseitigt werden kann. Mit anderen Worten, einige Probleme haben definitiv Schwierigkeiten, Lösungen zu finden. In diesen Fällen können Sie die lokale Komplexität reduzieren, indem Sie die komplexen Methoden in kleinere aufteilen (dies reduziert die globale Komplexität natürlich nicht).

In den anderen Fällen entfernen Sie die zusätzliche Komplexität: Finden Sie eine einfachere Lösung (leicht zu sagen, ich weiß) ;-)