php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.01.2009, 15:21  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard Decorator

Hallo,
ich probiere mich grade am Decorator:
PHP-Code:
class cCar
{
    private 
$price;
    function 
getPrice()
    {
        return 
500;
    }
    
    function 
drive()
    {
        return 
"drive!";
    }
}

class 
cCarAngebot
{
    protected 
$cCar;
    function 
__construct(cCar $cCar)
    {
        
$this->cCar $cCar;
    }
    
    function 
getPrice()
    {
        return 
$this->cCar->getPrice() * 0.95;
    }
}

$cCar = new cCar();
echo 
$cCar->getPrice(); // 500
echo $cCar->drive(); // 500

$cCarAngebot = new cCarAngebot(new cCar());
echo 
$cCarAngebot->getPrice(); // 475
echo $cCarAngebot->drive(); // Crash 
Die Funktion getPrice wird "überschrieben" jedoch verliert das Objekt auch auch die Funktion drive(); welches ja eigentlich nicht sein sollte, welche lösung gibt es hier ? - bzw was habe ich vergessen ? habt ihr Umsetzungen des Patterns die man sich mal anschauen kann ?
notyyy ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.01.2009, 15:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Code:
extends cCar
Und sinnvollerweise sollt cCar->getPrice() auch $this->price zurückgeben.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 16.01.2009, 16:02  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

danke,
war mir nicht sicher ob ich das pattern wirklich verstanden hatte
notyyy ist offline   Mit Zitat antworten
Alt 16.01.2009, 16:59  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Sofern du den "Umweg" über Dekoratoren nicht magst, kannst du dir überlegen, ob du mit OutputProvidern arbeiten möchtest. Mit diesen kannst du die Attribute eines Objekts formatiert ausgeben. Registrierst du einen OutputProvider für ein definiertes Attribut nicht, wird dieses "einfach so" zurückgegeben. Diese Methodik ist insbesondere für die Generierung von Domain-Objekt-Ausgaben interessant.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 16.01.2009, 17:12  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Und wo werden die Provider hinterligt? Im Objekt und dann mit Zuordnung Eigenschaft => Provider oder irgendwie global? Hat Du nen guten Link dazu?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 16.01.2009, 19:30  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo nikosch,

es gibt zwei Möglichkeiten das umzusetzen:

A) Direkte Ausgabe
PHP-Code:
$object = new MyObject();
$object->setOutputProvider('property1',new propertyOneOutputProvider());
...
echo 
$object->getOutput(); 
B) Indirekte Ausgabe
PHP-Code:
$object = new MyObject();
$outputHelper = new OutputHelper();
$outputHelper->setOutputProvider('property1',new propertyOneOutputProvider());
...
$outputHelper->setInput($object);
echo
$outputHelper->getOutput(); 
Beides erweitert den Decorator um ein wenig mehr Flexibilität, da sich die OutputProvider wiederverwenden lassen. Der Provider selbst implementiert folgendes Interface:

PHP-Code:
interface OutputProvider
{
   function 
getOutput($object){
   }

Klar wie ich das meine?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 16.01.2009, 19:41  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ja, ok. Das habe ich gemeint.

Ich hatte allerdings in B vermutet, dass $object->getOutput(); vielleicht eher direkt den OutputHelper (statisch) anspricht:
Bei new MyObject(); seinen OutputProvider selbst dort hinterlegt,
Bei get getOutput() bspw. seine Instanz ($this) übergibt und die Ausgabe initiiert.

Allerdings sehe ich hier auch die entstehende Abhängigkeit: MyObject müßte den OutputHelper kennen und voraussetzen...
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 16.01.2009, 20:48  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Zitat:
Zitat von notyyy Beitrag anzeigen
Die Funktion getPrice wird "überschrieben" jedoch verliert das Objekt auch auch die Funktion drive(); welches ja eigentlich nicht sein sollte, welche lösung gibt es hier ? - bzw was habe ich vergessen ? habt ihr Umsetzungen des Patterns die man sich mal anschauen kann ?
Code:
500drive!475<br />
<b>Fatal error</b>:  Call to undefined method cCarAngebot::drive()
So wie erwartet. Wenn du drive() verwenden willst musst du sie delegieren (weiterreichen).
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 16.01.2009, 20:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.994
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Naja, extends macht^ das automatisch.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online   Mit Zitat antworten
Alt 17.01.2009, 00:23  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Ich hab eine Weile gebraucht bis ich verstanden habe wo der unterschied zwischen decorieren und erweitern ist. Es kommt auf die Situation an. Auf jeden Fall geht es hier um den Decorator, wenn du mit mir die Unterschiede disktutieren willst, les dir etwas an und wir diskutieren das in einem anderen Thread ;D
__________________
Phoscur ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Decorator pattern: 'protected' und parallele vererbung axo PHP-Fortgeschrittene 5 20.10.2005 15:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php decorator, php decorator pattern, decorator php, decorator pattern php, php decorators, decorator in php, decorator pattern, php outputprovider, php5 decorator pattern, decorater pattern php, decorator 2000, decorater php, php decoratern pattern, php dekorator, php decorater, php decortor, php5 decorator, dekorator php, decorator php5, decorators in php

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum