Schleifen in der Mitte verlassen

  • Schleifen in der Mitte verlassen

    Auch wenn die Frage möglicherweise wieder ausartet würde ich doch gerne mal eure Meinung zum Thema Schleifen in der Mitte verlassen hören. Aber erst mal zwei Beispiele. Beide machen das selbe, und mich würde es auch nicht wundern wenn der Compiler für beide den selben Code ausspuckt.

    Quellcode

    1. do {
    2. rc = sasl_client_step( ... );
    3. if (rc == SASL_INTERACT) {
    4. [self doInteract];
    5. }
    6. } while (rc == SASL_INTERACT);


    Quellcode

    1. while (true) {
    2. rc = sasl_client_step( ... );
    3. if (rc != SASL_INTERACT) break;
    4. [self doInteract];
    5. }


    Welche Variante würdet ihr bevorzugen, und wieso? Ich bin mir da etwas unsicher, obwohl mir für beides einige Argumente dafür und dagegen einfallen. Aber vielleicht habe ich ja etwas übersehen.

    Die erste Variante hat den Nachteil, dass sie etwas fehleranfälliger ist, da der selbe Test zwei mal geschrieben werden muss. Außerdem hat man eine Ebene der Klammerung/Einrückung mehr was den Code auch nicht leichter lesbar/verständlich macht.

    Die zweite Variante hat für mich den Vorteil, dass sie mit weniger verschachtelten Blöcken auskommt. Dafür steht man aber erst mal vor einer Endlosschleife und muss irgendwo in der Mitte die Abbruchbedigung suchen und das ist denke ich auch nicht unbedingt optimal.

    So wirklich entscheiden kann ich mich nicht, welche Variante ich bevorzuge. Leider brauche ich das aber relativ häufig.
  • Da bist du aber auf dem Holzweg, do-while und while machen nicht das Selbe
    do-while macht auf jeden fall einen Durchgang bis zu while
    wobei eine while-Schleife gleich zu Anfang prüft
  • dergraf schrieb:

    wolf_10de schrieb:

    Da bist du aber auf dem Holzweg, do-while und while machen nicht das Selbe
    Hab ja auch nie behauptet. Allerdings machen die beiden Beispiele oben trotzdem genau das selbe.

    Nein, tun sie nicht.

    Das erste Beispiel läuft generell einmal durch, überprüft einmal den Zustand via if() und dann dieselbe Bedingung noch einmal im while().
    Sie ist eine vollkommen normale Schleife mit einer Abbruchbedingung ungeachtet des Inhalts im Schleifenkörper.
    Das zweite Beispiel ist eine Endlosschleife ohne Abbruchbedingung, die einfach mitten drin via break; verlassen wird.
    Sie machen also sicherlich nicht genau dasselbe.

    Es mag in diesem Fall aber so sein, dass sie dasselbe Ergebnis liefern. Das ist ein Unterschied.

    Ich persönlich bevorzuge die von Michael dargestellte Variante, obwohl ich Codewiederholungen nicht mag. Dementsprechend hätte ich einen Objectwrapper, der sich da selbst durchhangelt und den Resultaten entsprechende Rückgabewerte hat..

    C-Quellcode

    1. while([rc sasl_client_step] == SASL_INTERACT)
    2. {
    3. [self doInteract];
    4. }


    Schon haben wir ne schicke Schleife mit Abbruchbedingung ohne doppelten Code.
    (Ja, oftmals lassen sich Endlosschleifen vermeiden und man sollte es dann auch tun.)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Meine variante:

    Quellcode

    1. while ((rc = sasl_client_step(...)) == SASL_INTERACT)
    2. [self doInteract];


    Kira

    EDIT: Zu langsam :P


    EDIT2:

    Wenn du das 'rc' aber nur zum zwischenspeichern des return-wertes nimmst und sonst nicht brauchst reicht es natürlich auch so:

    Quellcode

    1. while (sasl_client_step(...) == SASL_INTERACT)
    2. [self doInteract];
  • Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    longW schrieb:

    Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    Ja, ich glaube Du hast mal wieder Recht.
    Wie fein hackst Du Dein Basilikum denn?

    macmoonshine schrieb:

    Ich schließe mich Michael mit einer ordentlichen Prise Amin an. ;)


    Ihr müßt eure Quote mindestens 25% der Threads im Forum mit Trash-zuzumüllen erreichen, oder?

    Diese Kommentare sind mal sowas von OffTopic, und auch der erste von Amin passt überhaupt nicht! Zumal er es schon darauf anlegt das Thema in's Sinnfreie-OffTopic zu zerren..
    Denn wie gesehen gibt es an dieser while-schleife durchaus viel zu "optimieren", dinge die der Thread ersteller sicher nicht bedacht hat oder gewusst hat das man es so schreiben kann.

    Würde man über sowas nicht nachdenken, will ich nicht sehen wie so mancher SourceCode aussehen würde.
  • Kira schrieb:

    Ihr müßt eure Quote mindestens 25% der Threads im Forum mit Trash-zuzumüllen erreichen, oder?

    Mein Beitrag ist durchaus ernst gemeint gewesen. Den Vorschlag von Michael hätte ich auch so gemacht, wenn er nicht schon da gestanden hätte. Andererseits finde ich Amins Einwand, dass sich dergraf nicht zu viele Gedanken wegen dieses Problem machen sollte auch nicht verkehrt.

    Ich glaube auch nicht, dass ich auf eine Offtopic-Quote von 25% komme.
    „Meine Komplikation hatte eine Komplikation.“
  • Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    hinterher drauf, nicht mitkochen! das macht die ganze nummer zu bitter!

    zum topic: auch wenn die schleifen in dem fall vielleicht das selbe machen, ist es doch einfach nicht das gleiche, und man sollte das verwenden was eben in der jeweiligen situation angebracht ist. möchte ich das ganze eben auf jeden fall einmal durchlaufen, brauche ich ein do-while, sonst ein while. gegen die verwendung von break; und continue; spricht ja prinzipiell gar nichts, wenn es sich also anbietet: warum nicht?
  • longW schrieb:

    Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    Ja, ich glaube Du hast mal wieder Recht.
    Wie fein hackst Du Dein Basilikum denn?

    Wenn die Mengen nicht riesig sind, dann gar nicht. (Und bei großen Mengen auch mit dem Wiegemesser.)

    In jedem Falle recht grob.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Kira schrieb:

    Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    longW schrieb:

    Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    Ja, ich glaube Du hast mal wieder Recht.
    Wie fein hackst Du Dein Basilikum denn?

    macmoonshine schrieb:

    Ich schließe mich Michael mit einer ordentlichen Prise Amin an. ;)


    Ihr müßt eure Quote mindestens 25% der Threads im Forum mit Trash-zuzumüllen erreichen, oder?

    Diese Kommentare sind mal sowas von OffTopic, und auch der erste von Amin passt überhaupt nicht! Zumal er es schon darauf anlegt das Thema in's Sinnfreie-OffTopic zu zerren..
    Denn wie gesehen gibt es an dieser while-schleife durchaus viel zu "optimieren", dinge die der Thread ersteller sicher nicht bedacht hat oder gewusst hat das man es so schreiben kann.

    Würde man über sowas nicht nachdenken, will ich nicht sehen wie so mancher SourceCode aussehen würde.


    Mein Beitrag war ernst gemeint und kein Müll.

    Die Frage ist völlig unerheblich, du bekommst so viele Meinungen wie mögliche Antworten und es gibt 9823472139912837412987 Mal Wichtigeres als das.

    Was "sowas" ist, weiß ich nicht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Und wieso hängt ihr euch alle an diesem "Die schleifen machen nicht das gleiche" auf??

    In dem beispiel vom Thread steller machen sie exakt das gleiche vom verhalten her!

    Eine do-while schleife durchläuft zwar erstmal den Code und macht DANN die abfrage, aber im prinzip macht die while(true) schleife nichts anderes (solange die if-abfrage am ende der schleife steht).

    Ich denke niemand behauptet das eine do-while schleife dasgleiche sei wie eine while-schleife. Nur eben im Fall des Thread erstellers sind beide vom resultat nunmal gleich.
  • BlackWolf schrieb:

    Amin Negm-Awad schrieb:

    Meine Variante: Die Zeit zum Nachdenken darüber sparen und dafür Gedanken über etwas Wichtigeres machen. (Zum Beispiel, wie kurz vor Schluss man Basilikum in die Tomatensauce tut.)

    hinterher drauf, nicht mitkochen! das macht die ganze nummer zu bitter!

    Neee, ein bisschen schon, damit das Öl austreten kann.

    BlackWolf schrieb:

    zum topic: auch wenn die schleifen in dem fall vielleicht das selbe machen, ist es doch einfach nicht das gleiche, und man sollte das verwenden was eben in der jeweiligen situation angebracht ist. möchte ich das ganze eben auf jeden fall einmal durchlaufen, brauche ich ein do-while, sonst ein while. gegen die verwendung von break; und continue; spricht ja prinzipiell gar nichts, wenn es sich also anbietet: warum nicht?

    Jo, für mich allenfalls eine Frage, was ich gerade im konkreten Code ausdrücken möchte. Ich tendiere allerdings zu eher wenig breaks.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Kira schrieb:

    Und wieso hängt ihr euch alle an diesem "Die schleifen machen nicht das gleiche" auf??

    In dem beispiel vom Thread steller machen sie exakt das gleiche vom verhalten her!

    Eine do-while schleife durchläuft zwar erstmal den Code und macht DANN die abfrage, aber im prinzip macht die while(true) schleife nichts anderes (solange die if-abfrage am ende der schleife steht).

    Ich denke niemand behauptet das eine do-while schleife dasgleiche sei wie eine while-schleife. Nur eben im Fall des Thread erstellers sind beide vom resultat nunmal gleich.

    Ja, sehe ich auch so. Er hat ja klargestellt, dass es in seinem Beispiel auf dasselbe hinausläuft.

    Jetzt denken jede Menge Leute über so einen Krimskrams nach, wobei die Basilikumfrage wirklich wichtiger ist.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Amin Negm-Awad schrieb:

    Mein Beitrag war ernst gemeint und kein Müll.

    Das du ihn ernst meintest nehm ich auch stark an, aber zumindest der Teil den du in Klammern geschrieben hast hat absolut NICHTS mit dem Thread zu tun und zielt lediglich darauf ab, andere dazu zu bringen darauf einzugehen und somit das ganze in's OffTopic zu zerren.

    Amin Negm-Awad schrieb:

    Was "sowas" ist, weiß ich nicht.

    Ich hoffe stark das du das nicht ernst meinst, sonst zweifle ich ernsthaft an deiner gabe Texte zu verstehen.
    Mit 'sowas' beziehe ich mich auf das Thema das Threads, genau auf das worauf du dich mit deinem "darüber" auch beziehst.
  • Michael schrieb:

    Ich würde es mit einer dritten Variante machen:

    Quellcode

    1. rc = sasl_client_step( ... );
    2. while (rc == SASL_INTERACT) {
    3. [self doInteract];
    4. rc = sasl_client_step( ... );
    5. }

    Michael

    An die Möglichkeit habe ich bis jetzt noch gar nicht gedacht. Würde in dem Beispiel gehen, nur in anderen Fällen habe ich da mehrere Zeilen Code anstelle von einem einfachem Funktionsaufruf, die ich ganz bestimmt nicht zwei mal schreiben will. Und selbst den Aufruf von sasl_client_step mit seinen 6 Parametern will ich auch nicht unbedingt wiederholen. Wenn man mehrere Zeilen hat könnte man die natürlich auch in eine eigene Funktion auslagern, aber immer ist das auch nicht angebracht.

    Kira schrieb:

    Meine variante:

    Quellcode

    1. while ((rc = sasl_client_step(...)) == SASL_INTERACT)
    2. [self doInteract];


    Abfragen mit Seiteneffekten versuche ich wo immer möglich zu vermeiden. Aber ansonsten wäre das natürlich die kürzeste Variante. Funktioniert natürlich auch nicht wenn man statt eines Funktionsaufrufes mehrere Codezeilen hat.
  • dergraf schrieb:

    Kira schrieb:

    Meine variante:

    Quellcode

    1. while ((rc = sasl_client_step(...)) == SASL_INTERACT)
    2. [self doInteract];


    Abfragen mit Seiteneffekten versuche ich wo immer möglich zu vermeiden. Aber ansonsten wäre das natürlich die kürzeste Variante. Funktioniert natürlich auch nicht wenn man statt eines Funktionsaufrufes mehrere Codezeilen hat.

    Was für Seiteneffekte siehst/befürchtest du denn da?

    Wenn du mehrere Codezeilen hast, ist da aber normalerweise trotzdem nur EINE da für eine if-bedingung. Oder wie würde bei dir eine derartige if-bedingung mit mehreren Codezeilen aussehen?