Switch-Anweisung mit Returns – Code-Korrektheit [closed]

Lesezeit: 5 Minuten

Benutzeravatar von houbysoft
houbysoft

Nehmen wir an, ich habe Code in C mit ungefähr dieser Struktur:

switch (something)
{
    case 0:
      return "blah";
      break;

    case 1:
    case 4:
      return "foo";
      break;

    case 2:
    case 3:
      return "bar";
      break;

    default:
      return "foobar";
      break;
}

Nun offensichtlich, die breaks sind nicht erforderlich, damit der Code korrekt ausgeführt wird, aber es sieht nach schlechter Praxis aus, wenn ich sie nicht dort ablege.

Was denkst du? Ist es in Ordnung, sie zu entfernen? Oder würden Sie sie für erhöhte “Korrektheit” behalten?

Benutzeravatar von kgiannakakis
Kgiannakakis

Entferne das break Aussagen. Sie werden nicht benötigt und möglicherweise werden einige Compiler Probleme haben “Unerreichbarer Code” Warnungen.

  • Dasselbe gilt für andere unbedingte Kontrollsprung-Anweisungen, wie z continue oder goto – Es ist idiomatisch, sie anstelle von zu verwenden break.

    – Café

    18. Juni 2010 um 4:01 Uhr

Benutzeravatar von NotMe
Nicht ich

Ich würde einen ganz anderen Weg gehen. Kehren Sie nicht mitten in der Methode/Funktion zurück. Setzen Sie stattdessen einfach den Rückgabewert in eine lokale Variable und senden Sie ihn am Ende.

Ich persönlich finde folgendes lesbarer:

String result = "";

switch (something) {
case 0:
  result = "blah";
  break;
case 1:
  result = "foo";
  break;
}

return result;

  • Die “One Exit”-Philosophie ist in C sinnvoll, wo Sie sicherstellen müssen, dass die Dinge korrekt bereinigt werden. In Anbetracht der Tatsache, dass Sie in C++ jederzeit durch eine Ausnahme aus der Funktion herausgerissen werden können, ist die One-Exit-Philosophie in C++ nicht wirklich nützlich.

    – Billy ONeal

    17. Juni 2010 um 20:43 Uhr

  • Theoretisch ist dies eine großartige Idee, aber es erfordert häufig zusätzliche Steuerblöcke, die die Lesbarkeit beeinträchtigen können.

    – Mikerobi

    17. Juni 2010 um 20:44 Uhr

  • Der Hauptgrund, warum ich die Dinge so mache, ist, dass es bei längeren Funktionen sehr leicht ist, den Exit-Vektor zu übersehen, wenn Code durchsucht wird. Wenn der Ausgang jedoch immer am Ende ist, ist es einfacher, schnell zu erfassen, was los ist.

    – Nicht ich

    17. Juni 2010 um 20:48 Uhr

  • Nun, das und Rückgabeblöcke in der Mitte des Codes erinnern mich nur an GOTO-Missbrauch.

    – Nicht ich

    17. Juni 2010 um 20:49 Uhr

  • @Chris: Bei längeren Funktionen stimme ich voll und ganz zu – aber das spricht normalerweise für größere Probleme, also überarbeiten Sie es. In vielen Fällen ist es eine triviale Funktion, die bei einem Schalter zurückkehrt, und es ist sehr klar, was passieren soll. Verschwenden Sie also keine Gehirnleistung, um eine zusätzliche Variable zu verfolgen.

    – Stefan

    17. Juni 2010 um 20:51 Uhr

Ich würde sie entfernen. Meiner Meinung nach sollte toter Code wie dieser als Fehler betrachtet werden, da Sie dadurch zweimal hinschauen und sich fragen: “Wie würde ich diese Zeile jemals ausführen?”

Entferne sie. Es ist idiomatisch, von zurückzukehren case Anweisungen, und es ist andernfalls “nicht erreichbarer Code”.

Ich persönlich würde die Returns entfernen und die Breaks beibehalten. Ich würde die Switch-Anweisung verwenden, um einer Variablen einen Wert zuzuweisen. Geben Sie diese Variable dann nach der switch-Anweisung zurück.

Obwohl dies ein strittiger Punkt ist, hatte ich immer das Gefühl, dass gutes Design und Kapselung einen Weg hinein und einen Weg hinaus bedeuten. Es ist viel einfacher, die Logik zu garantieren, und Sie verpassen nicht versehentlich Bereinigungscode basierend auf der zyklomatischen Komplexität Ihrer Funktion.

Eine Ausnahme: Eine vorzeitige Rückkehr ist in Ordnung, wenn ein fehlerhafter Parameter zu Beginn einer Funktion erkannt wird – bevor Ressourcen abgerufen werden.

  • Könnte für diesen speziellen gut sein switch, aber nicht unbedingt am besten im Allgemeinen. Nehmen wir an, die switch-Anweisung innerhalb einer Funktion geht weiteren 500 Codezeilen voraus, die nur in bestimmten Fällen gültig sind true. Was bringt es, all diesen zusätzlichen Code für die Fälle auszuführen, die ihn nicht ausführen müssen? ist es nicht besser einfach return innerhalb der switch für diejenigen cases?

    – Fr0zenFyr

    28. März 2019 um 7:19 Uhr

Normalerweise würde ich den Code ohne sie schreiben. Meiner Meinung nach deutet toter Code auf Schlamperei und/oder mangelndes Verständnis hin.

Ich würde natürlich auch sowas in Erwägung ziehen:

char const *rets[] = {"blah", "foo", "bar"};

return rets[something];

Bearbeiten: Auch mit dem bearbeiteten Beitrag kann diese allgemeine Idee gut funktionieren:

char const *rets[] = { "blah", "foo", "bar", "bar", "foo"};

if ((unsigned)something < 5)
    return rets[something]
return "foobar";

Irgendwann, besonders wenn die Eingabewerte spärlich sind (z. B. 1, 100, 1000 und 10000), möchten Sie stattdessen ein Array mit geringer Dichte. Sie können das entweder als Baum oder als Karte ziemlich gut implementieren (obwohl ein Schalter natürlich auch in diesem Fall noch funktioniert).

  • Könnte für diesen speziellen gut sein switch, aber nicht unbedingt am besten im Allgemeinen. Nehmen wir an, die switch-Anweisung innerhalb einer Funktion geht weiteren 500 Codezeilen voraus, die nur in bestimmten Fällen gültig sind true. Was bringt es, all diesen zusätzlichen Code für die Fälle auszuführen, die ihn nicht ausführen müssen? ist es nicht besser einfach return innerhalb der switch für diejenigen cases?

    – Fr0zenFyr

    28. März 2019 um 7:19 Uhr

Benutzeravatar von Paul R
Paul R

Behalten Sie die Unterbrechungen bei – es ist weniger wahrscheinlich, dass Sie auf Probleme stoßen, wenn Sie den Code später bearbeiten, wenn die Unterbrechungen bereits vorhanden sind.

Allerdings wird es von vielen (einschließlich mir) als schlechte Praxis angesehen, aus der Mitte einer Funktion zurückzukehren. Idealerweise sollte eine Funktion einen Eintrittspunkt und einen Austrittspunkt haben.

1421350cookie-checkSwitch-Anweisung mit Returns – Code-Korrektheit [closed]

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

Privacy policy