Was ist eine Standardbezeichnung eines Switches?

8

Sagen wir, ich habe eine Aufzählung.

%Vor%

und später habe ich eine Funktion wie folgt:

%Vor%

Obwohl die Standardbeschriftung niemals ausgeführt werden sollte, möchte ich die möglichen Fehler berücksichtigen, die auftreten können, wenn ein Programmierer einen anderen Wert zu 'ShapeName' hinzufügt und im Switch nicht berücksichtigt wird.
Was? Du hast es empfohlen?

1. Behauptungen
Ich könnte eine Behauptung verwenden, aber was behaupte ich?

%Vor%

2. Ausnahmen
Ich könnte eine Ausnahme machen, aber ich denke nicht, dass das eine sehr gute Übung wäre. Ich habe den Eindruck, dass Ausnahmen für Laufzeit-Ereignisse sind, die aufgrund bestimmter Umgebungen nicht vorhergesagt werden können.

3. Exits
Ich kann das Programm sofort mit einem Fehler beenden. Das ist die beste Idee, aber ich bin mir nicht sicher, ob es eine gute Übung ist. Ich dachte, der Vorteil von Behauptungen war, dass man sie alle ausschalten könnte, wenn man bereit war, das Programm zu versenden. Dann würde dieser gesamte Assertionscode nicht mehr existieren.

Vielleicht gibt es einen anderen Weg, den ich nicht kenne. Ich benutze ein Compiler-Flag, das vor unerklärten Werten warnt, aber ich möchte immer noch wissen, was andere empfehlen.

    
Trevor Hickey 28.04.2012, 02:18
quelle

4 Antworten

9

Ich mag die Idee, mit einer informativen Nachricht zu behaupten. Versuchen Sie Folgendes:

%Vor%

Dies gibt immer false zurück, liefert jedoch eine Nachricht, die Sie verwenden können.

Bearbeiten:
Ich habe die Quelle gefunden, aus der ich diesen Begriff aus meiner Erinnerung gezogen habe; es ist in folgendem Buch:
C ++ - Codierungsstandards - 101 Regeln und Richtlinien

    
chris 28.04.2012, 02:24
quelle
4

Meine bevorzugte Einstellung für diesen speziellen Fall, bei dem Sie ein enum-Tag einschalten und alle Fälle bearbeiten, besteht darin, die Standardeinstellung zu ignorieren. Auf diese Weise erhalten Sie bei einem vernünftigen Compiler, wenn jemand ein neues Tag zur Enumeration und nicht zum Switch hinzufügt, eine Kompilierungswarnung darüber, dass das Tag nicht im Switch gehandhabt wird.

    
Chris Dodd 28.04.2012 02:32
quelle
0

Ich denke, für mich würde es etwas davon abhängen, was die DoSomething # -Methoden tun.

Wenn es wird einen weniger graziös Absturz führt später auf jeden Fall Sie wollen Laufzeit zu unterbrechen, wenn dies mit einer Erklärung aufgerufen wird „Funktion mit ungültigem Enum genannt: enumName“ oder etwas, um der Entwickler-Benachrichtigung zu geben, dass sie dies nicht aktualisieren switch statement, anstatt sie zu fragen, ob etwas später scheitert.

    
enderland 28.04.2012 02:27
quelle
0

Kurze Antwort: Verwenden Sie Polymorphie, um das Problem zu beseitigen.

Lange Antwort: Der einfachste Weg, um das Root-Problem zu lösen (d. H. Wie man switch-Anweisungen mit fehlenden Einträgen verhindert?) Wäre, Switch-Anweisungen zu vermeiden, wenn die Möglichkeit besteht, dass Einträge vergessen werden . Schalteranweisungen sind in lokalen Kontexten nützlich, aber wenn die Logik, die sie darstellen, an mehreren Stellen dupliziert wird, besteht die Möglichkeit, zu vergessen, eine zu aktualisieren, und Sie richten sich auf Laufzeitfehler ein.

%Vor%

Die switch-Anweisung kann am Erstellungsort noch nützlich sein:

%Vor%

Aber das ist der einzige Ort, an dem die Logik existiert. Und selbst das kann mit statischem Polymorphismus verbessert werden:

%Vor%

Siehe Martin Folwer für weitere Informationen.

    
Andrew Durward 28.04.2012 11:30
quelle