Coder-Knigge: if-Verschachtelung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Coder-Knigge: if-Verschachtelung

    Hallo!

    Mir liegen schon länger einige Fragen bezüglich der Stil-Gepflogenheiten beim Programmieren auf der Zunge. Eine davon:
    Soll man if-Anweisungen einzeln und schön untereinander und eingerückt verschachteln,
    oder soll man möglichst viele Einzelanweisungen, sofern es die Absicht zulässt, in eine Reihe schreiben?

    PHP-Code:
    // so...
    if ($x == 'x')
    {
       if (
    $y == 'y')
       {
          if (
    $z == 'z')
          {
             
    // code
          
    }
       }
    }

    // oder so...
    if ($x == 'x' && $y == 'y' && $z == 'z')
    {
       
    // code

    Zweitere Variante könnte bei längeren Anweisungen recht unübersichtlich werden. Zudem richtet sich die Entscheidung, ob die eine oder andere Variante anzuwenden ist, auch nach folgender Frage:
    Werden alle if-Bedingungen (zweites Beispiel), die durch ein logisches "und" verknüpft sind, ausgeführt, auch wenn die erste NICHT zutraf?
    Wenn ja, dann wäre die erste Variante wohl am besten.

    Was meint ihr?
    arrays sind klasse

  • #2
    ich würd zweiteres nehmen, wenn auch mit tabulatoren, zeilenumbrüchen und leerzeichen formatiert.

    zu deiner frage - ist doch ganz leicht zu testen:
    PHP-Code:
    <?php

    $g 
    0;

    function 
    check($a)
    {
        global 
    $g;
        
    $g++;
        return ((
    $a==2) ? false true);
    }

    if(
    check(1) && check(2) && check(3))
    {
        
    // bla
    }

    echo 
    $g;

    ?>
    oder irgendwie so.

    was kommt raus?

    Kommentar


    • #3
      Vergleichen kann man das nicht, da musst du dann schon mit elseif arbeiten.

      Aber es ist eigentlich egal. Bei deinem ersten kommt, wenn 3. true ist, aber 1. nicht, keine Antwort.

      Es ist vor allem eine Frage der Performance.
      Bevor ich nicht in einem angemessenen Alter bin, werde ich keine Witze mehr über schmalle machen!
      - Zitat Berni

      Kommentar


      • #4
        Re: Coder-Knigge: if-Verschachtelung

        PHP-Code:
        //check first condition
        if ($x != 'x') {
          
        //first condition not satisfied
          
        return;
        }

        //check second condition
        if ($y != 'y') {
          
        //second condition not satisfied
          
        return;
        }

        //check third condition
        if ($z != 'z') {
          
        //third condition not satisfied
          
        return;
        }

        //all conditions satisfied 
        warum nicht so?

        nachteile:
        - je nach standpunkt ein etwas unsauberer stil

        vorteile:
        - es werden höchstes drei bedingungen geprüft, aber nicht immer (wäre aber bei der and-Verknüpfung genauso)
        - man verschwendet nicht so viel kostbaren platz (zeilenlänge!)
        - es ist (meiner meinung nach) auf jeden fall sehr gut lesbar

        bei komlexeren sachen (wenn A und B oder C oder nicht D) geht das natürlich nicht so einfach, aber bei sowas einfachem...
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          PHP evaluiert Teilausdrücke nur, wenn der gesamte logische Ausdruck seinen Wert dadurch noch ändern könnte.
          Folgender leicht modifizierter Code von oben zeigt das:
          PHP-Code:
          <?php

          function check($val) {
              global 
          $c;
              
          $c++;
              if ((bool)
          $val) {
                  echo 
          $c.': true<br />'; return true;
              } else {
                  echo 
          $c.': false<br />'; return false;
              }
          }

          $c 0;
          if ( 
          check(true) && check(false) && check(true) ) {}
          echo (
          $c 3) ? 'short circuit<br />' 'full evaluation<br />';

          $c 0;
          if ( 
          check(true) and check(false) and check(true) ) {}
          echo (
          $c 3) ? 'short circuit<br />' 'full evaluation<br />';

          $c 0;
          if ( 
          check(true) || check(false) ) {}
          echo (
          $c 2) ? 'short circuit<br />' 'full evaluation<br />';

          $c 0;
          if ( 
          check(true) or check(false) ) {}
          echo (
          $c 2) ? 'short circuit<br />' 'full evaluation<br />';

          ?>
          Demnach ist es performanter, ein if mit einem langen Ausdruck zu basteln, statt viele aufeinanderfolgende oder verschachtelte if's. Besonders wenn die Teilausdrücke viel Laufzeit fressen.

          Die Lesbarkeit kann man imho auch mit langen Ausdrücken erhalten. Ich mach es meist wie folgt, weil ich die Struktur des Ausdrucks gut erkennen kann und auch sehe, ob alle Klammern da sind.
          PHP-Code:
          if ( evalme()
               && ( 
          evalme()
                    || 
          evalme() 
                  )
               || 
          evalme()
             ) { 
          Zuletzt geändert von onemorenerd; 08.08.2005, 08:23.

          Kommentar


          • #6
            Ich würde nicht sagen, dass es einen Standard für das Auswählen von if-Verschachtelungen gibt.

            Ich hatte vor kurzem ein Problem: Ich wollte, dass jeder User, sei es Gast oder angemeldeter User mit Cookie, der meine Seite betritt, identifiziert wird und in die DB gespeichert wird und ein Cookie und eine session_id gespeichert wird. cookie wird deswegen angelegt, damit ein Gast, der zum beispiel gestern schon auf meiner HP war, wieder erkannt wird (durch die IP, wenn möglich). Das ganze wollte ich machen, um die Userstatistik so wenig wie möglich zu verfälschen. Gelöst habe ich das ganze ungefähr so:

            PHP-Code:
            // Prüfung, ob es cookies gibt
            if( isset($_COOKIE) ){
              
            // wenn es ein Cookie mit einer user_id gibt
              
            if( isset($_COOKIE['user_id']) ){
                 
            // aktualisiere Daten
              
            }else{
                 
            // erstelle neuen DB-Eintrag und lege sämtliche Dinge an
              
            }
            // Wenn es keine cookies gibt, dann gibt es zumindest eine session_id
            }else{  
              if( isset(
            $_SESSION['user_id']) ){
                
            // aktualisiere Daten
              
            }else{
                
            // neuer Eintrag
            }

            // um jetzt zum Thema zurückzukommen: ich hätte das auch so lösen können, wie ich es normalerweise mache

            if( isset($_COOKIE) && isset($_COOKIE['user_id']) ){
              
            // blabla
            }elseif( isset($_COOKIE) && !isset($_COOKIE['user_id']) ){
              
            // blabla
            }elseif.... 
            [color=black] Important: alt bei <img> ist immer erforderlich · Strings richtig trennen/verbinden · Kiddie-Code hat keine Chance[/color]

            Kommentar


            • #7
              tomstig: du hast sicherlich recht, nur beschränkte Maranello-550 seine frage auf die formatierung und die ausführbarkeit, nicht auf die logik.

              Kommentar


              • #8
                Ist doch eigentlich ganz einfach. Jede geschweifte Klammer hat ihre eigene Zeile ganz für sich allein. Die schließende Klammer befindet sich auf der horizontalen Ebene an der selben Pos. wie die öffnende. Liegen zwischen öffnen und schließen der Klammern mehr als 30 Zeilen Code, wird die schließende Klammer mit einem kommentar versehen.
                Der Code nach einer öffnenden Klammer wir mit 2 Leerzeichen eingerückt. Wer Tabs verwendet wird entlassen
                h.a.n.d.
                Schmalle

                http://impressed.by
                http://blog.schmalenberger.it



                Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
                ... nur ohne :-)

                Kommentar


                • #9
                  Original geschrieben von schmalle
                  Ist doch eigentlich ganz einfach. Jede geschweifte Klammer hat ihre eigene Zeile ganz für sich allein. Die schließende Klammer befindet sich auf der horizontalen Ebene an der selben Pos. wie die öffnende. Liegen zwischen öffnen und schließen der Klammern mehr als 30 Zeilen Code, wird die schließende Klammer mit einem kommentar versehen.
                  Der Code nach einer öffnenden Klammer wir mit 2 Leerzeichen eingerückt. Wer Tabs verwendet wird entlassen

                  Schmalle hat nichts zu tun ...

                  *und wech*
                  Bevor ich nicht in einem angemessenen Alter bin, werde ich keine Witze mehr über schmalle machen!
                  - Zitat Berni

                  Kommentar


                  • #10
                    Original geschrieben von schmalle
                    Liegen zwischen öffnen und schließen der Klammern mehr als 30 Zeilen Code, wird die schließende Klammer mit einem kommentar versehen.
                    Oh verdammt, ich muss es kürzer/kryptischer schreiben, sonst muss ich mir noch 'nen Kommentar ausdenken...
                    Tolle Wurst...
                    Der Code nach einer öffnenden Klammer wir mit 2 Leerzeichen eingerückt. Wer Tabs verwendet wird entlassen
                    Wer Software verwendet, die nicht in der Lage ist, Tabs als x (x &isin; |&Nu; ) Leerzeichen (x frei wählbar) anzuzeigen, gehört geteert und gefedert
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar

                    Lädt...
                    X