Ankündigung

Einklappen
Keine Ankündigung bisher.

OOP- Design-Frage

Einklappen

Neue Werbung 2019

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

  • OOP- Design-Frage

    Hallo zusammen,

    mal angenommen es gibt folgende Domain-Objekte

    Shop
    Betriebsferien
    Feiertag

    Die Objekte Shop und Betriebsferien stehen in einer 1:n oder has_many Beziehung zueinander (ein Shop kann mehrmals Betriebsferien haben, bzw. mehrere Betriebsferien-Objekte beinhalten). Eine Beziehung zwischen Feiertag und Shop gibt es erst mal nicht.

    Nun will ich in meinem Shop-Objekt eine Funktion implementieren, die mir sagt ob der Shop heute geöffnet ist. Um das Beispiel nicht zu verkomplizieren ist der Shop außer an Feiertagen und während der Betriebsferien immer geöffnet:

    PHP-Code:
    public function istGeoeffnet() {
        if(
    Betriebsferien->hatHeuteBetriebsferien($this->id ) || Feiertag->istHeuteFeiertag()) {
            return 
    false;
        }

        return 
    true;

    Um diese Prüfung durchzuführen muss ich somit auf die Objekte Feiertag und Betriebsferien zugreifen können. Für das Objekt Betriebsferien könnte ich im Shop-Objekt auch direkt eine entsprechende Eigenschaft definieren, schließlich handelt es sich strenggenommen um eine Komposition (Shop-Betriebsferien brauchen immer einen Shop). Ich könnte die Betriebsferien entweder direkt im Konstruktor laden, oder mittels Lazy Init erst nach Bedarf:

    PHP-Code:
    class Shop {
        protected 
    $_betriebsferien null;

        public function 
    getBetriebsferien() {
            if(
    $this->_betriebsferien === null)  {
                
    $this->_betriebsferien = new Betriebsferien($this->id);
            }
            return 
    $this->_betriebsferien;
        }

    Ich denke, es spricht soweit nichts dagegen das so zu machen.

    Jetzt bräuchte ich also nur noch das Feiertag-Objekt. Um an das Feiertag Objekt zu kommen, könnte ich mir folgende Möglichkeiten vorstellen:

    - ich übergebe es direkt im Konstruktor new Shop(new Feiertag());
    Damit schaffe ich aber eine sehr starke Abhängigkeit zwischen Objekten/Klassen die normalerweise nichts voneinander wissen müssen,
    außerdem benötige ich das Objekt nur bei einer Methode, die ich vielleicht nicht immer brauche wenn ich mit einem Shop-Objekt arbeite


    - Stichwort DI, ich übergebe das Feiertag-Objekt mit einer dafür vorgesehenen Setter-Methode $shop->setFeiertag(new Feiertag());
    Vorteil: lose Kopplung zwischen beiden Klassen
    Nachteil: die Methode isGeoeffnet() würde fehlschlagen, wenn der Client nicht zuvor das Feiertag-Objekt selbst übergeben hat. D.h. Ich würde beim Client ein Wissen um die Abhängigkeiten im Inneren eines Shop-Objektes voraussetzen.


    - Ich erzeuge das Feiertag-Objekt direkt in der Methode isGeoeffnet(), also nur dann wenn ich es wirklich brauche

    PHP-Code:
    public function istGeoeffnet() {
        
    $feiertag = new Feiertag();
        
    $betriebsferien this->getBetriebsferien;
        if(
    $betriebsferien->hatHeuteBetriebsferien() || $feiertag->istHeuteFeiertag()) {
            return 
    false;
        }

        return 
    true;

    Nachteil: die Abhängigkeit zwischen der Shop-Klasse und einer konkreten Implementierung der Feiertag-KLasse wird größer
    Vorteil: Das Feiertag-Objekt wird erst dann erzeugt wenn es benötigt wird und der Client muss sich nicht selbst um das Laden des Feiertag-Objektes kümmern, benötigt somit kein Wissen über die Abhängigkeiten im Inneren eines Objektes.

    Mein Favorit wäre die letztgenannte Lösung. Man könnte sich zusätzlich noch überlegen, ob diese Prüfung grundsätzlich im Verantwortungsbereich eines Shop-Objekts liegen sollte? Möglicherweise wäre es besser die Prüfung komplett in eine Extra-Klasse auszulagern? Aber wer sollte es eigentlich besser wissen, ob ein Shop gerade geöffnet ist, als der Shop selbst

    Mich würde mal interessieren wie Ihr darüber denkt und ob Ihr evtl. noch andere Möglichkeiten/Ideen sieht.

    vg
    jack
    -

  • #2
    Ich würde ein Strategy-Objekt hier implementieren das ich dem Shop per setter nach dem Instanziieren gebe ( wenn ich denn überhaupt die öffnungszeit nach der Shop-Instanziierung abfragen will ). Das Strategy-Object würde wärend seiner Initialisierung Feiertag und Betriebsferien geliefert bekommen und relativ zum angefragten / heutigen Tag zurückliefern ob geöffnet oder nicht.

    Wie genau du das Strategy-Objekt nun in deine Klasse und wie du die Repositories für Feiertage und Betriebsferien in die Strategy-Umgebung bringst hängt von deiner aktuellen Implementierung ab.

    Alternativ könntest du das Strategy-Objekt auch vor der Instanziierung des Shops erzeugen und den Shop an die Strategy Komponente übergeben, sodas diese dann den Zustand Geöffnet / nicht Geöffnet an den Shop übergibt.
    [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


    • #3
      Mit Verlaub, ich habe den Verdacht, Du hast viele Vokabeln mal aufgeschnappt, aber deren Bedeutung nicht verinnerlicht.
      - ich übergebe es direkt im Konstruktor new Shop(new Feiertag());
      Damit schaffe ich aber eine sehr starke Abhängigkeit zwischen Objekten/Klassen die normalerweise nichts voneinander wissen müssen,
      - Stichwort DI, ich übergebe das Feiertag-Objekt mit einer dafür vorgesehenen Setter-Methode
      Das erstzitierte ist DI. Eine starke Abhängigkeit entsteht nicht durch den Konstruktor, sondern dadurch, dass Du eben eine Komposition/Aggregation vornimmst.


      Was Du komplett ausklammerst ist die Konfiguration des Feiertags-Objekts. Feiertage sind Bundesland- und Jahres-abhängig, folglich kannst Du das Objekt nicht einfach aus der leeren instanziieren, ohne dass der erzeugende Kontext diese Informationen vorhält. Und damit ebenfalls eine Unabhängigkeit nicht gewährleistet ist. Ergo: DI ist der Way-to-go. Setter oder Konstruktor ist dabei völlig egal. Siehe auch meine Diskussion zu OOP-Parametern.

      Noch was: Die Trennung in Ferien und Feiertage finde ich extrem unglücklich. Warum nicht eher ein Öffnungszeiten-Objekt schaffen?
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Ich würde das Klassendesign für Feiertage anders angehen: Eine Klasse "Feiertag" mit Methode "istHeuteFeiertag" ist schonmal falsch benannt, da ein Objekt offenbar nicht einen Feiertag repräsentiert sondern Informationen über alle Feiertage hat (die global gelten? Alle Shops in einem Bundesland?)

        Ich skizziere es mal mit Interfaces:
        PHP-Code:
        interface Feiertag {
          public function 
        setzeDatum(DateTime $datum);
          public function 
        gibDatum();
        }

        interface 
        HatFeiertage {
          public function 
        fuegeFeiertagHinzu(Feiertag $feiertag);
          public function 
        entferneFeiertag(Feiertag $feiertag);
          public function 
        gibFeiertage();
          public function 
        hatFeiertag(DateTime $datum);
          public function 
        istHeuteFeiertag();

        Ich habe mal versucht, statt dem Deutsch-Englisch-Mischmasch die Methodennamen konsequent deutsch zu schreiben und stelle wieder fest, dass Englisch die bessere Sprache zum Programmieren ist


        Sinn des ganzen ist, ein Objekt mit Feiertag-Collection zu erstellen, das alle relevanten(!) Feiertag-Datensätze vorhält und die entsprechenden Prüfmethoden zur Verfügung stellt. Du schreibst zwar
        Eine Beziehung zwischen Feiertag und Shop gibt es erst mal nicht.
        aber genau das sehe ich schon als Fehler. Der Shop selbst sollte zwar nicht "HatFeiertage" implementieren aber eine Klasse "Bundesland" könnte dies z.B. tun, wobei ein Shop wiederum mit einem Bundesland assoziiert ist. Und wenn du es dir erstmal einfach machen willst, da überall die selben Feiertage gelten, machst du so etwas:
        PHP-Code:
        class Shop
        {
          public function 
        __construct()
          {
            
        $this->feiertagContainer AlleFeiertageSingleton::getInstance();
          }

        [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
        [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

        Kommentar


        • #5
          Dann doch lieber ne Factory, die einem die konkreten Feiertage für eine Region gibt
          PHP-Code:
          $regionaleFeiertage FeiertagFabrik::gibRegionaleFeiertage(new Bundesland('Hessen')); 
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            PHP-Code:
            class Shop
            {

               public function 
            __construct()
               {
                  
            $this->businessHourStrategy Registry::get('tools::business_hour_strategy');
               }

               public function 
            isBusinessHourDateTime $startDate nullDateTime $endDate null )
               {
                  if ( 
            null === $startDate ) {
                     
            $user Registry::get('user::userIdentity');
                     
            $startDate date_create('today'$user->getTimezone());
                  }
                  
                  
            $strategy $this->businessHourStrategy;
                  if ( 
            $strategy->isHoliday($startDate$endDate) || $strategy->isFeastDay($startDate$endDate) ) {
                     return 
            false;
                  }

                  return 
            true;
               }


            [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


            • #7
              Vielen Dank erst mal für die vielen Antworten - man seid Ihr schnell!

              Eigentlich haben die Details zur Implementierung des Feiertag-Objektes mit dem eigentlichen Problem nicht direkt etwas zu tun (das Beispiel dient jedoch nur der Veranschaulichung wie man es evtl. machen könnte, bitte nagelt mich nicht gleich fest wenn ich irgendwo etwas weggelassen oder übersehen habe $db->query($sql)..)


              PHP-Code:
              class Feiertag {
                  protected 
              $_data = array();
                  
                  public function 
              __construct($datum null) {
                      if(
              is_null($datum)) {
                          
              // Select bundesland, feiertag From Feiertage WHERE datum = today()
                      
              } else {
                          
              //Select bundesland, feiertag From Feiertage WHERE datum = $datum
                      
              }
                      
              $this->_setFeiertagData($resulSet);

                      protected function 
              _setFeiertagData($resulSet) {
                          if(
              is_array($resulSet)) {
                              foreach(
              $resulSet as $feiertag) {
                                                  
              $this->_data[$feiertag["bundesland"]] = $feiertag["feiertag"];
                              } 
                          }
                      } 
                  
                      public function 
              istHeuteFeiertag($bundesland) {
                          if(
              array_key_exists($bundesland$this->_data)) {
                              return 
              true;
                          }
                          return 
              false;
                      }

                  }
                   
                  class 
              Shop {
                     protected 
              $_bundesland "NRW";
                  
              $feiertag = new Feiertag(); 
                      
              $betriebsferien this->getBetriebsferien
                      if(
              $betriebsferien->hatHeuteBetriebsferien() || $feiertag->istHeuteFeiertag($this->$_bundesland)) { 
                      return 
              false
                      } 

                  return 
              true

                 } 
              @tr0y
              Das mit dem Strategy-Object finde ich sehr interessant, vielleicht ist es bis jetzt auch der sauberste Ansatz.

              Zumal das Feiertag-Objekt nicht an einen Shop gebunden sein muss. Feiertag-Informationen können im unterschiedlichen Kontext verwendet werden, z.B. als reine Info auf der Website, im Kalender etc. . Das Strategy-Object scheint mir hier bis jetzt die größte Flexibilität zu bieten. Nur das isHoliday() würde ich da evtl. rausnehmen. Shop-Betriebsferien sind im Gegensatz zu den Feiertagen immer an einen Shop gebunden und können nur in diesem Zusammenhang sinnvoll verwendet werden. Deshalb würde ich das nicht unbedingt in einem Objekt miteinander vermischen

              p.s.
              Nur mal so am Rande gefrag, was ist an dem Strategy-Object eigentlich so "Strategy"?
              Ist es in etwas nicht das Gleiche wie:

              Registry::get('Feiertag');

              Worin liegt also genau der Unterschied zwischen einem Strategy-Object und einem normalen Registry-Eintrag?
              -

              Kommentar


              • #8
                http://de.wikipedia.org/wiki/Strategie_(Entwurfsmuster)
                [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


                • #9
                  Diese Seite existiert nicht
                  Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                  Kommentar


                  • #10
                    Jetzt aber, der URL-Transport unserer höchstheiligen Forensoftware verschluckt leider Teile der URL wenn bestimmte Zeichen ( schließende Klammern ) enthalten sind.
                    [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


                    • #11
                      OK, ich versuche das mal "kurz" zusammenzufassen:

                      @Nikosch
                      empfiehlt eine Übergabe des Feiertag-Objektes per DI, entweder per Konstruktor-Injection oder per Setter-Injection

                      @fab
                      empfiehlt eine Instanziierung des Feiertag-Objektes direkt im Konstruktor mittels Singelton

                      @try
                      schlägt eine Lösung mit einem Strategy-Objekt

                      Bei Nikosch sehe ich folgende Punkte kritsch:

                      - Konstruktor-Injection:
                      Die Shop-Klasse erwartet nun immer eine Feiertag-Instanz. Das Shop-Objekt wird also unter Umständen mit Funktionalität ausgestattet, die es gar nicht benötigt:

                      PHP-Code:
                      $shop = new Shop(new Feiertag());
                      $shop->setOwner("Big Boss");
                      $mapper = new ShopMapper();
                      $mapper->save($shop); 

                      - Setter-Injection
                      Hier kann das Shop-Objekt zwar erst nach Bedarf mit einem Feiertag-Objekt befüllt werden, der Client muss sich jedoch selbst darum kümmern, dass das Feiertag-Objekt zum richtigen Zeitpunkt übergeben wird. Das ist in etwa so, als ob ich zuerst ein Telefonbuch an die Telekom schicken müsste, bevor ich bei der Telefonauskunft anrufen kann

                      Bei fab wird das Feiertag-Objekt direkt im Kontruktor erzeugt. Hier sehe ich ehrlich gesagt das Gleiche Problem wie bei einer Konstruktor-Injection + eine zusätzliche Einschränkung durch die konkrete Implementierung. (Um das Feiertag-Objekt auszutauschen ist eine Änderung der Shop-Klasse notwendig) .

                      @try
                      Ich habe mir den Wiki-Artikel jetzt mal in ruhe durchgelesen und glaube, dass Du mit Deiner Strategy-Implementierung ein paar Sachen durcheinander bringst. Ein Strategy-Pattern benötigt zuerst mal eine einheitliche Schnittstelle wie z.B.

                      PHP-Code:
                      interface iFeiertag {
                          public function 
                      isHeuteFeiertag($bundesland);

                      Alle Feiertag-Startegy-Objekte müssen dieses Interface implementieren:

                      PHP-Code:
                      class FeiertagStrategy1 implements iFeiertag {

                          public function 
                      isHeuteFeiertag($bundesland) {
                              
                      // Berechnungsmethode 1 // 
                          
                      }
                      }

                      class 
                      FeiertagStrategy2 implements iFeiertag {

                          public function 
                      isHeuteFeiertag($bundesland) {
                              
                      // Berechnungsmethode 2 // 
                          
                      }

                      Damit ist gewährleistet, dass jedes Feiertag-Strategy-Objekt über eine Methode isHeuteFeiertag() verfügt. Nun ist es sehr einfach die Feiertag-Objekte auszutauschen, wenn z.B. eine andere Feiertag-Berechnungsmethode benutzt werden soll:

                      PHP-Code:
                      class Shop {
                          protected 
                      $_feiertagStrategy null;

                          public function 
                      __construct(iFeiertag $FeiertagStrategy) {
                              
                      $this->_feiertagStrategy $FeiertagStrategy;
                          }

                          public function 
                      istGeoeffnet() {
                              
                      $feiertag $this->_feiertagStrategy;
                              
                      $betriebsferien $this->getBetriebsferien;
                              if (
                      $betriebsferien->hatHeuteBetriebsferien() || $feiertag->istHeuteFeiertag()) {
                                  return 
                      false;
                              }
                              return 
                      true;
                          }


                      Das ist, denke ich, der eigentliche Sinn eines Strategy-Patterns. Das hat jedoch strenggenommen nichts mit der eigentlichen Frage zu tun. Bei Deiner Lösung

                      PHP-Code:
                         public function __construct()
                         {
                            
                      $this->businessHourStrategy Registry::get('tools::business_hour_strategy');
                         } 
                      wird das Feiertag-Objekt (bzw. irgendein Objekt welches die Methode isHeuteGeoeffnet zur Verfügung stellt) einfach aus der Registry geladen.

                      Möglicherweise in etwa so:

                      PHP-Code:
                      class business_hour_strategy {
                          protected 
                      $_objFeiertag null;

                          public function 
                      isFeiertag($bundesland) {
                              if (
                      is_null($this->_objFeiertag)) {
                                  
                      $this->_objFeiertag = new Feiertag();
                              }
                              return 
                      $this->_objFeiertag->isHeuteFeiertag($bundesland);
                          }
                      }

                      Registry::set("tools::business_hour_strategy", new business_hour_strategy()); 
                      Nur ist das erstens kein Strategy-Pattern und zweitens ändert sich dadurch strenggenommen auch nichts an dem eigentlichen Problem, außer dass ich auf die Feiertage jetzt zusätzlich über eine Registry zugreife.

                      Im Endeffekt habe ich damit nur noch eine zusätzliche Abhängigkeit geschaffen, nämlich von der Registry.

                      vg
                      jack
                      -

                      Kommentar


                      • #12
                        Dann fasse ich mal zusammen. Du suchst eine Lösung, bei der das benötigte Objekt weder übergeben, noch im Kontext erzeugt wird. Na, das ist wirklich vielversprechend.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          das wäre ja einfach Möglicherweise wäre es auch so am besten.
                          -

                          Kommentar


                          • #14
                            Zitat von jack88 Beitrag anzeigen
                            @fab
                            empfiehlt eine Instanziierung des Feiertag-Objektes direkt im Konstruktor mittels Singelton
                            Damit tust du mir Unrecht. Das Singleton sollte eine Quick and Dirty Möglichkeit aufzeigen, falls du eben nichts austauschen willst (aufgrund deiner Aussage, zwischen Shops und Feiertagen bestünde noch keinerlei Beziehung) und du alle Feiertage erstmal(!) global zur Verfügung stellen willst.

                            Der Kern meines Beitrags war das HatFeiertage-Interface, was z.B. mit einer Datenbank von Bundesländern und Feiertagen realisiert werden kann. Und das sind dann alles ganz normale Beziehungen zwischen Models (erwünschte Abhängigkeiten!), mit Injektion von irgendwelchen Services hat das gar nichts mehr zu tun.

                            Code:
                            Shop (n)---->(m) Bundesland (n)---->(m) Feiertag
                            [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                            [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                            Kommentar


                            • #15
                              Wie willst du das sonst lösen als über strategische Komponenten die sich ein Interface teilen ?

                              BusinessHourStrategy ist als Namensgebung etwas falsch gewählt da geb ich dir recht, eigentlich ist es eine BusinessHourStrategyCollection als Facade implementiert das iBusinessHourStrategy-Komponenten registriert hat, somit selbst zur Strategy wird und für das aktive Bundesland eine eigene Strategy-Komponente in einer eigenen Collection relativ selektiert sowie für die eigentlichen Betriebsferien eine Strategy-Komponente kennt.

                              PHP-Code:
                              interface iBusinessHourStrategy
                              {
                                 public function 
                              checkDateDateTime $date, array $options = array() );

                              PHP-Code:
                              interface iBusinessHourStrategyCollection
                              {
                                 public function 
                              addStrategyiBusinessHourStrategy $in );

                              PHP-Code:
                              class feastDayStrategy
                                 
                              implements 
                                    
                              iBusinessHourStrategy,
                                    
                              iBusinessHourStrategyCollection
                              {

                                 protected 
                              $strategyStorage = array();

                                 public function 
                              checkDateDateTime $date, array $options = array() )
                                 {
                                    
                              // fetch user from options, fetch country from user
                                    // fetch strategy from storage relative to country
                                    // return ::checkDate()-Value of realtive strategy
                                 
                              }

                                 public function 
                              addStrategyiBusinessHourStrategy $in )
                                 {
                                    
                              $id get_class($in);
                                    if ( !isset(
                              $this->strategyStorage$id ]) ) {
                                       
                              $this->strategyStorage$id ] = $in;
                                       return 
                              true;
                                    }

                                    throw new 
                              Exception('Allready registred strategy received');
                                 }


                              PHP-Code:
                              class businessHourStrategyFacade
                                 
                              implements 
                                    
                              iBusinessHourStrategy,
                                    
                              iBusinessHourStrategyCollection
                              {

                                 protected 
                              $strategyStorage = array();

                                 public function 
                              checkDateDateTime $date, array $options = array() )
                                 {
                                    return (bool) 
                              array_sum(
                                       
                              array_map
                                          function( 
                              $in ) use ( $options ) {
                                             return (int)
                              $in->checkDate($date$options);
                                          }, 
                                          
                              $this->strategyStorage
                                       
                              )
                                    );
                                 }

                                 public function 
                              addStrategyiBusinessHourStrategy $in )
                                 {
                                    
                              $id get_class($in);
                                    if ( !isset(
                              $this->strategyStorage$id ]) ) {
                                       
                              $this->strategyStorage$id ] = $in;
                                       return 
                              true;
                                    }

                                    throw new 
                              Exception('Allready registred strategy received');
                                 }


                              P.S.: Du unterschlägst mir meine Null !
                              [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

                              Lädt...
                              X