2010-04-07 4 views
5

Ich habe eine ziemlich lange switch-case-Anweisung. Einige der Fälle sind wirklich kurz und trivial. Einige sind länger und einige Variablen benötigen, die nie irgendwo anders verwendet werden, wie folgt aus:Ist es eine gute Idee, eine Variable in einem lokalen Block für einen Fall einer switch-Anweisung zu definieren?

switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: { 
     int specialVariable = 5; 
     // Do something complex with specialVariable 
     } break; 
} 

Die Alternative, dass die Variable deklarieren würde, bevor sie in die switch wie dies geht:

int specialVariable = 5; 
switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: 
     // Do something complex with specialVariable 
     break; 
} 

Dies kann eher verwirrend, da nicht klar ist, zu welcher case die Variable gehört und welche unnötigen Speicher verbraucht.

Allerdings habe ich diese Verwendung nirgendwo anders gesehen.
Denken Sie, es ist eine gute Idee, Variablen lokal in einem Block für eine einzige case zu deklarieren?

Antwort

11

Wenn specialVariable nicht nach dem Schaltblock verwendet wird, deklarieren Sie es im Block "case".

Im Allgemeinen sollten Variablen im kleinstmöglichen Gültigkeitsbereich deklariert werden.

+0

Ist jeder Fall ein Bereich? Ich frage, weil ein Fall an sich keinen Sinn hat ohne einen Schalter, sicher? – gbn

+4

@gbn - ein 'case' erstellt selbst keinen neuen Bereich.Der Code müsste '{}' hinzufügen, um einen neuen Bereich einzuführen (wie das OP in seinem ersten Beispiel tut). –

+0

Ja, Sie müssen einen "Geltungsbereich" erstellen, wenn Sie die Variable in der Schreibweise verwenden wollen (Wortspiel), in der die Variable nur in diesem Fall verwendet wird. – Max

3

Ja Variablen im engsten Bereich definieren.

So wird Beispiel 1 bevorzugt.

1

Vereinbaren Sie mit Max - kleinstmöglichen Umfang wie möglich. Auf diese Weise muss sich die nächste Person nicht darum kümmern, wenn die nächste Person sie aktualisieren muss, wenn die Variable in anderen Abschnitten der switch-Anweisung verwendet wird.

3

Wenn die switch Anweisung unübersichtlich wird, möchten Sie möglicherweise in eine Tabelle von Funktionszeigern konvertieren. Indem Sie den Code für jeden Fall in separaten Funktionen haben, müssen Sie sich nicht um Variablendeklarationen und Definitionen kümmern.

Ein weiterer Vorteil ist, dass Sie jede case Funktion in eine separate Übersetzungseinheit setzen können. Dies beschleunigt den Build-Prozess, indem nur die case s kompiliert werden, die sich geändert haben. Verbessert die Qualität, indem Änderungen in ihrem kleinsten Umfang isoliert werden.

1

Meine eigene Regel für Switch-Anweisungen ist, dass es in jedem Fall maximal eine einzelne Anweisung geben sollte, mit Ausnahme einer Pause. Dies bedeutet, dass die Anweisung entweder eine Initialisierung, eine Zuweisung oder ein Funktionsaufruf ist. Einen komplexeren Code in einen Fall zu schreiben, ist ein Rezept für ein Desaster - ich "erinnere mich" liebevoll an den ganzen Windows-Code, den ich gesehen habe (inspiriert von Petzold), der Message-Parameter inline in demselben Fall einer Windows-Prozedur verarbeitete.

Also rufen Sie eine Funktion auf, und setzen Sie die Variable dort hinein!

2

Ich bin für

case X: 
    { 
     type var; 
     ...; 
    } 
    break; // I like to keep breaks outside of the blocks if I can 

Wenn die Sachen drin zu kompliziert wird und beginnt in der Art und Weise Ihrer Fähigkeit, immer den gesamten Switch/Fall als Schalter/Fall sehen dann so viel Erwägung ziehen Wie Sie können in eine oder zwei Inline-Funktionen, die durch die Fälle Code aufgerufen werden. Dies kann die Lesbarkeit verbessern, ohne den Funktionsaufruf-Overhead dort hin zu werfen.

Verwandte Themen