Frage

Solange ich mich erinnern kann ich switch-Anweisung fallthrough vermied verwenden. Eigentlich kann ich mich nicht erinnern, es jemals mein Bewußtsein als Möglichkeit der Eingabe Dinge zu tun, wie es früher in meinen Kopf gebohrt wurde auf, dass es nicht mehr als ein Fehler in der switch-Anweisung. Aber heute habe ich über einige Codes lief, dass sie durch Design verwendet, das ich sofort bekam fragen, was jeder in der Gemeinschaft denkt über switch-Anweisung fallthrough.

Ist es etwas, das eine Programmiersprache sollte ausdrücklich nicht zulassen (wie C # funktioniert, obwohl es liefert eine Abhilfe) oder ist es ein Merkmal jeder Sprache, die stark genug ist, in den Programmierern der Hände zu verlassen?

Edit: Ich war nicht spezifisch genug, um zu dem, was ich von Durchfall gemeint. Ich benutze diese Art eine Menge:

    switch(m_loadAnimSubCt){
        case 0: 
        case 1: 
            // Do something
            break;
        case 2:
        case 3:
        case 4:
            // Do something
            break;
   }

Aber ich mache mir Sorgen um so etwas wie diese.

   switch(m_loadAnimSubCt){
        case 0: 
        case 1: 
            // Do something but fall through to the other cases 
            // after doing it.
        case 2:
        case 3:
        case 4:
            // Do something else.
            break;
   }

Auf diese Weise, wann immer der Fall 0, 1 es alles in der switch-Anweisung tun. Ich habe dies durch Design gesehen und ich weiß nur nicht, ob ich damit einverstanden, dass Switch-Anweisungen sollten auf diese Weise verwendet werden. Ich denke, das erste Codebeispiel ein sehr nützliche und sicher ist. Die zweite scheint Art gefährlich.

War es hilfreich?

Lösung

Es kann davon abhängen, was Sie als Durchfall. Ich bin mit dieser Art der Sache ok:

switch (value)
{
  case 0:
    result = ZERO_DIGIT;
    break;

  case 1:
  case 3:
  case 5:
  case 7:
  case 9:
     result = ODD_DIGIT;
     break;

  case 2:
  case 4:
  case 6:
  case 8:
     result = EVEN_DIGIT;
     break;
}

Wenn Sie aber einen Fall Etikett von Code gefolgt, die auf einem anderen Fall Etikett fällt durch, würde ich so ziemlich immer, dass das Böse betrachten. Vielleicht den gemeinsamen Code an eine Funktion zu bewegen und von beiden Orten fordern wäre eine bessere Idee.

Und bitte beachten Sie, dass ich die C ++ FAQ Definition von "böse"

Andere Tipps

Es ist ein zweischneidiges Schwert. Manchmal sehr nützlich, oft gefährlich.

Wann ist es gut? Wenn Sie 10 Fällen wollen alle die gleiche Art und Weise bearbeitet ...

switch (c) {
  case 1:
  case 2:
            ... do some of the work ...
            /* FALLTHROUGH */
  case 17:
            ... do something ...
            break;
  case 5:
  case 43:
            ... do something else ...
            break;
}

Die einzige Regel Ich mag ist, dass, wenn Sie jemals etwas tun Phantasie, wo man den Bruch auszuschließen, müssen Sie einen klaren Kommentar / * * Durchfall / um anzuzeigen, dass war Ihre Absicht.

fallthrough ist wirklich eine praktische Sache, je nachdem, was du tust. Betrachten Sie diese ordentlich und verständlich Optionen zu arrangieren:

switch ($someoption) {
  case 'a':
  case 'b':
  case 'c':
    // do something
    break;
  case 'd':
  case 'e':
    // do something else
    break;
}

Imagine tut dies mit if / else. Es wäre ein Chaos sein.

Haben Sie schon von Duff Gerät ? Dies ist ein großartiges Beispiel Schalter fallthrough zu verwenden.

Es ist eine Funktion, die verwendet werden kann, und es kann missbraucht werden, wie fast alle Sprachfunktionen.

Es kann ein paar Mal sehr nützlich sein, aber in der Regel nicht-fallthrough ist das gewünschte Verhalten. Durchfall sollte erlaubt sein, aber nicht implizit.

Ein Beispiel, um alte Versionen einiger Daten zu aktualisieren:

switch (version) {
    case 1:
        // update some stuff
    case 2:
        // update more stuff
    case 3:
        // update even more stuff
    case 4:
        // and so on
}

Ich würde eine andere Syntax für Fallbacks in Schalter lieben, so etwas wie, errr ..

switch(myParam)
{
  case 0 or 1 or 2:
    // do something;
    break;
  case 3 or 4:
    // do something else;
    break;
}

Hinweis: Das wäre schon möglich sein, mit Aufzählungen, wenn Sie alle Fälle auf Ihrer ENUM erklären mit Fahnen oder? Nicht so schlecht klingen entweder könnten die Fälle (sollte?) Sehr gut bereits Teil Ihrer ENUM sein.

Vielleicht wäre dies ein schöner Fall (kein Wortspiel beabsichtigt) für eine fließend-Schnittstelle Erweiterungsmethoden? So etwas wie, errr ...

int value = 10;
value.Switch()
  .Case(() => { /* do something; */ }, new {0, 1, 2})
  .Case(() => { /* do something else */ } new {3, 4})
  .Default(() => { /* do the default case; */ });

Obwohl das ist wahrscheinlich noch weniger lesbar: P

Wie bei allem. Wenn mit Vorsicht verwendet, kann es ein elegantes Werkzeug

Aber ich denke, die Nachteile mehr als rechtfertigt es nicht, es zu benutzen, und schließlich, es nicht zu erlauben, mehr (C #). Zu den Problemen sind:

  • es ist einfach zu „vergessen“ eine Pause
  • es ist nicht immer offensichtlich für die Code-Maintainer, dass ein Bruch weggelassen ist Absicht

gute Verwendung eines Schalter / falls der Durchfall:

switch (x)
{
case 1:
case 2:
case 3:
 do something
 break;
}

BAAAAAD Verwendung eines Schalter / falls der Durchfall:

switch (x)
{
case 1:
    some code
case 2:
    some more code
case 3:
    even more code
    break;
}

Dies kann mit neu geschrieben werden, wenn / sonst ohne Verlust Konstrukte überhaupt in meiner Meinung nach.

Mein letztes Wort: bleiben Sie weg von Durchfall Fall wie in dem schlechten Beispiel Etikett, es sei denn, Sie Legacy-Code pflegen, wo dieser Stil verwendet wird und gut verstanden

.

Leistungsstarke und gefährlich. Das größte Problem bei Durchfall ist, dass es nicht eindeutig ist. Zum Beispiel, wenn Sie häufig bearbeiten Code stoßen, die einen Schalter mit Falldurch hat, wie Sie wissen, das ist gewollt und nicht ein Fehler?

überall ich es verwenden, stelle ich sicher, dass es richtig kommentiert:

switch($var) {
    case 'first':
        // fall-through
    case 'second':
        i++;
        break;
 }

Mit Durchfall wie im ersten Beispiel eindeutig in Ordnung ist, würde ich es nicht ein echter Durchfall betrachtet.

Das zweite Beispiel ist gefährlich und nicht offensichtlich (wenn nicht ausführlich kommentiert). Ich lehre meine Schüler nicht solche Konstrukte zu verwenden, wenn sie es den wert betrachten, um es einen Kommentarblock zu widmen, der beschreibt, dass dies ein absichtlicher Durchfall ist, und warum diese Lösung ist besser als die Alternativen. Dies hält schlampig Gebrauch, aber immer noch macht es in den Fällen erlaubt, wo es zu einem Vorteil verwendet wird.

Dies ist mehr oder weniger entspricht dem, was wir in Raumfahrtprojekten haben, wenn jemand die Codierung Standard verletzen wollte. Sie hatten für Fügung anzuwenden (und ich wurde er über das Urteil zu beraten)

Ich mag es nicht meine switch Aussagen fallen durch - es viel zu fehleranfällig und schwer zu lesen ist. Die einzige Ausnahme ist, wenn mehrere case Aussagen alle tun genau das gleiche.

Wenn es einige gemeinsame Code ist, die mehrere Zweige einer switch-Anweisung verwenden möchten, ich extrahieren, dass in eine separate gemeinsame Funktion, die in jeder Filiale aufgerufen werden kann.

In einigen Fällen unter Verwendung von Falldurch ist ein Akt der Faulheit auf dem Teil des Programmierers - sie eine Reihe von verwenden könnten || Aussagen, zum Beispiel, sondern eine Reihe von ‚Catch-allen‘ -Schalter Fällen verwenden.

Davon abgesehen, habe ich finde sie besonders hilfreich sein, wenn ich weiß, dass schließlich Ich werde die Optionen sowieso benötigt (zum Beispiel in einer Menü-Antwort), habe aber noch nicht alle Entscheidungen umgesetzt. Ebenso, wenn Sie einen Durchfall sowohl für ‚a‘ und ‚A‘ tun, finde ich es wesentlich sauberer den Schalter Durchfall zu benutzen ist als eine Verbindung if-Anweisung.

Es ist wahrscheinlich eine Frage des Stils und wie die Programmierer denken, aber ich bin im Allgemeinen nicht gern Komponenten einer Sprache im Namen der ‚Sicherheit‘ zu entfernen -, weshalb ich in Richtung C neigen und seine Varianten / Abkömmlinge mehr als , sagen, Java. Ich mag in der Lage, Affen um mit Zeigern und dergleichen, auch wenn ich keinen „Grund“ zu.

Herbst Gedanken sollten nur verwendet werden, wenn sie als Sprungtabelle in einen Block von Code verwendet wird. Wenn es vor mehr Fällen ein Teil des Codes mit einer unbedingten Pause ist, wird alle Fallgruppen sollten auf diese Weise beenden. Alles andere ist "böse".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top