dedlfix: Schleifen abbrechen

Beitrag lesen

Hi!

Erstens hast du im Kopf das ! vergessen.

Ich wollte nur wissen, ob du aufpasst :-) Ich korrigier das mal in den Zitaten

Außerdem ist

$found = false;

while (!$found) {
  if (current($array) == ...) {
    $found = true;
  } else {
    next($array);
  }
}

  
Das sind ja nur Minimalbeispiele. Nun stell dir was Größeres und/oder Komplexeres vor, von dem deine Aufmerksamkeit schon genug in Anspruch genommen wird.  
  

> Vergleich mit deiner Variante:  
> ~~~php
  

> $found = false;  
> while (!$found) {                 while (true) {  
>   if (current($array) == ...) {    if (current($array) == ...) {  
>     $found = true;                   break;  
>   } else {                         }  
>     next($array);                  next($array);  
>   }                              }  
> }

Eingespart hast du eine aus einer schließenden Klammer bestehende Zeile (neben der booleschen Variable).

Nicht das eine Klammernpaar mit dem else ist der Punkt, sondern dass ich mich nicht um die ordnungsgemäße Behandlung der booleschen Variable zu sorgen brauche. Auch muss ich nicht darauf achten, ob nicht vielleicht noch die Logik durch diese Variable negiert wird. Und mein !-Fehler zeigt ja auch sehr schön, dass ich unbewusst eine der potentiellen Fehlerquellen erfolgreich ausgenutzt habe.

Nicht nur, dass nun eine Variable namens $found rumliegt, die man mit einem weiteren Schritt aufräumen müsste/kann
Bitte, das ist eine lokale Variable innerhalb einer Funktion, die geht ex nach Ende des Funktionsaufrufs. Speicherlecks sind da nicht zu befürchten.

Vielleicht. Was ist, wenn die Schleife nicht in der einzige Code in diesem Geltungsbereich ist?

Und dein

while (true) {

$current = current($array);

if ($current == dies)
    break;

if ($current == das)
    break;

if ($current == jenes)
    break;

next($array);
}


> würde ich als  
> ~~~php
  

> $found = false;  
> while(!$found) {  
>   if ($current == dies || $current == das || ...) {  
>    found = true;  
>   } else {  
>     next($array);  
>   }  
> }

schreiben.

Nun, das sagte ich ja, dass man das in dem einfachen/vereinfachten Fall so notieren kann. Und ich führte auch an, wann man das nicht mehr kann.

Bei keinem deiner beiden Beispiele kann ich in meinen Varianten gröbere Nachteile entdecken. Wie gesagt, ich setz mich aber auch gern mit deiner Ansicht nach möglichst fiesen Beispielen auseinander, falls du noch welche liefern möchtest.

Nein, möchte ich eigentlich nicht, da ich es für das Prinzipverständnis der möglichen Probleme auch ohne irrelevanten Füllcode verständlich finde. Aber gut, da lief mir die Tage doch ein Beispiel, wie man es nicht machen sollte, über den Weg (auch wenn ich damit wieder von Schleife auf Funktion wechsle). In ZendFramework/Controller/Router/Route.php ganz am Ende die Methode getLocale(). Abgesehen vom überflüssigen Einstellen des Codes in else-Zweige, könnte man mit zwei returns in dem try-catch-Block auskommen und kann sich das umständliche nachfolgende Auswerten sparen. Selbst wenn man die elses drinlässt und auch die Zwischenvariable im try-catch-Block, braucht es das abschließende return null; nicht. Ein einfaches return $locale; unterhalb try-catch hätte es auch getan, weil der Code sowieso keine andere Chance hat, an einem der returns vorbeizukommen.

Ja, aber das was du da im Kopf siehst, ist nur das Auswerten einer Hilfsvariable und nicht die eigentliche Abbruchbedingung. Diese steckt weiterhin im Schleifenkörper. Wenn sie wirklich im Kopf steckte, braucht es dafür weder return/break noch Hilfsvariablen/continue.
Nun ja, ich möchte mich hier nicht an der Terminologie aufhängen. Fakt ist: betrachtet man einen derartigen Schleifenkopf ohne die Variable found, dann sagt der Kopf eindeutig, dass die _gesamte_ Liste (oder das gesamte Array) durchlaufen wird. Das trifft aber nicht zu.

while(true) sagt mir erst einmal nur, dass das eine Endlosschleife ist. Dass Endlosschleifen üblicherweise doch abgebrochen werden, sollte einem die Erfahrung gelehrt haben. Also muss es da eine Abbruchbedingung geben.

Wenn für dich ein Funktionsaufruf mit (Hausnummer) 2 Parametern und möglicherweise einem Rückgabewert "Komplexität" darstellt, dann schon. Für mich sind Funktionsaufrufe keine Komplexität sondern einfach normal und gut.

Verwechsle bitte nicht die allgemeine Komplexität mit deinem Empfinden für Kompliziertheit.

Lo!