Ankündigung

Einklappen
Keine Ankündigung bisher.

Driver Pattern

Einklappen

Neue Werbung 2019

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

  • Driver Pattern

    Hallo,

    ich bin gerade dabei mich intensiver mit dem Thema der Design Pattern zu beschäftigen und wollte mal fragen ob meine Klassen richtig sind. Ich weiss nicht ob das Design Pattern wirklich "Driver" heisst, aber ich hoffe Ihr könnt mir das sagen. Was ich wissen möchte:

    1. Ist das Pattern richtig und "schön" umgesetzt?
    2. Wie bekomme ich es hin das der richtige "Handler" geladen wird? In der Session.php steht fest drin "\Dispendium\Session\FileSessionHandler". Dort muss ich aber basierend auf "self :: $strDriverName die richtige Klasse laden können.

    Als Test erstelle ich gerade eine Session Klasse die entweder die nativen Funktionen nutzt oder die Sessions in der Datenbank speichert.

    index.php
    PHP-Code:
    <?php

    use Dispendium\Session\Session;

    require_once 
    'dispendium/session/Session.php';
    require_once 
    'dispendium/session/FileSessionHandler.php';
    require_once 
    'dispendium/session/DatabaseSessionHandler.php';

    Session :: setHandler('file');

    Session :: get('1');

    ?>
    Session.php
    PHP-Code:
    <?php

    namespace Dispendium\Session;

    class 
    Session
    {
        private static 
    $objSessionHandler;

        private static 
    $strDriverName;

        public final static function 
    __callStatic($strMethod, array $arrParameter)
        {
            if (
    is_object(self :: $objSessionHandler) === false)
            {
                
    self :: $objSessionHandler = new \Dispendium\Session\FileSessionHandler(); <- siehe Frage 2
            
    }

            return (
    call_user_func_array(array(self :: $objSessionHandler$strMethod), $arrParameter));
        }

        public final static function 
    setHandler($strDriverName)
        {
            
    self :: $strDriverName $strDriverName;
        }
    }

    ?>
    FileSessionHandler.php
    PHP-Code:
    <?php

    namespace Dispendium\Session;

    class 
    FileSessionHandler
    {
        public final function 
    __construct()
        {
            
    session_start();
        }

        public final function 
    get()
        {
            
    var_dump('file handler!');
        }
    }

    ?>

  • #2
    Klingt nach dem "Adapter"-Pattern.
    Das Problem an deiner Umsetzung ist in erster Linie, dass man die Klasse bereits verwenden kann, bevor der Adapter gesetzt wurde.
    Liegt schlicht am statischen Context, den ich hierbei für ungeeignet halte.
    Mach die Angabe des Adapters zur Bedingung und nutze eine Instanz der Klasse, wahlweise durch DI oder als Singleton, wobei du beim Instanziieren des Singletons prüfst, ob bereits eine private Instanz erzeugt wurde und, falls das nicht der Fall ist und kein Adapter spezifiziert wurde, eine Exception geworfen wird.
    VokeIT GmbH & Co. KG - VokeIT-oss @ github

    Kommentar


    • #3
      Naja, die Nutzung des keywords "static" führt früher oder später immer zu Einschränkungen. Das Problem wird größer und klarer, je größer eine Applikation wird. Ich würde mich ernsthaft mit DI und IoC beschäftigen. Wenn du das Prinzip erst einmal richtig verstanden hast, wirst du mir vielleicht in folgendem Punkt zustimmen: Benutze niemals und unter keinen Umständen das static-Keyword irgendwo in deiner Applikation. Jede Lösung ist auswechselbar. Nicht jede Lösung ist in jeder Umgebung ideal.

      Kommentar


      • #4
        Realisiere einen Singleton ohne static.
        Jetzt bin ich gespannt

        Statics machen in engen Grenzen Sinn, wenn man sie korrekt einzusetzen weiß.
        Für manche DInge sind sie auch einfach unerlässlich.
        VokeIT GmbH & Co. KG - VokeIT-oss @ github

        Kommentar


        • #5
          Warum sollte ich so was wie einen Singleton überhaupt brauchen?

          Kommentar


          • #6
            Um exklusive Instanzen zu realisieren?
            Nehmen wir einen Streamwriter, das Filehandle kann immer nur einmal geöffnet werden, wie ermöglichst du ohne Singleton die Benutzung an beliebigen Stellen deiner Applikation, insbesondere wenn 3rd-Party-Module involviert sind?
            DI/IoC schön und gut, würde ich auch verwenden, aber dennoch sollte mMn die Klasse von sich aus eine effektive Beschränkung definieren.
            VokeIT GmbH & Co. KG - VokeIT-oss @ github

            Kommentar


            • #7
              Zitat von G.Schuster Beitrag anzeigen
              Realisiere einen Singleton ohne static.
              Jetzt bin ich gespannt

              Statics machen in engen Grenzen Sinn, wenn man sie korrekt einzusetzen weiß.
              Für manche DInge sind sie auch einfach unerlässlich.
              Mit Dependency Injection Container kein Problem. Wie immer Sache der Perspektive und Grundsätzlich kann man nahezu jedes Pattern anders realisieren.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                warum kein Singleton?

                vor kurzem lief auf dieses Thema ein Thread auf webgamers.de auf diese Thema raus:
                http://webgamers.de/index.php?page=T...=8902#post8902
                https://github.com/Ma27
                Javascript Logic is funny:
                [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                Kommentar


                • #9
                  Über einen DIC. Es gibt immer eine Möglichkeit auch Systemressourcen, die man nicht mehr als ein mal gleichzeitig öffnen kann über Instanzen anzubieten. Wie viele Punkte innerhalb einer größeren Applikation betrifft das?

                  Dann haben wir auf der einen Seite die singuläre Ressource und auf der anderen Seite die Lösung um mit dieser Ressource zu kommunizieren. Wird es auf Ewig bei jedem Kunden/Nutzer immer die gleiche Ressource, oder gleiche Art sein, mit dieser Ressource zu kommunizieren?

                  Kommentar


                  • #10
                    Ich denke das können wir zum tausendsten Mal zu Tode diskutieren.
                    Mir ging es lediglich um deine überspitzte Formulierung "Benutze niemals und unter keinen Umständen das static-Keyword irgendwo in deiner Applikation."
                    Nur, damit du mich jetzt nicht falsch verstehst: ich vermeide statics/Singletons auch, es sei denn, ich halte sie eben für tatsächlich angebracht.
                    Das muss dann aber jeder für sich selbst entscheiden, was er als angebracht ansieht.
                    VokeIT GmbH & Co. KG - VokeIT-oss @ github

                    Kommentar


                    • #11
                      Korrekt, derweil static ( beispielsweise in (rekursiven) closures ) auch hier und da Sinn macht. Pauschalisieren kann man da nix.
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Ich wollte damit vor allem verdeutlichen, dass 'static' fast nie zum Einsatz kommen 'muss'. Ich nehme das auch nur als Empfehlung, der ich aber auch praktisch immer folgen kann. Zudem ist PHP ja auf Grund seiner Natur nur schlecht sinnvoll mit blockierenden Ressourcen nutzbar. Meine Idealvorstellung von einer Applikation entspricht einem Schaubild vom Project Ara. Alles über Schnittstellen miteinander verbunden, jederzeit austauschbar:
                        http://www.extremetech.com/wp-conten...oject-ara1.jpg

                        Kommentar


                        • #13
                          Ich habe die Klassen nun etwas angepasst und hoffe auf erneute Diskussion und Verbesserungsvorschläge. Das Abfangen von Fehler und werfen von Exceptions habe ich bewusst noch nicht implementiert. Mir geht es nur darum ob ich das Prinzip vom Adapter Pattern und IOC/DI verstanden habe. Später wird dann ein IoC Container implementiert wie z. B. bei laravel. Ob ich das Ganze auch dahingehend progammiere das die Abhängigkeiten automatisch aufgelöst werden weiss ich noch nicht. Ich finde da verliert man zu schnell die Kontrolle, oder? Auch wenn es bequem sein mag.

                          index.php
                          PHP-Code:
                          use Dispendium\Session\Session;

                          $strConfigSessionDriver 'database';

                          $strClassName 'Dispendium\Session\\' ucfirst(mb_strtolower($strConfigSessionDriver)) . 'SessionHandler';

                          $objSession = new Session(new $strClassName);

                          $objSession->get(1); 
                          Session.php
                          PHP-Code:
                          namespace Dispendium\Session;

                          class 
                          Session
                          {
                              private 
                          $objSessionHandler;

                              public final function 
                          __construct(SessionHandlerInterface $objSessionHandler)
                              {
                                  
                          $this->objSessionHandler $objSessionHandler;
                              }

                              public final function 
                          get($strKey)
                              {
                                  return (
                          $this->objSessionHandler->get($strKey));
                              }

                          FileSessionHandler.php
                          PHP-Code:
                          namespace Dispendium\Session;

                          class 
                          FileSessionHandler implements \Dispendium\Session\SessionHandlerInterface
                          {
                              public final function 
                          get()
                              {
                                  
                          var_dump('file handler!');
                              }

                          SessionHandlerInterface.php
                          PHP-Code:
                          namespace Dispendium\Session;

                          interface 
                          SessionHandlerInterface
                          {
                              public function 
                          get();

                          Kommentar


                          • #14
                            Zitat von G.Schuster Beitrag anzeigen
                            Klingt nach dem "Adapter"-Pattern.
                            Wenn ich mir die Code-Schnipsel so ansehe, klingt das eher nach "Strategy"-Pattern.

                            Kommentar


                            • #15
                              Zitat von devlication Beitrag anzeigen
                              Ich finde da verliert man zu schnell die Kontrolle, oder?
                              Warum glaubst du das?

                              Dein Interface hat einen Fehler:
                              Zitat von devlication Beitrag anzeigen
                              PHP-Code:
                              # Interface
                              public function get(); 
                              Dagegen implementierst du:
                              Zitat von devlication Beitrag anzeigen
                              PHP-Code:
                              # Implementation
                              public final function get($strKey
                              Wenn das nur ein "Schreibfehler" war, dann ignoriere diesen Hinweis.

                              Kommentar

                              Lädt...
                              X