Ankündigung

Einklappen
Keine Ankündigung bisher.

Interface in Klasse richtig benutzen, Strategie Pattern

Einklappen

Neue Werbung 2019

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

  • Interface in Klasse richtig benutzen, Strategie Pattern

    Hallo und guten Morgen an alle.

    Ich bin dabei eine Übung zu machen. Ich sollte mich dazu über das Strategier Pattern informieren und habe da auch einiges gelesen. Ich habe es vom Prinzip her auch verstanden. Ich sollte dazu ein UML Diagramm machen, das habe ich auch getan. Eine Grafik dazu findet ihr im Anhang.

    Da ich auch das Buch PHP Design Patterns lese habe ein daran angelehntes Beispiel genommen (ich sollte mir selber ein Beispiel dazu aussuchen, mir wurde da keins vorgegeben).

    Nun bestand meine Aufgabe auch darin das UML dann in PHP Code umzusetzen, was ich auch versuchte und der Meinung bin bis zum jetztigen Punkt richtig gemacht zu haben.

    Ich bin bei der Klasse die das Interface letzendlich benutzen soll und übergebe das Interface da via Type Hinting. Nur jetzt hapert es daran das ich nicht weis wie ich das dann da anwenden soll, so das eben je nach Bedarf ein anderes Verhalten auftritt ohne das mit ein haufen IF Abfragen umzusetzen.

    Der Sinn des Strategie Patterns ist das Algorythmen je nach Verhalten austauschen kann ohne die Algorythmen in der Klasse fest zu setzen sondern von der benutzenden Klasse (den benutzenden Klassen) lose zu koppeln bzw. los zu lösen und die Algorythmen auszulagern.

    In meinem Beispiel sind zwar keine kompletten Algorythmen sondern nur einfache Werte die aber auf das Gesamtergebnis in der Endrechnung der letzten Klasse Einfluss haben. Ich denke ich habe das soweit umgesetzt das die festen Werte ausgelagert sind. Aber nun weis ich eben nicht wirklich wie ich das nun flexible in der Klasse Mietberechnung einsetzen kann, so das eben je nach bedarf ein anderer Wert in die Rechnung eingenommen wird.

    Hier noch der Beispielcode. Es sind alle Klassen und das Interface in einer Datei, ich würde das im Produktiveinsatz niemals so machen, dass ist wie gesagt nur eine Übung.

    PHP-Code:
    <?php
    interface Miettagessatz {
        
        public function 
    addTagessatz();
    }

    class 
    Ts_Kleinwagen implements Miettagessatz {
        
        protected 
    $tagessatz 25;
        
        public function 
    addTagessatz () {
            
            return 
    $this->tagessatz;
        }
    }

    class 
    Ts_Mittelklasse implements Miettagessatz {
        
        protected 
    $tagessatz 45;
        
        public function 
    addTagessatz () {
            
            return 
    $this->tagessatz;
        }
    }

    class 
    Ts_Transporter implements Miettagessatz {
        
        protected 
    $tagessatz 65;
        
        public function 
    addTagessatz () {
            
            return 
    $this->tagessatz;
        }
    }

    class 
    Ts_Lkw implements Miettagessatz {
        
        protected 
    $tagessatz 125;
        
        public function 
    addTagessatz () {
            
            return 
    $this->tagessatz;
        }
    }

    class 
    Mietberechnung {
        
        protected 
    $tagessatz;
        
        public function 
    __construct(){}
        
        public function 
    getTagessatz Miettagessatz $tagessatzpreis ) {
            
            
    //hier komme ich nicht weiter hier müsste ich es einsetzen
        
    }
    }
    ?>
    Könnt ihr mir ein wenig auf die Sprünge helfen? Vielen Dank für eure Hilfe und Antworten.

    Mfg der Litter

    [EDIT]

    Ich arbeite mit StarUml und weiß nicht warum die Methode addTagessatz im Uml beim Interface nicht drin angezeigt wird. Sie ist aber definitiv da.
    Angehängte Dateien

  • #2
    Algorythmus → Algorithmus

    Nach Wikipedia so:

    PHP-Code:
    class Mietberechnung {

        protected 
    $strategy;

        public function 
    __construct(Miettagessatz $strategy)
        {
            
    $this->strategy $strategy;
        }

        public function 
    getTagessatz (  ) {

            return 
    $this->strategy->addTagessatz();
        }

    - http://en.wikipedia.org/wiki/Strategy_Pattern#PHP

    Kommentar


    • #3
      1. Algorithmus (wichtig!)
      2.
      In meinem Beispiel sind zwar keine kompletten Algorythmen sondern nur einfache Werte
      Das ist genau das Problem, was Dein Beispiel nur schwerlich zu einem Strategiepattern macht. Die Methoden sind identisch (Getter) und ein Mehrwert verschiedener Objekte ist eigentlich nicht gegeben (weil der einzige Unterschied der Inhalt der Variable ist, den könnte mna aber auch einfach über eine Parameterisierung erreichen). Sicher, ein Interface kann auch ein Objekt als ein ist-ein charakterisieren, trotzdem wäre für Dein Beispiel Strategie wohl das falsche Pattern.
      3. Warum heissen die Methoden addTagessatz?
      3.1. deutsch-englisch
      3.2. Die Methode liefert doch den TS. Der Name sollte sich auf das Objekt beziehen, nicht auf den aufrufenden Kontext.

      [edit]

      Tipp zu 2.
      Du könntest das Beispiel aufwerten, wenn Du statt Tagessatz einen Tagespreis (bzw. Preis für eine bestimmte Stundenzahl) lieferst und bspw. bei einem Wagen Staffelpreise o.ä. einführst. Ein Beispiel wären 100 Freikilometer oder 2 Stunden Mietpreis zum Sonderpreis o.ä. Für die Freikilometer müsstest Du natürlich noch (mindestens virtuell) die gefahrenen Kilometer ermitteln.

      Kommentar


      • #4
        Einleuchtender wird es evtl, wenn du in dem Interface Miettagssatz nicht einfach nur den Tagessatz zurück gibst, sondern z.B. eine Methode die den kompletten Preis berechnet. Weil ein Mietlkw wird evtl anders berechnet wie ein Mietauto.

        Ich hab das Strategiepattern anhand eines anderen, wahrscheinlich einfacheren, Beispielst kennen gelernt.
        Stell die die Strategie z.B. als KI in einem Spiel vor(z.B. leicht, mittel, schwer) jede KI hat nur die Methode machZug(), aber was dann die jeweilige KI für einen Zug macht und wie sie diesen Zug berechnet weiß nur die KI selbst.

        Hoffe das konnte noch ein bisschen Klarheit bringen

        Kommentar


        • #5
          Danke erst mal für die Antworten.

          Naja das ich da scheinbar nun doch das falsche Beispiel ausgesucht habe wird wohl an meiner absolut fehlenden Erfahrung mit den Patterns liegen, ich fange da ja grad erst mal an.

          Sollte jemand von euch vieleicht eine Beispielidee haben wo sich das Strategier Pattern besser abbilden lässt, dann immer her damit .
          Es sollte dann aber nicht wirklich gleich ein Hammer Beispiel sein wo ich noch mehr grau auf der Birne bekomme wie ich sowieso schon habe.

          Vielen Dank

          Kommentar

          Lädt...
          X