Objekte cachen oder zur Laufzeit instanzieren?

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

  • Objekte cachen oder zur Laufzeit instanzieren?

    Für mein bevorstehendes Projekt arbeite ich gerade an der Entwicklung meiner kleinen Bibliothekensammlung (Framework). Anwendungen sollen später spielend leicht auf eine MVC- bzw. HMVC Basis aufbauen und dementsprechend leicht erweiterbar und austauschbar sein. Wie so oft möchte ich auf die Vorzüge des registry patterns nicht verzichten und habe mir dementsprechend eine Lösung implementiert.

    PHP-Code:
    <?php

    /**
     * Die Registry fungiert als Ablage für verschiedene Parameter und
     * Werte. Die Registry wird dabei als Singleton angesprochen.
     */     
    class Registry {
        
    /**
         * Singleton Instanz
         * 
         * @static     
         * @access private
         * @var    Registry
         */                        
        
    private static $instance;
        
        
    /**
         * Ablage für verschiedene Komponenten
         * 
         * @access private
         * @var    Array[Key, Value]
         */                        
        
    private $entries;
        
        
        
    /**
         * Liefert gemäß dem Singleton-Pattern eine Instanz der
         * Klasse Registry zurück.
         * 
         * @static
         * @access public
         * @return Registry
         */                                  
        
    public static function getInstance() {
            if (
    self::$instance == null) {
                
    self::$instance = new Registry();
            }
            return 
    self::$instance;
        }
        
        
    /**
         * Fügt der Ablage eine neue Komponente hinzu.    
         * 
         * @access public
         * @param  String
         * @param  Mixed
         */                         
        
    public function __set($key$entry) {
            
    $this->entríes[$key] = $entry;
        }
        
        
    /**
         * Liest den gewünschten Eintrag aus.
         * 
         * @access public
         * @param  String
         * @return Mixed
         */                             
        
    public function __get($key) {
            return 
    $this->entries[$key];
        }
        
        private function 
    __construct();
        private function 
    __clone();
    }

    ?>
    Nach der Implementierung kam mir die Idee, Objekte nicht direkt in die registry abzulegen, sondern vielleicht in verschiedene Dateien zu abzulegen und bei Bedarf dynamisch nachzuladen.

    Frage
    Wäre ein Cachevorgang für Objekte in PHP überhaupt sinnvoll bzw. wie verhält sich die Idee in Hinsicht auf die Performanz bei etwas größeren Projekten?

  • #2
    Hallo,

    ich glaube, das lässt sich so pauschal nicht beantworten. Es hängt immer davon ab, ob der Dateizugriff wirklich schneller ist als der Zugriff auf die Live-Daten. Dann kommt noch der Overhead für die Prüfung hinzu, ob die gecacheten Daten noch aktuell sind. Evtl. ist auch der APC für dich interessant?

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      APC ist wirklich interessant, leider scheint das nicht überall standardmäßig installiert zu sein. Schade eigentlich. Vielleicht wäre es sogar besser, dem Benutzer (Entwickler) die Möglichkeit offen zu lassen, Objekte persistent zu speichern oder nicht. Ich werde mich auf jedenfall noch weiter in APC einlesen.

      Vielen Dank

      PS: Ist es erlaubt, stabile Versionen eines frameworks für andere Entwickler hochzuladen? Vielleicht möchte der ein oder andere später darauf zurückgreifen.

      Kommentar


      • #4
        Zitat von Anyone Beitrag anzeigen
        PS: Ist es erlaubt, stabile Versionen eines frameworks für andere Entwickler hochzuladen? Vielleicht möchte der ein oder andere später darauf zurückgreifen.
        Du meinst hier im Forum? Da gibt es die Rubrik Scripte
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von Anyone Beitrag anzeigen
          Vielleicht möchte der ein oder andere später darauf zurückgreifen.
          mach erst aus
          Code:
          private $entries;
          eine
          Code:
          private static $entries;
          passe deine __set und __get methoden entsprechend.
          um die Missverständnisse zu vermeiden, mach die Methoden __set und __get 'final'
          Slava
          bituniverse.com

          Kommentar


          • #6
            Ich kann in Slavas Beitrag leider keine Verbesserung erkennen. Den Ansatz mit der Registry finde ich auch so schon schlecht, ob da jetzt noch was mehr statisch ist oder nicht, ist am Ende sowieso Wurscht.

            Wie wäre es denn mit Inversion of Control bzw. Dependency Injection? Ist das nicht ein viel sauberer Ansatz? Vor allem kannst du dann den Code für ähnliche Aufgaben wiederverwenden, was bei diesem statischen Kram, den Singletons, Registries etc. kaum machbar ist.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Zitat von AmicaNoctis Beitrag anzeigen
              Ich kann in Slavas Beitrag leider keine Verbesserung erkennen. Den Ansatz mit der Registry finde ich auch so schon schlecht, ob da jetzt noch was mehr statisch ist oder nicht, ist am Ende sowieso Wurscht.

              Wie wäre es denn mit Inversion of Control bzw. Dependency Injection? Ist das nicht ein viel sauberer Ansatz? Vor allem kannst du dann den Code für ähnliche Aufgaben wiederverwenden, was bei diesem statischen Kram, den Singletons, Registries etc. kaum machbar ist.
              Ich verwende doch bereits Dependency Injections. Zum Beispiel:

              PHP-Code:
              class IndexController implements Controller {
                  public function 
              execute(IRequest $requestIResponse $response) {
                      
              // ...
                  
              }

              Kommentar


              • #8
                Zitat von Anyone Beitrag anzeigen
                Ich verwende doch bereits Dependency Injections.
                Wofür ist dann diese Registry gut? Vielleicht verwendest du DI nicht durchgehend und konsequent?
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Zitat von AmicaNoctis Beitrag anzeigen
                  Wofür ist dann diese Registry gut? Vielleicht verwendest du DI nicht durchgehend und konsequent?
                  Wie sollte ich denn auch Dependency Injections konsequent verwenden? Vor meinen MVC-Triaden ist ein Front-Controller geschaltet, der automatisch eine gewünschte MVC-Einheit anspricht (analysiert aus der URL) und eine von der Schnittstelle 'IController' vorgegebene Methode (execute(IRequest $request, IResponse $response)) ausführt. Wie soll ich dann bitte Objekte über Methoden (automatisch) weiterreichen lassen, wenn jedes Modul Objekte unterschiedlicher Anzahl und Typen verwenden muss?

                  Kommentar


                  • #10
                    PHP Dependency Injection

                    Kommentar


                    • #11
                      Zitat von AmicaNoctis Beitrag anzeigen
                      Ich kann in Slavas Beitrag leider keine Verbesserung erkennen. Den Ansatz mit der Registry finde ich auch so schon schlecht, ob da jetzt noch was mehr statisch ist oder nicht, ist am Ende sowieso Wurscht.
                      Wir können über Sinn und Unsinn von Registry, als auch über andere Entwurfsmuster sprechen, aber wenn wir uns für die Registry entscheiden, dann muss es auch funktionieren.

                      Ich finde es nicht besonders toll wenn die Registry in den Klassen vorkommt, die überschrieben sein können.
                      Bei 'fianl' Klassen oder bei 'Main' würde ich nicht gerne auf 'Registry' verzichten.
                      Slava
                      bituniverse.com

                      Kommentar


                      • #12
                        Danke, dieser Beitrag hat mich wirklich zum Nachdenken angeregt. Wahrscheinlich werde ich darauf zurück greifen...

                        PS: Könnte man vielleicht eine Art Container für Fabriken erstellen, mit denen auch zur Laufzeit neue Fabriken hinzugefügt werden können? Weil so könnte gewährleistet werden, dass man nicht ständig bestehenden Code ändern muss um neue Fabrikmethoden zu erstellen.

                        Edit: Irgendwie gefällt mir der Ansatz eines DI-Containers nicht wirklich gut. Ich meine, dieser ist doch dann wieder an konkrete Implementierungen gebunden?
                        Zuletzt geändert von Anyone; 27.05.2010, 16:16.

                        Kommentar


                        • #13
                          Hmmmnnn ... das wird aber wohl dauern bis das jeder begriffen hat ...
                          carpe noctem

                          [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                          [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                          Kommentar


                          • #14
                            Hi Anyone,

                            Du sagtest Eingangs, dass Du dynamisch Objekte laden möchtest, was eher an ein Plugin-Pattern erinnert. Im selben Atemzug redest Du von Caching was damit wiederum nichts zu tun hat.

                            Wenn ich Dich richtig verstehe, hast Du z.B. einen BuchController und einen MusikController denen Du bspw. ein nachträglich eingeführtes Kaffee-Objekt zuspielen möchtest und beiden sofort klar ist, um welches Objekt es sich handelt, was das Objekt kann und was damit zu machen ist?

                            Das Problem beim Factory- oder dem Plugin-Pattern ist, dass die Schnittstelle fest definiert wird. Darum wird es eher schwierig einfach mal so Funktionen hinzuzufügen, ohne dabei tiefer in den existierenden Code einzugreifen.

                            Gruß,
                            tr-oo-per

                            Kommentar

                            Lädt...
                            X