Wir versuchen, neue Richtlinien für den Codierungsstil für unser Team zu implementieren. Der PHP-Codeniffer gibt eine Warnung bei switch case-Anweisungen aus, wenn kein “break” gefunden wird, wie:
switch ($foo) {
case 1:
return 1;
case 2:
return 2;
default:
return 3;
}
Gibt es einen guten Grund zu verwenden:
switch ($foo) {
case 1:
return 1;
break;
}
?? die Pause wird nie erreicht ?
Es ist vollkommen gültig, das wegzulassen break
wenn du return
von einem switch
.
Aber es ist ziemlich üblich, explizit hinzuzufügen break
s zu jedem case
Als ein defensive Programmierung trainieren.
switch ($foo) {
case 1:
return 1;
break;
case 2:
return 2;
break;
}
Die Idee ist, dass Sie Ihren Code später ändern sollten case 1
und die return-Anweisung entfernen, könnten Sie vergessen, a hinzuzufügen break
.
Dies würde versehentlich dazu führen, dass der Programmfluss durchfällt case 2
.
switch ($foo) {
case 1:
somethingDifferent();
case 2:
return 2;
break;
}
Das Durchfallen von Case-Anweisungen ist etwas ungewöhnlich, und Sie sollten Ihrem Code einen Kommentar hinzufügen, wenn Sie dies tun, um zu zeigen, dass dies beabsichtigt ist.
switch ($foo) {
case 1:
somethingDifferentAndWeWantToDoCase2AsWell();
// fallthrough
case 2:
return 2;
break;
}
Wie bei vielen defensiven Programmierpraktiken müssen Sie abwägen, ob sich das Aufblähen des Codes – das Ihren Code möglicherweise unübersichtlich und unleserlich macht – lohnt oder nicht.
Wenn Ihr “php-Codeniffer eine Warnung ausgibt”, versuchen Sie, einen anderen besseren Codeniffer zu bekommen, und vergessen Sie nicht, zu versuchen, die letzte stabile PHP-Version zu verwenden. Du kannst natürlich auch a schreiben break
nach einem return
, aber es macht keinen Sinn, weil es überhaupt nie gelesen wird. Dein Code ist in Ordnung.
Schau dir das an:
$fun = function(int $argument): string {
switch ($argument) {
case 1:
return "one";
case 2:
return "two";
default:
return "more than two";
}
};
$str = $fun(4); // return "more than two"
Meiner Meinung nach ist dies einfacher und besser: weniger Zeilen => weniger zu wartender Code 🙂
Um Ihre Frage zu beantworten, nein, es gibt keinen guten Grund, etwas zu haben, das nichts tut. Denken Sie so darüber nach, ein Kommentar nach dem return
anstelle einer break
“Nicht vergessen” zu sagen, wird die gleiche Wirkung haben – keine. Und so ausgedrückt klingt es albern, oder?
Sofern Sie keine Variable für die spätere Verwendung festlegen müssen, würde ich vorschlagen, dass der Ansatz, den Sie haben, vollkommen in Ordnung ist. Ich kannte die Absicht des Codes innerhalb von 2 Sekunden, nachdem ich ihn mir angesehen hatte. Ein … haben break
sorgt nur für verwirrung.
Es gibt keine Einheitsgröße, die wirklich für alle passt. Der richtige Ansatz hängt davon ab, was zum Szenario passt. Legen Sie jeweils eine Variable fest case
und mit einem break
kann der richtige Weg sein, oder vielleicht macht einfach die Rückkehr Sinn.
Einige Beobachtungen zu anderen Vorschlägen in den Antworten:
1) Keinen haben break
nach return
bedeutet, dass Probleme auftreten können, wenn der Code später geändert wird
Code sollte nach Möglichkeit explizit sowie lesbar und klar sein. Wir können auch so programmieren, dass zukünftige Änderungen einfacher werden. Aber in etwas so Einfachem wie a switch
Es sollte kein Problem sein und kein Sicherheitsnetz benötigen, um a umzugestalten case
später hinzufügen oder entfernen a return
oder break
.
In der Tat, wenn Sie a entfernt haben return
und “nicht bemerkt, dass es keine gibt break
” dann ist das ein schlimmer Fehler und könnte in jedem Teil des Codierens gemacht werden. Keine Gotcha-Überprüfung wird Sie davor bewahren. Und man sollte beim Codieren für zukünftige Potenziale sehr vorsichtig sein, da dieses Potenzial möglicherweise nie eintreten wird oder etwas anderes passieren kann, und Sie pflegen nur jahrelang veralteten Code.
In gleicher Weise wurde argumentiert, dass dies ein Sicherheitsnetz für zukünftige Änderungen sei – Was wäre, wenn Sie das entfernen würden return
und versehentlich in diesem Sicherheitsnetz zurückgelassen break
wann hättest du es entfernen sollen?
Selbst wenn diese Switch-Anweisung ein Szenario auf Leben und Tod wäre, wirklich ernsthafter Code, wäre ich dagegen, die “sinnlose” Unterbrechung nach der Rückkehr hinzuzufügen. Stellen Sie einfach sicher, dass jeder, der an dem Code arbeitete, wusste, was er tat, und dass der Code von genügend Augen überprüft und vollständig getestet wurde.
Wenn es so ernst wäre, hätten Sie zusätzliche Kontrollen, die besser sind als ein vorgeschlagenes Sicherheitsnetz, um nachlässige Entwickler zu fangen.
Zu argumentieren, dass eine Unterbrechung nach der Rückkehr ein Sicherheitsnetz hinzufügt, bedeutet, dass Sie nicht richtig codieren oder testen. Wenn dies ein Sicherheitsnetz ist, das als nützlich erachtet wird, dann ist es wahrscheinlich, dass es Tonnen von Fehlern im Code an möglicherweise ernsteren Stellen gibt.
Der Wiki-Artikel von “Defensive Programming” wurde verlinkt, ist aber hier nicht relevant:
Defensive Programmierung ist eine Form des defensiven Designs, die darauf abzielt, die fortgesetzte Funktion einer Software unter unvorhergesehenen Umständen sicherzustellen.
Verlassen eines Sicherheitsnetzes break
Dies ist weder ein Szenario unvorhergesehener Umstände noch eine defensive Programmierung. Es ist nur schlechte Codierung, und Sie können Ihren Code nicht mit Backup-Code verunreinigen, nur für den Fall, dass Sie nicht richtig codieren, wenn Sie etwas ändern. Das ist so ein schlechter Ansatz für die Codierung. Das Argument, dass “wenn jemand die Rückgabe entfernt, es nicht funktioniert”, nun, Sie könnten auch einen Tippfehler in der Groß-/Kleinschreibung haben oder vergessen, die Groß-/Kleinschreibung zu schreiben, oder …
Das return
zurückgibt, und Sie codieren nicht “defensiv”, um zu vermeiden, dass eine Rückgabe fehlschlägt. Das würde bedeuten, dass PHP kaputt ist, und Sie werden Ihren Code nicht mit Sicherheitsnetzen füllen, um dem Rechnung zu tragen. Das ist etwas, was Sie auf einer viel höheren Ebene haben.
2) break
nach return
hält es explizit
Aber es ist ausdrücklich falsch. Das return
kehrt zurück, so dass die Unterbrechung nicht stattfindet. Für mich ist das Zeit, sich am Kopf zu kratzen, wenn ich mich frage, ob ich die Absicht verfehlt habe – nicht lange, da klar ist, was Wille passieren, aber es wird einen Moment geben, in dem ich darüber nachdenke, um sicherzugehen, dass ich nichts übersehen habe.
Es ist zwar nicht ungültig oder ein Fehler, eine zu haben return
und dann break
im gleichen case
es ist einfach völlig sinnlos wie die break
tut nichts. Es ist sinnloser Code, der gesehen, gewartet und herausgefunden werden muss, da er nicht logisch ist.
Wenn explizit ist das Kernziel und ein … haben break
nach einer return
urks Sie, weil es sinnlos ist, dann würde ich sagen, es wäre besser, eine Variable und zu setzen break
geben Sie dann die Variable zurück, nachdem Sie den Schalter verlassen haben.
Wie @RageZ antworten https://stackoverflow.com/a/1437476/2632129
3) Legen Sie eine Variable fest und kehren Sie zurück, nachdem die switch-Anweisung abgeschlossen ist
An diesem Ansatz ist überhaupt nichts auszusetzen, aber wenn es keinen Grund gibt, den Wert in einer Variablen zu speichern (spätere Verwendung usw.), ist es gut, sofort zurückzukehren, wenn Sie nicht herumhängen müssen, um etwas anderes zu tun.
Das zeigt eine klare Absicht – geben Sie einen Wert zurück, sobald die Groß-/Kleinschreibung übereinstimmt.
Ich bin kein Experte für perfekte Codierung, aber ich denke, der Validator würde so etwas bevorzugen
switch ($foo) {
case 1:
$ret = 1;
break;
case 2:
$ret = 2;
break;
default:
$ret = 3
}
return $ret
Ich denke, die Verwendung von return in case-Anweisungen, um den Fluss des Codes zu unterbrechen, ist nicht wirklich eine bewährte Methode. Deshalb sagt der Validator, dass es keine Pause gibt …
Zu Ihrer Frage zu Kategorie: Ich weiß nicht … Entschuldigung
Aus dem PHP-Handbuch (http://us3.php.net/manual/en/control-structures.switch.php) :
PHP führt die Anweisungen bis zum Ende des switch-Blocks oder bis zum ersten Mal, wenn es eine break-Anweisung sieht, weiter aus. Wenn Sie am Ende der Anweisungsliste eines Falls keine break-Anweisung schreiben, fährt PHP mit der Ausführung der Anweisungen des folgenden Falls fort. Zum Beispiel:
<?php
switch ($i) {
case 0:
echo "i equals 0";
case 1:
echo "i equals 1";
case 2:
echo "i equals 2";
}
?>
Wenn hier $i gleich 0 ist, würde PHP alle Echo-Anweisungen ausführen! Wenn $i gleich 1 ist, würde PHP die letzten beiden Echo-Anweisungen ausführen. Sie würden das erwartete Verhalten (‘i gleich 2’ würde angezeigt) nur erhalten, wenn $i gleich 2 ist. Daher ist es wichtig, break-Anweisungen nicht zu vergessen (auch wenn Sie es unter bestimmten Umständen vermeiden möchten, sie absichtlich anzugeben ).
Ich würde vorschlagen, die @category-Frage zu einer separaten Frage zu machen, da sie nichts damit zu tun hat.
– John Carter
17. September 2009 um 8:32 Uhr
Vielleicht ist Codesniffer einfach falsch und sucht nicht nach
return
aber nur fürbreak
.– Gumbo
17. September 2009 um 8:32 Uhr