Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit verschachtelten Funktionen

Einklappen

Neue Werbung 2019

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

  • ballotade
    hat ein Thema erstellt Probleme mit verschachtelten Funktionen.

    Probleme mit verschachtelten Funktionen

    Hallo Leute,

    langsam fluppt es bei mir. Jetzt eine Frage, bei der es nicht ums Überleben geht, sondern um schreibtechnische Ökonomie.
    Ich wollte gestern bei einer sehr umfangreichen Funktion, jene Teile, die sich 1 zu 1 wiederholen in eine verschachtelte Funktion schreiben nach diesem Strickmuster:
    PHP-Code:
    function Hauptfunktion()
    {
          function 
    Hilfsfunktion();
         {
                 
    Codeder oft vorkommt...
          }

          
    viel Code;
          
    Hilfsfunktion();
          
    noch mehr Code;
          
    Hilfsfunktion();
          
    usw....

    Leider funktioniert das nicht, weil dann eine Fehlermeldung kommt nach dem Motto: Function Hilfsfunktion() kann nicht redeklariert werden.
    Für den genauen Wortlaut, müßte ich das nochmal umbauen und nochmal starten. Vielleicht wißt ihr ja, was ich meine und wo das Problem ist?

    Ich kann es übrigens nicht so einfach in eine "externe" Funktion schreiben, weil der Code, den ich in diese verschachtelten Funktion packen will, auf die lokalen Variablen dieser Hauptfunktion zugreifen muss. Er verändert sie auch!

    Danke für eurer Know How und die Zeit!

  • nikosch
    antwortet
    (260 Zeilen in einer Funktion sind um EINIGE zu viele.)
    THIS.


    Und was macht diese Funktion? Den Sinn des Lebens berechnen?

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Und was macht diese Funktion? Den Sinn des Lebens berechnen? (260 Zeilen in einer Funktion sind um EINIGE zu viele.)

    Einen Kommentar schreiben:


  • ballotade
    antwortet
    Nur der vollständigkeitshalber fürs Protokoll (ihr habt ja auch ohne mich viel Spaß :

    Ich habe eine externe Funktion geschrieben mit 16 Variablen, die ihr übergeben werden und sie gibt in einem Array 8 Variablen zurück.

    Dadurch ist meine Monsterfunktion von 680 Zeilen auf 260 Zeilen geschrumpft.
    (Ich hoffe ihr mögt Zahlen )

    Wenn ich weiter bin, schaue ich mir eure Diskusson nochmal an.

    Auf jeden Fall danke für die Idee mit dem Array als Rückgabewert!!!

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Also die Frage war doch
    Ein bisschen darf man aber auch zwischen den Zeilen lesen.

    PHP-Code:
    for ($i 0$i<; ++$i) {

      switch (
    $i) {

        
    // Pre-Actions

        
    case 1:
          
    // viel Code;
          
    break;

        case 
    2:
          
    // noch mehr Code;
          
    break;

        case 
    3:
          
    // usw....
          
    break;
      }


      switch (
    $i) {

        case 
    1:
        case 
    3:
          
    // Code, der oft vorkommt...
          
    break;

        case 
    2:
          
    // Code, der auch oft vorkommt...
          
    break;
      }

    }

    // Post-Actions
    // ... 

    Einen Kommentar schreiben:


  • jack88
    antwortet
    Ja, das ist wirklich gut

    Was vor allem an der allgemeinen Fragestellung liegt. Möglicherweise ließe sich die Aufgabe sogar mit Schleifen, Rekursion und/oder break/switch lösen.
    Also die Frage war doch

    Ich wollte gestern bei einer sehr umfangreichen Funktion, jene Teile, die sich 1 zu 1 wiederholen in eine verschachtelte Funktion schreiben.
    Meine Absicht war es nicht sein Lösungskonzept in Frage zu stellen – dazu sehe ich erst mal auch keinen Grund – sondern zu zeigen wie man es in PHP umsetzen könnte. Das Arbeiten mit anonymen Funktionen halte ich grundsätzlich für keine bad practice – ganz im Gegenteil und bevor ich hier zu Klassen, includes, goto etc. greife, dann ziehe ich ganz klar PHP-Closures vor. Denn genau dazu (unter anderem natürlich) sind sie ja schließlich da.

    vg
    jack

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    function_exists – keine Ahnung wie Du das meinst?
    Es löst exakt das Problem mit dem fatal error.
    goto – ist kein Ersatz für eine Funktion,
    Wer sagt, dass die Aufgabe nur mit einer Funktion lösbar ist?
    Sprungbefehl, ändert den Programmfluss, auf biegen und brechen wahrscheinlich machbar, aber extremsts häßlich
    Klar ist das häßlich. Aber eine der wenigen Möglichkeiten, im aktuellen Scope zu arbeiten
    includes – für temporäre wegwerf-dinger?
    Und warum nicht?
    Darüber haben wir doch die ganze Zeit gesprochen?
    Haben wir das? http://de1.php.net/manual/en/functio...e-function.php

    Sehe ich nicht - zumindest keine vernünftigen.
    Was vor allem an der allgemeinen Fragestellung liegt. Möglicherweise ließe sich die Aufgabe sogar mit Schleifen, Rekursion und/oder break/switch lösen.

    Einen Kommentar schreiben:


  • jack88
    antwortet
    Es gäbe auch noch anonyme Funktionen...
    Darüber haben wir doch die ganze Zeit gesprochen?

    anonyme Funktion = Lambda = PHP-Closure

    Closure = eineFunktion die den Variablenscope einer übergeordneten Funktion in sich einschließt (ob anonym oder nicht ist dabei unerheblich, PHP-Closure != Closure)

    function_exists – keine Ahnung wie Du das meinst?
    goto – ist kein Ersatz für eine Funktion, Sprungbefehl, ändert den Programmfluss, auf biegen und brechen wahrscheinlich machbar, aber extremsts häßlich
    includes – für temporäre wegwerf-dinger?
    anonyme Funfktionen/Lambdas - unter anderem genau dafür geschaffen

    1000 Möglichkeiten...
    Sehe ich nicht - zumindest keine vernünftigen.

    vg
    jack

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Es gäbe auch noch anonyme Funktionen und [MAN]function_exists[/MAN]. GOTO und Schleifen zu benutzen wäre auch eine Möglichkeit. Oder Includes. 1000 Möglichkeiten...

    Einen Kommentar schreiben:


  • jack88
    antwortet
    Die von dir angesprochene "Lösung" ist auch für mich als "Fortgeschrittener" nicht unbedingt gut lesbar.
    Deswegen meinte ich auch:

    „nicht wirklich elegant“
    weil ich sowas

    PHP-Code:
    function() use (&$hallo) {...} 
    eben auch nicht schön finde.

    Allerdings wage ich zu bezweifeln, daß es mit „Wegwerf-Klassen“ besser/schöner wird.

    vg
    jack

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Zitat von jack88 Beitrag anzeigen
    Mit globalen Namensraum war gemeint, daß die Funktion global verfügbar ist, also von überall aufgerufen werden kann und nicht überschrieben werden kann wenn sie unter einem bestimmten Namen bereits deklariert wurde. Ob mit oder ohne Namespace spielt keine Rolle.
    Okay, dann habe ich damit falsch verstanden. Was dann da "zugemüllt" ist verstehe ich zwar nicht ganz, aber gut. Abgesehen davon das wir hier von einer Funktion sprechen.

    Wie schon gesagt, wenn man objektorientiert arbeitet kann man mit public/private auch ganz leicht den Zugriff von außen steuern. Die von dir angesprochene "Lösung" ist auch für mich als "Fortgeschrittener" nicht unbedingt gut lesbar.

    Einen Kommentar schreiben:


  • ballotade
    antwortet
    Wow, da ist ja eine echte Diskussion entbrannt.

    Ich merke, dass ich noch einiges Wissen brauche um ihr wirklich zu folgen. Was ich raushöre ist, dass es nicht so einfach geht, wie ich es gern hätte: Codefragmente 1:1 auslagern und aufrufen, wenn ich sie brauche.

    Ich lese mal zu einigen eurer Stichpunkte in meinen Büchern nach und probiere es aus.

    Ich danke euch auf jeden Fall!!!

    Einen Kommentar schreiben:


  • jack88
    antwortet
    Hat damit ja nichts zu tun. Kannst dir ja einen Namespace für die Funktion einfallen lassen.
    Mit globalen Namensraum war gemeint, daß die Funktion global verfügbar ist, also von überall aufgerufen werden kann und nicht überschrieben werden kann wenn sie unter einem bestimmten Namen bereits deklariert wurde. Ob mit oder ohne Namespace spielt keine Rolle.

    Das sollte in eine Klasse ausgelagert werden.
    Wir sprechen hier von "Hilfsfunktion()" also Wegwerf-Funktionen sozusagen die man nicht wiederverwenden will, weil sie nur in einem ganz speziellen Kontext gebraucht wird.

    vg
    jack

    Einen Kommentar schreiben:


  • Tropi
    antwortet
    Zitat von jack88 Beitrag anzeigen
    Es macht ueberhaupt keinen Sinn den globalen Namensraum mit temoraeren Helper-Funktionen zuzumuellen.
    Hat damit ja nichts zu tun. Kannst dir ja einen Namespace für die Funktion einfallen lassen.

    Allerdings liegt der Fehler wohl eher an "ellenlange Function". Diese Funktion hat wohl zu viele Verantwortlichkeiten (vor allem bei > 10 (!?) Parametern). Das sollte in eine Klasse ausgelagert werden. Ob da jetzt nur eine Instanz davon erzeugt wird oder nicht ist doch egal. (Datenbankverbindungen & Co. haben in aller Regel auch nur eine Instanz.)

    Einen Kommentar schreiben:


  • jack88
    antwortet
    Das was ich geschrieben habe gilt genauso fuer PHP (s. Beispiell php-code), nur dass es in Php nicht so oft eingesetzt wird wie in anderen Sprachen. Das hat allerdings einen "geschichtlichen" Hintergrund, weil Lambdas in Php lange nicht moeglich waren. "Closures" hat man nicht umsonst implementiert. Es macht ueberhaupt keinen Sinn den globalen Namensraum mit temoraeren Helper-Funktionen zuzumuellen.

    Vg
    Jack

    Einen Kommentar schreiben:

Lädt...
X