2010-12-06 4 views
3

Ich habe über diesen Code vor kurzem kommen:Macht das Konstrukt .. während (falsch) dazu beitragen, den Fluss besser zu kontrollieren?

do { 
    if (! checkSomething()) 
     break; 

    // some code 

    if (! checkSomeOtherThing()) 
     break; 

    // some other code 
} while(false); 

// some final code 

Der Programmierer, der es geschrieben hat, um einen Kommentar entlang der Linien von "cleaner control flow" schrieb.

Meiner Meinung nach könnte der ursprüngliche Code besser aussehen, wenn er in etwas anderes umgestaltet wird. Aber gibt es eine Wahrheit in dieser Aussage? Ist dieses Konstrukt gut?

+2

In "etwas anderes". Wie genau sollen wir das beurteilen, wenn Sie nicht "etwas anderes" definiert haben? –

+1

Ich würde sagen, das ist nicht besser, als ein "Goto" -Label vor "irgendeinem endgültigen Code" zu setzen und es zu bekommen; zumindest mit goto ist das Label explizit. Dieser Code ist nur irgendwie komisch. –

+0

@ sje397 das mag wie eine Schleife aussehen, aber es ist nicht. Siehe Schleifenbedingung. – robert

Antwort

2

Wenn Sie nichts tun Schleifen mit mehreren break Aussagen, dann das einzige Problem hier ist, dass C (aus offensichtlichen Gründen) Sie nicht aus einem bloßen Block ausbrechen lassen, daher die "Non-Loop", die einige ahnungsloser zukünftiger Betreuer könnte Fehler für eine echte Schleife machen.

Die Überlegungen, glaube ich, sind:

  • wenn es nur zwei break Punkte sind, was ist so schlecht über zwei if Aussagen?
  • Wenn es mehr als zwei Haltepunkte gibt, dann kann der Eindruck mit if Anweisungen unangenehm werden, und das spart das, aber dann wieder ist die Funktion zu viel? Und selbst wenn nicht, wäre es besser, einfach goto zu verwenden und die Verrücktheit einer Schleife zu vermeiden, die keine Schleife macht?

Da Sie diese sprachunabhängig Tag, habe ich eine macroised Assemblersprache zu bedienen, mit einem block ... endblock, die Sie aus brechen könnte. Dies führte zu ziemlich nett Code für die notwendigen Bedingungen überprüft, wie zB:

block 
    breakif str1 == null 
    breakif str2 == null 
    get some combined property of str1 and str2 
    breakif some other condition that stops us getting on with it 
    get on with it 
endblock 

Eigentlich war es nicht breakif str1 == null, war es breakifeq.p str1, null, oder so etwas, aber ich vergesse genau das, was.

6

Ich finde das viel einfacher zu lesen, und es erzeugt ein identisches Ergebnis:

if (checkSomething()) 
{ 
    // some code 
    if (checkSomeOtherThing()) 
    { 
     // some other code 
    } 
} 
// some final code 

Ich denke do ... while normalerweise schwer zu folgen, wobei jedoch ist es für etwas anderes als eine Schleife bestenfalls irreführend.

+2

Und ich finde das viel schwieriger. Ich ziehe es vor, die Kontrolle so früh wie möglich zu verlassen. Das ist ziemlich subjektiv. –

+0

Während ich denke, dass dieser Code harmlos erscheinen kann, wenn es mehr Unterbrechungen im ursprünglichen Stück gibt, wird es viel schlimmer machen. Aber ich stimme zu, dass das "do ... while (false) construct" sehr irreführend ist. – javs

3

Dies entspricht einer goto.

In solchen Situationen ist es besser, einen goto als einen hässlichen Hack zu verwenden.

es ein goto macht es viel besser lesbar zu verwenden, ändern:

if (!checkSomething()) 
    goto Done; 

// some code 

if (!checkSomeOtherThing()) 
    goto Done; 

// some other code 
Done: //some final code 
+1

Nein, das ist nicht gleichbedeutend mit einem Goto. Goto kann überall hingehen. Dies wird immer nur bis zum Ende der Schleife gehen. Du kannst auch behaupten, dass goto immer besser ist als "break" oder "continue", was einfach Wahnsinn ist. –

+0

@Noon, @robert: Ich weiß, dass 'Goto' für das Böse benutzt werden kann. In diesem Fall macht ein "Goto" die Absicht jedoch viel klarer als eine Schleife. – SLaks

+2

Ein 'Goto' geht auch an einen Ort: Ein Label. Eine explizit benannte und beschreibende Bezeichnung. Die Einführung einer Nicht-Schleife hier, nur um 'break' zu verwenden, als eine dünn getarnte' goto' matschig das Problem und ist ehrlich gesagt die * schlechteste * mögliche Wahl. –

0

Ich habe die do-while gesehen Form als Standard übernommen, an die Programmierer angepasst. Der Vorteil ist, dass es kommuniziert und implementiert, dass die Schleife immer mindestens einmal ausgeführt wird. Dies hilft, konsistent die Situationen zu isolieren, in denen etwas anderes auftritt, d. H. Wo der Code in der Schleife nicht ausgeführt wird.

Dieser Standard wurde angenommen, weil die Warnier-Orr-Technik angewendet wurde.

+0

Ich stimme nicht mit dem Kommunikationsteil überein: Dort wurde ein Kommentar geworfen, der mir tatsächlich mitteilte, was der Typ mit dem 'do ... while (false); Sie können besser kommunizieren, indem Sie diesen Codeabschnitt benennen, indem Sie ihn in eine Funktion einfügen. – javs

Verwandte Themen