Während einer kürzlich durchgeführten Codeüberprüfung wurde ich gebeten, default
Fälle in alle Dateien zu schreiben switch
, wo immer ein Block verwendet wird, auch wenn nichts zu tun ist default
. Das heißt, ich muss den default
Fall stellen und nichts darauf schreiben.
Ist das das Richtige? Welchem Zweck würde es dienen?
Antworten:
Es scheint drei Fälle zu geben, in denen eine
default
Aussage nicht notwendig ist:Es bleiben keine weiteren Fälle übrig, da nur eine begrenzte Anzahl von Werten in das Feld eingegeben wird
switch case
. Dies kann sich jedoch mit der Zeit ändern (absichtlich oder versehentlich), und es wäre gut,default case
wenn sich etwas ändert. Sie könnten den Benutzer über einen falschen Wert informieren oder ihn warnen.Sie wissen, wie und wo der
switch case
verwendet wird und welche Werte eingegeben werden. Auch dies kann sich ändern und eine zusätzliche Verarbeitung ist möglicherweise erforderlich.In anderen Fällen ist keine spezielle Verarbeitung erforderlich. Wenn dies der Fall ist, werden Sie gebeten, a hinzuzufügen
default case
, da dies ein akzeptierter Codierungsstil ist und Ihren Code besser lesbar macht.Die ersten beiden Fälle beruhen auf Annahmen. Sie können es sich also nicht leisten, diese Annahmen zu treffen (vorausgesetzt, Sie arbeiten in einem nicht so kleinen Team, da Sie regelmäßig Codeprüfungen durchführen). Sie wissen nicht, wer mit Ihrem Code arbeitet oder Funktionen aufruft / Methoden in Ihrem Code aufruft. In ähnlicher Weise müssen Sie möglicherweise mit dem Code einer anderen Person arbeiten. Wenn Sie den gleichen Codierungsstil verwenden, wird es einfacher, mit dem Code einer Person (einschließlich Ihres Codes) umzugehen.
quelle
throw new IllegalStateException("Unrecognised case "+myEnum)
das Ihnen zeigt, wo und was der Fehler ist.else
Klausel haben sollten,if/else if
auch wenn Sie wissen, dass dies nicht passieren sollte? Das scheint mir keine gute Idee zu sein ...Es ist nicht ungewöhnlich, dass Kodierungsstandards von Unternehmen für alle
switch
Anweisungen einen Standardfall vorschreiben . Ein Grund dafür ist, dass es den Lesern leicht gemacht wird, das Ende des Internet zu findenswitch
. Ein weiterer, wahrscheinlich besserer Grund ist, dass Sie eine Sekunde lang darüber nachdenken, was Ihr Code tun soll, wenn die Bedingung nicht Ihren Erwartungen entspricht. Unabhängig vom Grund für die Anforderung sollten Sie, wenn es sich um einen Unternehmensstandard handelt, diesen befolgen, es sei denn, es gibt einen luftdichten Grund, dies nicht zu tun.Wenn Sie glauben, dass Sie
switch
Fälle für jede mögliche Bedingung einschließen, ist es eine gute Sache, eineassert
Aussage in den Standardfall zu setzen . Wenn jemand den Code ändert und versehentlich eine Bedingung hinzufügt, die von Ihnenswitch
nicht abgedeckt wird, trifft er dieassert
und merkt, dass er diesen Teil des Codes adressieren muss.Wenn Sie
switch
nur einige der möglichen Bedingungen abdecken, für die anderen jedoch keine besonderen Maßnahmen erforderlich sind, können Sie den Standardfall leer lassen. Es ist eine gute Idee, in diesem Fall einen Kommentar hinzuzufügen, um anzuzeigen, dass der Standardfall absichtlich leer ist, da die Bedingungen, unter denen er auftritt, keine Arbeit erfordern.quelle
assert
?Wenn Sie den reinen Aufzählungstyp "einschalten", ist ein Standard-Fallback gefährlich. Wenn Sie später Werte zum Aufzählungstyp hinzufügen, hebt der Compiler Schalter mit neuen Werten hervor, die nicht behandelt werden. Wenn Sie dort eine Standardklausel haben, bleibt der Compiler stumm und Sie vermissen sie möglicherweise.
quelle
In vielerlei Hinsicht ist diese Frage die gleiche wie die oft gefragt Benötige ich eine
else
Klausel am Ende einif
/else if
Leiter , dass Abdeckungen jede Option .Die Antwort lautet syntaktisch: Nein, das tust du nicht. Aber es gibt doch einen ...
Eine
default
Klausel kann aus (mindestens) zwei Gründen vorhanden sein:otherwise
von einem Fall. Es gibt überhaupt keinen Grund, diese nicht in den Quellcode aufzunehmen.Meine Philosophie ist immer ganz einfach: Schätzen Sie das Worst-Case-Szenario der beiden Optionen ein und wählen Sie die sicherste. Im Falle eines Leerzeichens
else
oder einerdefault
Klausel sind die Worst-Case-Optionen:Überdramatisch? Vielleicht ... aber dann hat meine Software das Potenzial, Leute zu töten, wenn es schief geht. Ich gehe dieses Risiko lieber nicht ein.
Im Übrigen empfehlen die MISRA-C-Richtlinien (siehe Profil für die Zugehörigkeit)
default
für jeden eine Klauselswitch
quelle
else
nach einif
. Aber wie Sie sagten, nein, das ist es nicht.Java zwingt Sie nicht dazu, eine 'Standard'-Anweisung zu haben, aber es ist eine gute Praxis , immer eine zu haben, selbst wenn der Code (im Moment) möglicherweise nie erreicht wird. Hier sind einige Gründe:
Durch eine nicht erreichbare Standardklausel zeigen Sie dem Leser Ihres Codes, dass Sie die Werte berücksichtigt haben und wissen, was Sie tun. Sie können auch zukünftige Änderungen berücksichtigen, zum Beispiel: Es wird ein neuer Enum-Wert hinzugefügt. Der Switch sollte den neuen Wert nicht unbemerkt ignorieren. Sie können dort stattdessen eine Ausnahme auslösen oder etwas anderes tun.
Um einen unerwarteten Wert abzufangen (falls Sie keine Aufzählung aktivieren), der übergeben wird, kann dieser beispielsweise größer oder kleiner als erwartet sein.
'Standard'-Aktionen handhaben - wobei die Schalter für ein spezielles Verhalten sind. Zum Beispiel kann eine Variable außerhalb des Schalters deklariert, aber nicht initialisiert werden, und in jedem Fall wird sie mit etwas anderem initialisiert. Standard in diesem Fall könnte es auf einen Standardwert initialisieren, damit der Code unmittelbar nach dem Wechsel keine Ausnahme auslöst.
Selbst wenn Sie beschließen, nichts in die Standardeinstellung aufzunehmen (keine Ausnahmen, Protokollierung usw.), kann sogar ein Kommentar, der besagt, dass die Standardeinstellung niemals auftreten wird, die Lesbarkeit Ihres Codes verbessern. aber das hängt von persönlichen Vorlieben ab.
quelle
Ich möchte auch hinzufügen, dass dies von der Philosophie der von Ihnen verwendeten Sprache abhängt. In Erlang zum Beispiel, wo es ein gängiger Ansatz ist, "es zum Absturz zu bringen", würden Sie keinen Standardfall definieren, sondern Ihre
case
Anweisung einen Fehler auslösen lassen, wenn eine Situation eintritt, die nicht berücksichtigt wurde.quelle
Sie sollten immer eine Zahlungsunfähigkeit haben, es sei denn, Sie haben nachweislich und dauerhaft alle Fälle abgedeckt. Es kostet nichts und ist eine Versicherung gegen das Versagen, Ihre switch-Anweisung in einem sich entwickelnden Programm zu pflegen.
Wenn Sie wirklich sicher sind, dass Sie sich nicht um andere Fälle kümmern, ist der Standardwert: break; // egal, aber der Standardwert sollte ungefähr so lauten wie der Standardwert: throw new Error ("unerwarteter Wert");
Ebenso sollten Sie niemals ein nicht triviales Fallkonstrukt "durchgehen", ohne einen Kommentar zu dem Effekt hinzuzufügen, den Sie durchgehen möchten. Java hat dies in der Entwurfsphase falsch verstanden.
quelle
Erwägen
und
Ich würde argumentieren, dass dies besser ist als ein MÄNNLICHER Fall, ein WEIBLICHER Fall und ein Standardfall, der eine Ausnahme auslöst.
Während der Testphase prüft der Computer, ob g WEIBLICH ist. Während der Produktion entfällt die Prüfung. (Ja, eine Mikrooptimierung!)
Noch wichtiger ist, dass Sie Ihr Ziel einer 100% igen Codeabdeckung beibehalten. Wenn Sie einen Standardfall geschrieben haben, der eine Ausnahme auslöst, wie würden Sie ihn jemals testen?
quelle
Gender . FEMALE . equals ( FEMALE ) ;
ausgewertetfalse
? Sie meinten,Gender.FEMALE.equals (g)
aber da Sie sich darauf verlassen können, dass Verweise auf Listen stabil sind, können Sie einfach schreibeng == Gender.FEMALE
. 4. (Persönliche Meinung) Dieser Code ist viel schwerer zu lesen und führt zu etwas verwirrenderen Fehlern.