PHP-Codierungsstile werden zurückgegeben; im Schalter/Gehäuse

Lesezeit: 9 Minuten

Benutzer-Avatar
opHASnoNAME

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 ?

  • 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ür break.

    – Gumbo

    17. September 2009 um 8:32 Uhr

Benutzer-Avatar
John Carter

Es ist vollkommen gültig, das wegzulassen break wenn du return von einem switch.

Aber es ist ziemlich üblich, explizit hinzuzufügen breaks 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.

Benutzer-Avatar
Chemaklasse

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 breaknach 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 casees 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 breakgeben 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 habe eine viel bessere Lösung. Bitte folgen Sie dem folgenden Code für die obige Switch-Anweisung:

$result = 3; // for default case
switch ($foo) {   
    case 1:
      $result = 1;
      break;  
    case 2:
      $result = 2;
      break;    
   default:
      // do nothing
}
return $result;

Es wird zu keinem Fehler führen und der Code ist auch mit Konzepten in Ordnung.

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

  • … ist vielleicht nicht die Präferenz von @therefromhere, weil “keine erforderlichen” Zuschreibungen verbraucht werden … Aber es ist eine gute Wahl, wenn die $ret existiert bereits (wird benötigt), um etwas im Algorithmus zu tun.

    – Peter Krauß

    14. September 2014 um 11:52 Uhr

  • “Die Verwendung der Return-in-Case-Anweisung, um den Codefluss zu unterbrechen, ist nicht wirklich eine bewährte Methode”, muss ich widersprechen. Erste “beste Praxis” ist oft mehrdeutig, zumindest abhängig von der Codebasis, dem Szenario usw. Aber “gute Praxis” soll früh zurückkehren. Hier setzen Sie eine Variable nur, um sie später zurückzugeben und nichts anderes damit zu tun. Haben return negiert in jedem Fall das Setzen einer Variablen, und es ist viel weniger Code zu sehen.

    – James

    4. Juni 2020 um 14:20 Uhr

Benutzer-Avatar
Sander

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 ).

  • … ist vielleicht nicht die Präferenz von @therefromhere, weil “keine erforderlichen” Zuschreibungen verbraucht werden … Aber es ist eine gute Wahl, wenn die $ret existiert bereits (wird benötigt), um etwas im Algorithmus zu tun.

    – Peter Krauß

    14. September 2014 um 11:52 Uhr

  • “Die Verwendung der Return-in-Case-Anweisung, um den Codefluss zu unterbrechen, ist nicht wirklich eine bewährte Methode”, muss ich widersprechen. Erste “beste Praxis” ist oft mehrdeutig, zumindest abhängig von der Codebasis, dem Szenario usw. Aber “gute Praxis” soll früh zurückkehren. Hier setzen Sie eine Variable nur, um sie später zurückzugeben und nichts anderes damit zu tun. Haben return negiert in jedem Fall das Setzen einer Variablen, und es ist viel weniger Code zu sehen.

    – James

    4. Juni 2020 um 14:20 Uhr

1346090cookie-checkPHP-Codierungsstile werden zurückgegeben; im Schalter/Gehäuse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy