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 18.11.2011, 20:39  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard Design Pattern: Klasse mehrfach um einzelne Funktionalitäten erweitern

Hi,

ich möchte eine Klasse mehrfach um Funktionalität erweitern, konkret den ViewHelper HeadLink von Zend.

Für alle die das ZF nicht kennen: HeadLink repräsentiert eine Sammlung von <link />-Tags des Headers.

Meine Funktionalitäten sollen sein:
Merge
Minify
Cache

Merge soll mehrere <link />-Tags zu einem zusammenfassen.

Minify soll die Datei eben klein machen, also Whitespaces entfernen.

Cache soll das Ergebnis von allem cachen.

Wie nennt sich denn das Entwurfmuster um HeadLink um Funktionalität zu erweitern? Decorator, ist es ein Proxy, keines von beidem?

Den Code stelle ich mir in etwa so vor:

PHP-Code:
<?php
class Zend_View_Helper_HeadCommon extends Zend_View_Helper_Abstract {
  public function 
toString($indent 8)
  {
    
$headLink = new Zend_View_Helper_HeadLink_Decorator_Base($this->view->headLink);
    if (
$this->_mergeCss) {
      
$headLink = new Zend_View_Helper_HeadLink_Decorator_Merge($headLink);
    }
    if (
$this->_minifyCss) {
      
$headLink = new Zend_View_Helper_HeadLink_Decorator_Minify($headLink);
    }
    if (
$this->_cacheCss) {
      
$headLink = new Zend_View_Helper_HeadLink_Decorator_Cache($headLink);
    }
    return 
$headLink->toString($indent);
  }
}
?>
(statt new vermutlich eher $this->view->headDecorator($headLink), aber ist nur zur Veranschaulichung).

Als Schnittstelle schwebt mir so etwas vor:
PHP-Code:
<?php
interface Zend_View_Helper_HeadLink_Decorator_Interface
{
  public function 
getHeadLinkModificationId();
  public function 
toString($indent null);
}
?>
So könnte das Caching auch wirklich greifen, nämlich in dem Merge und Minify nur eine Quersumme aus Dateinamen und Änderungsdatum für getModificationId() zurückliefern.

Vorgehensweise gut?
Wie heißt das Pattern?

Zumindest bei Zend_Form_Decorator wird es ja ähnlich gemacht, wenn auch iterativ statt verschachtelt.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 18.11.2011, 20:53  
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

Hmm, präzise evtl. keines von beidem. Adapter w.ürde ich sagen. Oder benutzt Dein Objekt ein gemeinsames Interface mit HeadLink? (kann man hieraus nicht ersehen)

Ich würde hier vermutlich Proxy bevorzugen. Ich kenne Zend nicht so gut, aber kriegst Du die Belange denn so weit getrennt, dass Dekorieren überhaupt möglich ist?
Auf der Kehrseite sparst Du ne Menge Klassen und solange Du sowieso alles innerhalb eines Objektes erzeugst, kannst Du die Vorteile von Dekoratoren ja kaum ausspielen.
__________________
--
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 offline   Mit Zitat antworten
Alt 18.11.2011, 21:38  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Hmm, präzise evtl. keines von beidem. Adapter w.ürde ich sagen. Oder benutzt Dein Objekt ein gemeinsames Interface mit HeadLink? (kann man hieraus nicht ersehen)
Nein, die benutzen ein eigenes, daher dachte ich mir, dass ich die Basic-Klasse noch benutze, um den nachfolgenden ein gemeinsames Interface zu bieten.

Zitat:
Zitat von nikosch Beitrag anzeigen
Ich würde hier vermutlich Proxy bevorzugen. Ich kenne Zend nicht so gut, aber kriegst Du die Belange denn so weit getrennt, dass Dekorieren überhaupt möglich ist?
Auf der Kehrseite sparst Du ne Menge Klassen und solange Du sowieso alles innerhalb eines Objektes erzeugst, kannst Du die Vorteile von Dekoratoren ja kaum ausspielen.
Ja, ich habe mir jetzt mal Minify angesehen, das macht mergen, minifien und cachen wohl in einem.
Hätte sich dann auch erübrigt.

Zum Adapter: Ich dachte das wäre nur die Anpassung einer Klasse an eine feste Schnittstelle, der Hauptfokus bei mir ist ja aber vielmehr die Funktionalitätserweiterung. Wobei die Übergänge bei manchen Patterns ja fließend sind.

Evtl. hat sich mit Minify sowieso schon alles erledigt.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 18.11.2011, 22:03  
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

Zitat:
Zum Adapter: Ich dachte das wäre nur die Anpassung einer Klasse an eine feste Schnittstelle, der Hauptfokus bei mir ist ja aber vielmehr die Funktionalitätserweiterung.
Naja, stimmt auch wieder
__________________
--
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 offline   Mit Zitat antworten
Alt 20.11.2011, 15:43  
Erfahrener Benutzer
 
Registriert seit: 11.04.2011
Beiträge: 260
PHP-Kenntnisse:
Fortgeschritten
lcrash wird schon bald berühmt werden
Standard

Das was du da vor hast sind doch einfach Filter. Die kann man einfach in einen Stack hinzufügen und bei der Ausgabe wird nach einander durch-gefiltert.

Bieten die Container von Zend_View_Helper_* nicht an, aber sollte einfach sein headLink() entsprechend zu erweitern.

P.S. der bessere Weg wäre es das beim Deployment zu verkleinern.
lcrash ist offline   Mit Zitat antworten
Alt 20.11.2011, 16:26  
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

Nach dem Einwurf verstehe ich das erstmal.
Zitat:
Merge soll mehrere <link />-Tags zu einem zusammenfassen.
bedeutet, Du willst die Ressourcen darin mergen und minifizieren?! Ach sohoho.
__________________
--
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 offline   Mit Zitat antworten
Alt 21.11.2011, 09:27  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Oh man diese Zend Klassennamen also in Kohana nutze ich das Module Asset-Merger

Dieser Merger macht Minify und Merge mit bereits bestehenden Bibliotheken, Das Caching übernimmt das Kohana Cache Modul. Eventuell hilft dir der Quellcode als Idee

MFG
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 21.11.2011, 10:34  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

@BlackScorp:
LOL ok die Klassennamen sind echt etwas lang, wie gesagt, mit $this->view->headDecorator() wärs etwas kürzer

@nikosch:
genau, beides

@lcrash:
Filter klingt tatsächlich sinnvoll. Das soetwas ins Deployment gehört stimmt irgendwie, nur deploy ich bei PHP so selten "richtig". Da mach ich halt ein SVN up auf die stable-Version und gut ist. Wie machst du das denn?
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 21.11.2011, 11:08  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.115
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
@BlackScorp:
LOL ok die Klassennamen sind echt etwas lang, wie gesagt, mit $this->view->headDecorator() wärs etwas kürzer
in kohana haben die das so gelöst dass sie ein classes ordner haben in dem leere klassen drin sind

PHP-Code:
class HeadCommon extends Zend_View_Helper_HeadCommon{} 
somit bruachste dann halt nur HeadCommon aufzurufen, zusätzlicher vorteil ist noch, dass du dann die klassen mit eigenen methoden erweitern kannst, oder vorhandene methoden überschreiben kannst ohne dabei die core klassen anfassen zu müssen. aber gibt es denn keinen Zend Modul um JS/CSS dateien zu "minfieren"? wieso Programmierst du es selber?
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 21.11.2011, 20:36  
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

Zitat:
Wie machst du das denn?
Würde mich auch interessieren.
Zitat:
Oh man diese Zend Klassennamen
Liegt vermutlich am Autoloader-Prinzip, was? Obwohl ich gestehen muss, meine Bezeichner sind oftmals auch sehr lang. Obwohl ich per Konfiguration registriere. Aber präzise Namen finde ich wichtig. Zumindest, bis Namespaces überall verfügbar sind.
__________________
--
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 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
Frage zum Factory Design Pattern axelf Software-Design 20 11.06.2011 00:44
Interface in Klasse richtig benutzen, Strategie Pattern litterauspirna PHP Tipps 2010 4 24.11.2010 13:59
Design Pattern BlackScorp PHP Tipps 2009 7 06.01.2010 19:04
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Design Pattern Harry B. Software-Design 7 02.09.2008 20:49
[Erledigt] Design Pattern - MySQL Sitzung in allen Objekten nutzen PHP-Fortgeschrittene 21 28.04.2005 22:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
pattern klasse, interface erweitern design pattern, design pattern klasse erweitern, klassen erweitern php, software um zusätzliche funktionalität zu erweitern, php funktionen mehrfach erweitern, php klasse erweitern, php design patterns 2011 german, blackscorp php kohana

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:40 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