MB: 1: Instanzvariablen oder Funktionsparameter? 2: Überladene Funktionen?

Liebe Community,

Frage 1: Kann man mit Funktionsparameter und Instranzvariablen einer Klass "gleichberechtigt" arbeiten, mit außnahme vom Scope? Wann ist es sinnvoll eine Instanzvariable zu erzeugen und wann ein zu übergebenden Funktionsparameter?

Hintergrund: Mein Problem war, das ich alle Daten die ich benötige in Instanzvariabeln der Klasse ausgelagert habe, um damit in der Klasse arbeiten zu können. Blöd nur das die Instanzvariabeln in einer funktion einen ellen langen Rattenschwanz nach sich ziehen $this->variablennme. Parameter die nur aus buchstaben bestehen z.B. $o und vom Kommentar-Header der Funktion gut kommentiert, haben das problem nicht. Andererseit, wenn man Funktionsparameter benötigt und ganz auf Instanzvariablen verzichtet, entsteht das Problem das übergebene Variablen immerwieder weitergereicht werden.

Ich hab das Problem nur gerig fühgig gelöst und variablen die öffter von Funktionen beansprucht weden als instanzariablen deklariert.

Frage 2: kann man funktionen aufblähen mit viele Funktionsparametern und Instanzvariablen oder sollte man das der übersichtlichkeithalber in vielen kleine Funktionen abarbeiten

Ist ein sehr spannendes Thema und für mich als Anfänger schwer zu lösen.

Herzlichst Grüße MB

  1. Tach!

    Frage 1: Kann man mit Funktionsparameter und Instranzvariablen einer Klass "gleichberechtigt" arbeiten, mit außnahme vom Scope?

    Nein, beide haben ihren eigenen Einsatzzweck.

    Wann ist es sinnvoll eine Instanzvariable zu erzeugen und wann ein zu übergebenden Funktionsparameter?

    Instanzvariablen gehören dem Objekt und haben eine Funktion innerhalb des Objekts. Funktionsparameter, auch wenn es Methoden betrifft, haben den Zweck, Werte an die Funktion/Methode zu übergeben. Sie haben also eine Funktion nur für die Funktion/Methode.

    Hintergrund: Mein Problem war, das ich alle Daten die ich benötige in Instanzvariabeln der Klasse ausgelagert habe, um damit in der Klasse arbeiten zu können.

    Wenn ich Holz hacken möchte, benötige ich eine Axt. Die Axt ist kein Teil von mir sondern nur ein Werkzeug, das ich für die Funktion Holzhacken benötige. Also ist sie keine Instanzvariable sondern ein Funktionsparameter. Eigenschaften, die mich selbst beschreiben, sind hingegen Instanzvariablen.

    Blöd nur das die Instanzvariabeln in einer funktion einen ellen langen Rattenschwanz nach sich ziehen $this->variablennme.

    Das darf kein Parameter fürs Programmieren sein. Du solltest ncht für den Computer oder deine eigene Arbeitserleichterung schreiben, sondern so, dass ein anderer das Programm leicht lesen und verstehen kann. Zu "ein anderer" zählst auch du selbst in drei Wochen.

    Parameter die nur aus buchstaben bestehen z.B. $o und vom Kommentar-Header der Funktion gut kommentiert, haben das problem nicht.

    Parameter, die eine sprechenden Namen haben, brauchen keine Dokumentation desselben. Sie brauchen dann nur eine Dokumentation zu ihrem Sinn und was für Werte sie entgegennehmen.

    Frage 2: kann man funktionen aufblähen mit viele Funktionsparametern und Instanzvariablen oder sollte man das der übersichtlichkeithalber in vielen kleine Funktionen abarbeiten

    Ich denke, du weißt die Antwort schon selbst, denn du hast deine Zweifel ja schon dadurch ausgedrückt, dass du einen zweiten Teil in der Frage formuliert hast, indem auch eine Begründung für das Vorgehen steckt. Gegenfrage: Was liest sich einfacher, Bandwurmsätze oder mehrere kleinere?

    dedlfix.

    1. Ahoi!

      Frage 1: Kann man mit Funktionsparameter und Instranzvariablen einer Klass "gleichberechtigt" arbeiten, mit außnahme vom Scope?

      Nein, beide haben ihren eigenen Einsatzzweck.

      Gut ein Punkt weg. Muss ich ein bisschen umdenken

      Wenn ich Holz hacken möchte, benötige ich eine Axt. Die Axt ist kein Teil von mir sondern nur ein Werkzeug, das ich für die Funktion Holzhacken benötige. Also ist sie keine Instanzvariable sondern ein Funktionsparameter. Eigenschaften, die mich selbst beschreiben, sind hingegen Instanzvariablen.

      Kannst du mir n einfaches konkretes beispiiel geben?

      Das darf kein Parameter fürs Programmieren sein. Du solltest ncht für den Computer oder deine eigene Arbeitserleichterung schreiben, sondern so, dass ein anderer das Programm leicht lesen und verstehen kann. Zu "ein anderer" zählst auch du selbst in drei Wochen.

      Gut das hat man mir auf anderem wege auch geasagt. Das leuchtet mir ein. wenn ich ein total selbsterklärendes konstrukt schreibe z.B.: new PDOException $e oder irgendetwas mit $o für Objekt das nur einmal in der gesamten klasse existiert, gilt das dann immer noch für selbstbezeichneten Variablen?

      Anmerkung: Brauch einfach ne bestätigung von Profs für die Zukuft

      Grüße MB

      1. Tach!

        Wenn ich Holz hacken möchte, benötige ich eine Axt. Die Axt ist kein Teil von mir sondern nur ein Werkzeug, das ich für die Funktion Holzhacken benötige. Also ist sie keine Instanzvariable sondern ein Funktionsparameter. Eigenschaften, die mich selbst beschreiben, sind hingegen Instanzvariablen.

        Kannst du mir n einfaches konkretes beispiiel geben?

        Ein Objekt erstellt man, weil eine Aufgabe erfüllt werden muss. Idealerweise erstellt man es so, dass die Beschreibung der Arbeitsweise ohne das Wort "und" auskommt. Das heißt, es hat eine konkrete Aufgabe und nicht mehrere.

        In einem Spiel gibt es Figuren. Eine Figur ist ein Objekt. Die Figur hat Eigenschaften, einen Namen und Bewertungspunkte beispielsweise. Das sind die Eigenschaften. Die Figuren spielen auf einem Spielfeld. Das Spielfeld braucht eine Liste der Figuren. Das ist eine Eigenschaft des Spielfelds. Auf welchem Feld eine Figur steht, ist keine Eigenschaft der Figur. Und es ist auch keine Eigenschaft des Spielfelds. Da kommt eine dritte Klasse ins Spiel, die als Eigenschaften einen Verweis auf eine konkrete Figur und dazu deren Position hat. Diese PositionierteFigur ist das, was sich das Spielfeld in seiner Liste merkt. Nun kann es vorkommen, dass eine Figur aus dem Spiel genommen werden muss. Das ist eine Methode des Spielfelds. Im einfachsten Fall ist die Liste nur ein Array, das vom Spielfeld verwaltet wird. (In anderen Systemen nimmt man jedoch sowas wie eine List(e) oder Collection, und die kommen mit eigenen Verwaltungsroutinen (zum Beispiel hinzufügen, entfernen, suchen von Einträgen) daher.) Was das Spielfeld nicht hat, sind Methoden des Spiels, wie Berechnen von Zügen der Figuren. Das wäre ein "und" in der Beschreibung: "Das Spielfeld verwaltet die Figuren und berechnet die Spielzüge." Deswegen kommt da mindestens eine weitere Klasse hinzu, die sich um die Spielmechaniken kümmert.

        wenn ich ein total selbsterklärendes konstrukt schreibe z.B.: new PDOException $e oder irgendetwas mit $o für Objekt das nur einmal in der gesamten klasse existiert, gilt das dann immer noch für selbstbezeichneten Variablen?

        Wenn eine Variable einen sehr kleinen Lebensraum hat, wie die Exception-Variable im Catch-Block, also nur in einer Handvoll Zeilen von Code vorkommt, dann kann man eine Abkürzung nehmen. Besonders dann, wenn sich diese Abkürzung bereits so durchgesetzt hat, dass sie jeder Programmierer kennt, wie i als Laufvariable oder e oder ex für Exception. Aber o für Objekt ist viel zu allgemein.

        Es gibt da einen Spruch: Es gibt nur zwei schwierige Dinge beim Programmieren, Cache- Invalidation und das Benennen von Dingen. Das Ding hat doch einen Verwendungszweck, also sollte der Name diesen Verwendungszweck einigermaßen beschreiben.

        Original: There are only two hard things in Computer Science: cache invalidation and naming things. - Phil Karlton

        dedlfix.

        1. Moin!

          Es gibt da einen Spruch: Es gibt nur zwei schwierige Dinge beim Programmieren, Cache- Invalidation und das Benennen von Dingen. Das Ding hat doch einen Verwendungszweck, also sollte der Name diesen Verwendungszweck einigermaßen beschreiben.

          Original: There are only two hard things in Computer Science: cache invalidation and naming things. - Phil Karlton

          ... and off-by-one. (... und 1-daneben-gezählt - typischer Fehler bei Arrays, die entweder 0- oder 1-basiert starten und deswegen bei n-1 oder n enden und in for-Schleifen öfters falsch iteriert werden - sehr viele Sicherheitslücken resultieren daraus).

          Grüße Sven

          1. @@Sven Rautenberg

            ... and off-by-one.

            Wie die Monatsnummern in vielen Programmiersprachen.

            LLAP 🖖

            --
            „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
            „Hat auf dem Forum herumgelungert …“
            (Wachen in Asterix 36: Der Papyrus des Cäsar)
          2. Tach!

            ... and off-by-one. (... und 1-daneben-gezählt - typischer Fehler bei Arrays, die entweder 0- oder 1-basiert starten und deswegen bei n-1 oder n enden und in for-Schleifen öfters falsch iteriert werden - sehr viele Sicherheitslücken resultieren daraus).

            Ach wie gut, dass es foreach gibt und man damit gefühlt 99,999% aller Iterationsfälle abdecken kann.

            Aber du weichst vom Thema ab ;) Es ging hier eigentlich um das Benennen von Dingen.

            dedlfix.

  2. Wann ist es sinnvoll eine Instanzvariable zu erzeugen und wann ein zu übergebenden Funktionsparameter?

    Variablen ann die Instanz zu hängen macht Sinn, wenn diese nicht nur in einer Methode gebraucht werden. Argumente und Returns macht Sinn bei einmaligen Methodenaufrufen.

    In Fakt habe ich die gesamte Website-Configuration in meiner FW-Instanz, greife jedoch i.d.R. per Accessor-Method in die Eigenschaft $title = $this->eav('title', 'Neuer Titel');

    $wer_ist_eingeloggt = $this->{SESSION}{LOGINTAB}{user}; # Direct access

    Syntax evntl. abweichend.

    1. Moin!

      In Fakt habe ich die gesamte Website-Configuration in meiner FW-Instanz, greife jedoch i.d.R. per Accessor-Method in die Eigenschaft $title = $this->eav('title', 'Neuer Titel');

      $wer_ist_eingeloggt = $this->{SESSION}{LOGINTAB}{user}; # Direct access

      Syntax evntl. abweichend.

      Oh mein Gott: Als abschreckendes Beispiel für de-facto-globale Variablen ein Beitrag "so bitte nicht machen". Ich habe mit Code zu tun, der wild in größeren Datenstrukturen auf lange Pfade zugreift, wie oben demonstriert, und es ist sehr schwer zu pflegen. Sowas will man definitiv vermeiden.

      Grüße Sven

  3. Frage 1: Kann man mit Funktionsparameter und Instranzvariablen einer Klass "gleichberechtigt" arbeiten, mit außnahme vom Scope?

    Wann ist es sinnvoll eine Instanzvariable zu erzeugen und wann ein zu übergebenden Funktionsparameter?

    Das ist keine einfache Frage, die auch viel Zündstoff für Glaubenskriege bildet.

    Andererseit, wenn man Funktionsparameter benötigt und ganz auf Instanzvariablen verzichtet, entsteht das Problem das übergebene Variablen immerwieder weitergereicht werden.

    Du kannst der Funktion auch erst Mal nur einen Parameter übergeben und dann an späterer Stelle einen weiteren Parameter und so weiter, bis die Funktion alle ihre Parameter hat und du sie letztendlich aufrufen kannst. Das nennt sich partielle Applikation und ist in PHP nur etwas mühselig machbar, indem man immer eine neue Funktion erzeugt, wenn man einen Parameter kennt. Angenommen ich habe zum Beispiel eine Funktion zum Aufsummieren zweier Zahlen:

    function sum ($a, $b) {
      return $a + b;
    }
    

    Und irgendwann weiß ich nun, dass die erste Zahl eine 3 sein muss. Dann kann ich mir an dieser Stelle eine neue Funktion ableiten, die zu jeder Zahl einfach drei addiert. Nun merke ich mir nicht mehr die Zahl drei, sondern die Funktion $sum3:

    $sum3 = function ($b) { return sum(3, $b) }
    

    Wenn ich im späteren Programmverlauf dann festelle, dass die zweite Zahl eine 7 sein muss, kann ich die Funktion $sum3 mit 7 als Parameter aufrufen:

    $result = $sum(7); // 10
    

    Das ist ein wesentlicher Baustein der funktionalen Programmierung. Das ist ein Paradigma, das im Gegensatz zur Objektorientierung dafür bekannt ist, sehr modulare und wiederverwendbare Programme hervorzubringen, die häufig in einem Bruchteil der Zeit entwickelt werden können. Die Kosten dafür sind ein eher unvorhersehbares Perfromance-Modell und enorm hohe Abstraktion. Gebraucht wird sie beispielsweise bei Programmen, die während ihrer Lebenszeit eine sehr hohe Evolution aufweisen, z.B. Spamm-Filter, die ständig atkuell gehalten werden müssen um ihre Aufgabe effektiv bewältigen zu können. Oder aber, bei sehr kritischen Systemen aus dem Katastrophenschutz und Finanzwesen, bei denen Software-Fehler unfassbar teuer werden.

    PHP ist nun leider sehr schlecht für diese Form der Programmierung geeignet. Wenn das für dich interessant klingt, dann kann ich dir nur empfehlen dich mit einer Programmiersprache aus diesem Bereich zu beschäftigen, da wären zum Beispiel: PureScript, Haskell, Idris oder Coq. Unabhängig davon, ob du in deinem beruflichen Alltag wirklich jemals mit einer dieser Sprachen arbeiten wirst, wirst du auf jeden Fall einen Haufen neuer und sehr eleganter Lösungsstrategien kennenlernen von denen du auch in der objektorientierten Programmierung profitieren wirst.

  4. Frage 2: kann man funktionen aufblähen mit viele Funktionsparametern und Instanzvariablen oder sollte man das der übersichtlichkeithalber in vielen kleine Funktionen abarbeiten

    Du kannst Funktionen sogar so überlagern, dass sie mit oder ohne Instanz aufgerufen werden können, wie untenstehendes Perl-Beispiel zeigt:

    sub sid{
        my $self = shift || main->new(cookieabfrage => 1);
        my %cookies = CGI::Cookie->fetch;
        my $id = defined $cookies{$cookiename} ? $cookies{$cookiename}->value : do{
            $self->{NOCOOKIE} = 'Browser sendet keinen Cookie, bitte Seite neu laden...';
            '';
        };
    
        if($id){
            $self->{SID} = $id;
            return $id;
        }
        else{
            return if $self->{cookieabfrage};
            $self->{SID} = Methods->makesid;
            $self->header("Set-Cookie" => "$cookiename=$self->{SID}");
            return $self->{SID};
        }
    }
    

    In jedem Fall wird eine so erzeugte Session-ID zur Instanz-Variablen, was jedoch nur einen Effekt hat, wenn beim Aufruf der Funktion tatsächlich eine Instanz übergeben wurde. Ansonsten wird eine Attrappe (Mock) benutzt.

    1. Sorry, ich kann mit perl nix anfangen. ich hab mich grad mit php angefreundet, das reicht ersteinmal.

      Wo du grad dabei bist deinen Code vorzustellen interessiert mich ternary operator. sehr schön, handlich, und kompakt.

      Frage: wo verwende ich einen ternary operator und wo weniger?

      Grüße MB

      1. Hallo,

        Wo du grad dabei bist deinen Code vorzustellen interessiert mich ternary operator. sehr schön, handlich, und kompakt.

        ja, ich mag ihn auch gern. :-)

        Frage: wo verwende ich einen ternary operator und wo weniger?

        Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.
        Nicht da, wo du abhängig von einer Bedingung zwei völlig verschiedene Anweisungen ausführen willst.

        So long,
         Martin

        1. Tach!

          Frage: wo verwende ich einen ternary operator und wo weniger?

          Fragen erkennt der des Lesens kundige an einem am Satz angehängten Fragezeichen. Man muss sie nicht noch anderweitig einleiten.

          Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.

          Kein Anwendungsfall sind aber die zwei booleschen Werte true und false, denn diese ergeben sich bereits aus dem Ergebnis der Bedingung selbst.

          dedlfix.

          1. Hallo,

            Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.

            Kein Anwendungsfall sind aber die zwei booleschen Werte true und false, denn diese ergeben sich bereits aus dem Ergebnis der Bedingung selbst.

            selbstverständlich, ich käme nicht auf die Idee, diese beiden komplementären Werte mit dem ternären Operator aufzudröseln. Das wäre der gleiche Unsinn wie if ($bedingung==true) - wobei aber der Vergleich auf Identität mit === wiederum sinnvoll sein kann.

            So long,
             Martin

        2. Frage: wo verwende ich einen ternary operator und wo weniger?

          Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.
          Nicht da, wo du abhängig von einer Bedingung zwei völlig verschiedene Anweisungen ausführen willst.

          Hehe, in welche Kategorie falle ich hiermit?

          $a = function () { /* Mach etwas völlig verschiedenes von $b */ };
          $b = function () { /* Mach etwas völlig verschiedenes von $a */ };
          
          ($aOderB ? $a : $b)();
          

          @Christian Kruse oder @dedlfix ist es möglich hier das Latex-Paket http://www.ctan.org/pkg/simpsons zu installieren? Ich hätte hier zu gerne einen Mr. Burns platziert

          1. Hi,

            Frage: wo verwende ich einen ternary operator und wo weniger?

            Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.
            Nicht da, wo du abhängig von einer Bedingung zwei völlig verschiedene Anweisungen ausführen willst.

            Hehe, in welche Kategorie falle ich hiermit?

            $a = function () { /* Mach etwas völlig verschiedenes von $b */ };
            $b = function () { /* Mach etwas völlig verschiedenes von $a */ };
            
            ($aOderB ? $a : $b)();
            

            das ist klar Fall 1: Du willst eineń von zwei Werten, wobei der Wert ein Funktionsobjekt ist, und die dadurch referenzierte Funktion dann aufrufen.
            Zugegeben, das ist ein gemeines Beispiel. :-)

            Und normalerweise würde man den ternären Operator hier nicht benutzen, sondern eine herkömmliche, traditionelle if-Abfrage.

            So long,
             Martin

            1. das ist klar Fall 1:

              Ich bewundere deinen Pragmatismus, ich habe ein bischen gehofft den Philosophen in dir herauskitzeln zu können ;)

            2. Tach!

              Frage: wo verwende ich einen ternary operator und wo weniger?

              Immer da, wo du abhängig von einer Bedingung einen von zwei unterschiedlichen Werten bekommen willst.
              Nicht da, wo du abhängig von einer Bedingung zwei völlig verschiedene Anweisungen ausführen willst.

              Hehe, in welche Kategorie falle ich hiermit?

              $a = function () { /* Mach etwas völlig verschiedenes von $b */ };
              $b = function () { /* Mach etwas völlig verschiedenes von $a */ };
              
              ($aOderB ? $a : $b)();
              

              das ist klar Fall 1: Du willst einen von zwei Werten, wobei der Wert ein Funktionsobjekt ist, und die dadurch referenzierte Funktion dann aufrufen.

              Der Teil nach dem "und", der Aufruf also, ist nicht mehr Bestandteil des vom ternären Operator berechneten Ausdrucks. Für den spielt nur der Inhalt des ersten Klammernpaares eine Rolle. Somit wird von ihm eindeutig eine von beiden Funktionsreferenzen zurückgegeben, also einer von zwei Werten. Damit fällt das Beispiel in die erste Kategorie.

              Und normalerweise würde man den ternären Operator hier nicht benutzen, sondern eine herkömmliche, traditionelle if-Abfrage.

              Da bin ich mir nicht sicher. Ein PHP-Programmierer, der eher kaum bis gar nicht funktionial programmiert, wird das vermutlich mit if machen. Der erfahrene Javascript-Programmierer hätte mit der funktionalen Weise keine Probleme, der kennt sowas beispielsweise von IIFE-Konstrukten.

              dedlfix.

          2. Hehe, in welche Kategorie falle ich hiermit?

            $a = function () { /* Mach etwas völlig verschiedenes von $b */ };
            $b = function () { /* Mach etwas völlig verschiedenes von $a */ };
            
            ($aOderB ? $a : $b)();
            

            In die Kategorie der Unerfahrenen.

            $aOderB ist nicht vorbelegt, einer der unverzeihlichsten Fehler die garantiert Probleme auslösen und dass Funktionsdefinitionen Codereferenzen erzeugen, die grundsätzlich und völlig egal von dem was eine Funktion tut immer wahr sind im boolschen Sinne, sollte sich auch irgendwann mal rumsprechen.

            1. @@pl

              In die Kategorie der Unerfahrenen.

              Deren hervorstechender Vertreter wer wäre?

              $aOderB ist nicht vorbelegt

              Wenn es das denn wäre, würde es dann denn weder als true noch als false gewertet werden?

              Die programmatische Dreifaltigkeit: true, false, hotti.

              LLAP 🖖

              --
              „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
              „Hat auf dem Forum herumgelungert …“
              (Wachen in Asterix 36: Der Papyrus des Cäsar)
              1. $aOderB ist nicht vorbelegt

                Wenn es das denn wäre, würde es dann denn weder als true noch als false gewertet werden?

                Variable vorbelegen und obenstehende Frage ist eindeutig geklärt.

                1. @@pl

                  $aOderB ist nicht vorbelegt

                  Wenn es das denn wäre, würde es dann denn weder als true noch als false gewertet werden?

                  Variable vorbelegen und obenstehende Frage ist eindeutig geklärt.

                  Variable nicht vorbelegen und obenstehende Frage ist auch eindeutig geklärt.

                  LLAP 🖖

                  --
                  „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
                  „Hat auf dem Forum herumgelungert …“
                  (Wachen in Asterix 36: Der Papyrus des Cäsar)
                  1. @@pl

                    $aOderB ist nicht vorbelegt

                    Wenn es das denn wäre, würde es dann denn weder als true noch als false gewertet werden?

                    Variable vorbelegen und obenstehende Frage ist eindeutig geklärt.

                    Variable nicht vorbelegen und obenstehende Frage ist auch eindeutig geklärt.

                    Hab ich Dir auch schon erklärt, dass das erfahrungsgemäß zu Problemen führt. Ergo ist das ganze Konstrukt von 1up praktisch unsinnig und ein eindeutiges Indiz für einen unerfahrenen Programmierer.

                    1. Tach!

                      $aOderB ist nicht vorbelegt

                      Wenn es das denn wäre, würde es dann denn weder als true noch als false gewertet werden?

                      Variable vorbelegen und obenstehende Frage ist eindeutig geklärt.

                      Variable nicht vorbelegen und obenstehende Frage ist auch eindeutig geklärt.

                      Hab ich Dir auch schon erklärt, dass das erfahrungsgemäß zu Problemen führt. Ergo ist das ganze Konstrukt von 1up praktisch unsinnig und ein eindeutiges Indiz für einen unerfahrenen Programmierer.

                      OMG!

                      Dann denk dir zwei Fälle. Einer hat $aOderB mit true vorbelegt und der zweite mit false.

                      dedlfix.

                    2. Hi,

                      Hab ich Dir auch schon erklärt, dass das erfahrungsgemäß zu Problemen führt. Ergo ist das ganze Konstrukt von 1up praktisch unsinnig und ein eindeutiges Indiz für einen unerfahrenen Programmierer.

                      Ein erfahrener Programmierer hätte erkannt, daß es sich hier um ein auf das wesentliche reduziertes Beispiel handelt. Wie die Bedingung zustandekommt, ist für das, was 1unitedpower zeigen wollte, absolut irrelevant.

                      cu,
                      Andreas a/k/a MudGuard

                      1. Die bedingte Ausführung über Funktionsreferenzen abzuwickeln ist ein schlechter Stil, dem gerade Unerfahrene oft verfallen. Besser ist eine handelsübliche Kontrollstruktur so zu verwenden, dass es gut ersichtlich ist, welche Funktion unter welcher Bedingung ausgeführt wird. zb

                        if( $fw->param ){
                           $fw->execute('control');
                        }
                        else{
                           $fw->execute('browse');
                        }
                        

                        Schöne Grüße.

                        1. Hallo pl,

                          Die bedingte Ausführung über Funktionsreferenzen abzuwickeln ist ein schlechter Stil, dem gerade Unerfahrene oft verfallen. Besser ist eine handelsübliche Kontrollstruktur so zu verwenden, dass es gut ersichtlich ist, welche Funktion unter welcher Bedingung ausgeführt wird. zb

                          [ ] du hast verstanden, was @1unitedpower sagen wollte

                          Eigentlich wäre es mal wieder Zeit für eine Merkbefreiung. Bitte gib dir doch wenigstens Mühe zu verstehen, was andere dir sagen wollen, und versuche dem argumentativ zu begegnen. IdR will dir keiner persönlich was; auch wenn du das anders wahrnimmst.

                          LG,
                          CK

                          1. Hallo pl,

                            Die bedingte Ausführung über Funktionsreferenzen abzuwickeln ist ein schlechter Stil, dem gerade Unerfahrene oft verfallen. Besser ist eine handelsübliche Kontrollstruktur so zu verwenden, dass es gut ersichtlich ist, welche Funktion unter welcher Bedingung ausgeführt wird. zb

                            [ ] du hast verstanden, was @1unitedpower sagen wollte

                            Ja klar, den seine Frage hab ich doch schon längst beantwortet. Gerne nochmal: Sein Beispiel zeigt für welchen Zweck der ternary op erfahrungsgemäß ungeeignet ist.

                            Sicher kannst Du Codereferenzen so zuweisen, aber es ist nicht gleich ersichtlich, welche Funktion letztendlich ausgeführt wird. Und wenn Du dass gleich untendrunter schreiben willst, kannst Du auch gleich eine handelsübliche Kontrollstruktur verwenden (siehe mein Beispiel).

                            Weißt du, ich gebe hier nur Erfahrungen weiter. Das mache ich gerne. GGf. jedoch sind meine Erwartungen zu hoch, was das Verständnis meiner Ausführungen insbesondere incl. Codebeispielen betrifft.

                            1. Weißt du, ich gebe hier nur Erfahrungen weiter. Das mache ich gerne. GGf. jedoch sind meine Erwartungen zu hoch, was das Verständnis meiner Ausführungen insbesondere incl. Codebeispielen betrifft.

                              Solche Pöpelei ist auch nicht gerade professionell.

                              1. Hallo pl,

                                Solche Pöpelei ist auch nicht gerade professionell.

                                Mit Pöbelei hat das wenig zu tun, nur mit offen zur Schau gestellter Verwirrung.

                                Wenn du solche Reaktionen öfter hervor rufst würde ich dir raten, dein Kommunikationsverhalten zu überdenken. Wenn einen niemand versteht gibt es drei Möglichkeiten:

                                1. man ist ein Genie und anderen so weit voraus, dass sie nicht in der Lage sind einem zu folgen
                                2. man kommuniziert schlecht, etwa indem man Begriffe anders verwendet als common sense oder indem man Gedankengänge weglässt, oder, oder, oder
                                3. man hat gerade einen kapitalen Bock geschossen

                                Zu entscheiden welche der drei Möglichkeiten hier am Wahrscheinlichsten zutrifft ist nun deine Aufgabe. Ich gebe dir noch einen Tip: Möglichkeit 1 ist sehr häufig nicht die wahrscheinlichste Möglichkeit.

                                LG,
                                CK

                            2. Hallo pl,

                              Ja klar, den seine Frage hab ich doch schon längst beantwortet. Gerne nochmal: Sein Beispiel zeigt für welchen Zweck der ternary op erfahrungsgemäß ungeeignet ist.

                              Du hast es immer noch nicht verstanden. Ich versuche mal, es dir zu erklären:

                              • Martin hat die Empfehlung ausgesprochen, den ternary operator nur zur Auswahl zwischen zwei Werten einzusetzen. Man solle ihn nicht verwenden, um zwei unterschiedliche Anweisungen auszuführen.
                              • Daraufhin hat @1unitedpower ein Beispiel gepostet, der einen Grenzfall darstellen könnte und um eine Kategorisierung innerhalb von Martins Empfehlung gebeten.
                              • Sein Posting wurde eingeleitet mit „Hehe, …“

                              Beachte, dass vielleicht Humor im Spiel sein könnte, ersichtlich aus zweierlei: der Einleitung („hehe“) sowie dem offensichtlich unsinnigen Beispiel mit der Bitte um Kategorisierung.

                              Jetzt kommst du daher und unterstellst ihm, dass er einen Anfängerfehler beginge und stufst ihn als unerfahren ein. Daraufhin gibt es ein wenig Geplänkel und @dedlfix klärt dich auf was es damit auf sich hat. Du änderst deine Strategie und behauptest nun nicht mehr, dass es ein Anfängerfehler sei weil $aOderB nicht definiert ist (offensichtlich irrelevant weil es sich um einen Beispiel-Ausschnitt handelt), sondern weil zwei unterschiedliche Code-Pfade durch einen ternary operator beschritten werden (offensichtlich unsinnig weil genau das hier den verdammten Witz ausmacht).

                              Es gibt meines Erachtens nach jetzt zwei Möglichkeiten:

                              1. du bist merkbefreit
                              2. du hast einen Rochus auf @1unitedpower und willst ihm einen reinwürgen
                              3. ???
                              4. Profit!

                              (Ja, bei Punkt 3 und 4 handelt es sich um einen Scherz)

                              Weißt du, ich gebe hier nur Erfahrungen weiter. Das mache ich gerne. GGf. jedoch sind meine Erwartungen zu hoch, was das Verständnis meiner Ausführungen insbesondere incl. Codebeispielen betrifft.

                              Deine latenten Andeutungen und Herabwürdigungen, andere Menschen seien doof und dir unterlegen machen dich nicht sympatischer.

                              LG,
                              CK

                    3. @@pl

                      Hab ich Dir auch schon erklärt, dass das erfahrungsgemäß zu Problemen führt. Ergo ist das ganze Konstrukt von 1up praktisch unsinnig und ein eindeutiges Indiz für einen unerfahrenen Programmierer.

                      Das war jetzt das *g* zum Wochenanfang und du hast vergessen, den Betreff zu ändern‽

                      LLAP 🖖

                      --
                      „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
                      „Hat auf dem Forum herumgelungert …“
                      (Wachen in Asterix 36: Der Papyrus des Cäsar)
            2. Tach!

              $a = function () { /* Mach etwas völlig verschiedenes von $b */ };
              $b = function () { /* Mach etwas völlig verschiedenes von $a */ };
              
              ($aOderB ? $a : $b)();
              

              In die Kategorie der Unerfahrenen.

              Das ist eher deine Kategorie.

              $aOderB ist nicht vorbelegt, einer der unverzeihlichsten Fehler die garantiert Probleme auslösen

              Man kann in dem Beispiel davon ausgehen, dass $aOderB in diesem booleschen Kontext einen ebensolchen Wert erzeugt.

              und dass Funktionsdefinitionen Codereferenzen erzeugen, die grundsätzlich und völlig egal von dem was eine Funktion tut immer wahr sind im boolschen Sinne, sollte sich auch irgendwann mal rumsprechen.

              Kann vielleicht sein, aber von den drei Werten $aOderB, $a und $b wird nur $aOderB, sprich: der Wert vor dem ?, nach Boolean konvertiert (falls es kein Boolean ist). Die beiden Werte vor und nach dem : werden zwar ausgewertet, aber dessen Ergebnis ohne weitere Konvertierung zurückgegeben. Somit ist das Ergebnis des ersten Klammernpaares dieses Beispiels eine Funktionsreferenz und kein boolescher Wert. In welchen booleschen Wert Funktionsreferenzen konvertiert werden, spielt in dem Beispiel keine Rolle.

              dedlfix.

          3. Hallo 1unitedpower,

            @Christian Kruse oder @dedlfix ist es möglich hier das Latex-Paket http://www.ctan.org/pkg/simpsons zu installieren? Ich hätte hier zu gerne einen Mr. Burns platziert

            Das $$\LaTeX$$-Rendering wird dier über MathJax gemacht. Wenn es dort Features gibt, die ich noch freischalten kann, dann kann ich das gerne machen; wenn nicht, dann kann ich leider auch nichts machen.

            LG,
            CK

      2. Moin!

        Wo du grad dabei bist deinen Code vorzustellen interessiert mich ternary operator. sehr schön, handlich, und kompakt.

        Frage: wo verwende ich einen ternary operator und wo weniger?

        Du vermeidest ihn am besten.

        Der ternäre Operator sieht so aus, wie ein "IF/ELSE", ist es aber nicht. Er ist eigentlich eine mathematische Funktion, genauer eine Funktion mit Fallunterscheidung: "Wenn eine Bedingung wahr ist, gibt den einen Ausdruck zurück, sonst den anderen".

        $ergebnis = $bedingung ? $ausdruckWahr : $ausdruckFalsch;
        

        Wenn dein Code, so wie oben aufgeschrieben, nicht länger als eine Zeile mit max. 80 Zeichen ist, kannst du den ternären Operator verwenden. Wenn die Zeile länger wird, nimm explizites "IF/ELSE".

        Der Grund ist Lesbarkeit. Ternäre Operatoren sind extrem kompakt. Deswegen haben sie eine hohe Informationsdichte, und beim Lesen des Codes bleiben wichtige Details gerne mal unentdeckt. Obendrein ist die Evaluationsreihenfolge bei Kombination von zwei oder mehr ternären Operatoren nicht so ganz offensichtlich.

        Andererseits gibt es mit PHP 7 endlich den Null-Coalesce-Operator, und der macht ganz spezifisch Dinge deutlich kompakter, die vorher zuviel Platz und Code verbraucht haben:

        // php 5.6
        $wert = isset($_GET['param']) ? $_GET['param'] : 'nichts';
        
        // php 7.0
        $wert = $_GET['param'] ?? 'nichts';
        

        Sowas will man definitiv haben - es ist in Datenbanken beispielsweise auch implementiert als COALESCE()-Funktion, und liefert, von vorne nach hinten durchgesucht, den ersten Wert, der nicht NULL ist.

        In PHP triggert man bei Zugriff auf nichtexistente Variablen oder Arrayindices keine Notice - das ist also ein guter Weg, um Default-Werte im Code zuzuweisen.

        Grüße Sven

    2. Moin!

      Frage 2: kann man funktionen aufblähen mit viele Funktionsparametern und Instanzvariablen oder sollte man das der übersichtlichkeithalber in vielen kleine Funktionen abarbeiten

      Du kannst Funktionen sogar so überlagern, dass sie mit oder ohne Instanz aufgerufen werden können, wie untenstehendes Perl-Beispiel zeigt:

      Ich finde es nicht sinnvoll, auf eine PHP-Frage mit Perl-Code zu antworten.

      Grüße Sven