Bernhard: Schleifen abbrechen

Beitrag lesen

Hi!

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.

Muss ich dir natürlich grundsätzlich zustimmen, ...

Auch muss ich nicht darauf achten, ob nicht vielleicht noch die Logik durch diese Variable negiert wird.

... aber ich empfinde halt die aus dem Schleifenkopf sprechende Logik "solange (while) ich nichts (!) gefunden ($found) habe, suche ich weiter ({...})" sehr natürlich und muss da nicht viel nachdenken.

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

Naja, was soll dann sein? Dann ist halt mehr Code in dem Geltungsbereich. Du musst die Variable dann nicht mehr verwenden, wenn du sie nicht mehr brauchst. Du kannst sie natürlich z.B. für eine weitere Schleife verwenden. Der Geltungsbereich ist aber immer eine Funktion oder etwas vergleichbares (ich kenne zumindest keine Programmiersprachen, wo Schleifen außerhalb einer Funktion auftreten können) und wenn du aus der Funktion rauskommst, dann verschwinden die lokalen Variablen.

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.

Jo, da kommen wir wieder von den Schleifen weg. Aber gut; ich glaube, das Thema haben wir durch. ;-) Meine Variante von getLocale() wäre jedenfalls:

  
    public function getLocale()  
    {  
        $locale = $this->_locale;  
        if ($locale == null) { // null?  
          $locale = self::getDefaultLocale(); // dann probieren wir das  
          if ($locale == null) { // noch immer null?  
            try {  
                $locale = Zend_Registry::get('Zend_Locale'); // dann letzter Versuch  
            } catch (Zend_Exception $e) {  
            }  
          }  
        }  
        return $locale;  
    }  

while(true) sagt mir erst einmal nur, dass das eine Endlosschleife ist.

Ja, richtig. Ich habe an mein ursprüngliches Beispiel mit dem Iterator gedacht, mein Fehler.

Dass Endlosschleifen üblicherweise doch abgebrochen werden, sollte einem die Erfahrung gelehrt haben.

Hintergrundprozesse (die z.B. an Ports lauschen) o.ä. bestehen meines Wissens durchaus aus Endlosschleifen, aus denen man nicht auf saubere Art rauskommt. Ich kenne mich da aber nicht wahnsinnig gut aus und kann auf die Schnelle kein Beispiel liefern.

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.

Ok, ich bin neugierig: Wie verstehst/definierst du den Begriff "(allgemeine) Komplexität" in diesem Zusammenhang?

Grüße
Bernhard