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 Bewertung: Bewertung: 2 Stimmen, 5,00 durchschnittlich.
Alt 14.06.2011, 12:40  
Erfahrener Benutzer
 
Benutzerbild von dreamcatcher
 
Registriert seit: 28.12.2010
Beiträge: 603
PHP-Kenntnisse:
Anfänger
dreamcatcher wird schon bald berühmt werden
Standard

Es hätte wenig Sinn gemacht, mit meinem alten Wissensstand hier weiter herumzudümpeln.

Daher schreibe ich nun ~2 Wochen später,
nachdem ich dazu kam das Zend Quickstart Tutorial sowie das letztes Tutorial einer "Zend Tutorial Reihe" zu Mappern anzuschauen & durchzuarbeiten.
__________________________________

Zitat:
Zitat von dr.e. Beitrag anzeigen
Ich muss gleich zum Zug, darum nur kurz eine Frage: warum versteifst du dich so auf das TDG-Pattern? Überlege doch zunächst auf Business-Architektur-Ebene, welche Objekte im Spiel sind und welche Bedeutung diesen zukommt.
Simpel:
Mir war vorher bei Zend kein anderes Pattern bekannt.

Während der Lehrstunden sind mir jedoch Unterschiede zu den Tutorial aufgefallen bzw. z.T. Unstimmigkeiten.

__________________________________

Grundannahme:
Da es ein beliebtes Beispiel ist, nehmen wir das Beispiel "Gästebuch".
In diesem kleinen Beispiel geht es nur darum alles auf einer Seite anzeigen zu lassen.
Als Pattern nehmen wir aus unserem Werkzeugkasten das DataMapper Pattern.

Version 1.)
Zend Framework Quickstart


Als allererstes macht das Quickstart die Aussage, dass "save", "find" und "fetchAll" quasi Default Methoden in einem Mapper sind.

Zitat:
A typical API for a data mapper is as follows:
PHP-Code:
class Application_Model_GuestbookMapper
{
    public function 
save($model);
    public function 
find($id$model);
    public function 
fetchAll();

Quelle:http://framework.zend.com/manual/en/...ate-model.html

Ist das richtig und wenn nein/ja, trifft es für alle Fälle zu ?

Vereinfachter Aufbau der Applikation:
/models/DbTable/Guestbook.php
/models/Guestbook.php
/models/GuestbookMapper.php
/controllers/GuestbookController.php

Wie fetchAll funktioniert:
Controller ruft neue Instanz des Mappers auf,
Controller übergibt an das View Objekt: Mapper->fetchAll
Mapper ruft interne getDbTable() Methode auf und greift somit durch eine Instanz von Zend_DbTable_Abstract (/DbTable/Guestbook.php) per fetchAll auf die DB zu.
Mapper erstellt per foreach() für jede Row ein eigenes Guestbook Obj. (/models/Guestbook.php), sammelt diese in einem Array und gibt dies letzendlich zurück.

Version 2.)
Video Tutorial (Siehe oben)


Vereinfachter Aufbau der Applikation:
/models/DomainAbstract.php
/models/DataMapperAbstract.php

/models/Guestbook.php
/models/GuestbookMapper.php
/models/GuestbookController.php

Wie fetchAll() funktioniert:
Controller ruft per getInstance() Methode eine Instanz von GuestbookMapper auf.
[Unterschied, bei Zend war es lediglich durch "new", hier wird es durch ein Singleton Pattern aufgerufen]
Controller übergibt an das View Objekt: Mapper->fetchAll
Mapper ruft $this->getDb Methode auf, welche zur Parentclass DataMapperAbstract führt und dort durch Zend_Db_Table::getDefaultAdapter() die derzeitige Verbindung holt.
Mapper baut die Query zusammen (->select()->from(tablename)) und führt danach auch die query durch ->fetchAll aus
[Unterschied, bei Zend wird nicht from() verwendet sondern durch die Instanz von Zend_DbTable_Abstract weiß die Applikation bereits die Tabelle]
Mapper erstellt per foreach() für jede Row ein eigenes Guestbook Obj. (/models/Guestbook.php), sammelt diese in einem Array und gibt sie letzendlich aus.

Weiterer Unterschied zum Zend Beispiel:
Das Model Guestbook.php ist ein Kind von DomainAbstract.php.
DomainAbstract hat als Property die $_id und die Methoden setId und getId.
Dies ist dafür gedacht nochmals ein wenig Tipparbeit zu sparen da man viele Klassen um diese erweitern kann
(So gut wie alles hat eine eindeutige Id um festzustellen ob ein update oder insert erfolgt)

Bei Zend gab es keine solche Abstract Class sondern die Property "Id" wurde direkt in das Objekt geschrieben.

Version 3.)
Google


Google sagt man sollte auf nicht benutzte Getter und Setter verzichten, der Performance wegen.
Meine Interpretation nach sollten somit auch "naive" (default) getter/setter vermieden werden.
[Siehe Zend]

Zitat:
Avoid writing naive setters and getters
Quelle:
http://code.google.com/intl/de-DE/sp...izing-php.html
__________________________________

Es ist schwer alles einigermaßen sauben zusammen zu bekommen, damit man es zumindest auf dem zweiten Blick erkennt.

Meine persönliche Einschätzung ist, dass beide Wege Vorteile haben die am besten sind.

Bei Zend Quickstart scheint es sauberer gelöst zu sein mit dem Zend_DbTable_Abstract, so dass der Mapper nicht von DataMapperAbstract per getDb den DefaultAdapter holen muss und dann extra eine "from()" Query erzeugt.
Allerdings wurde im VideoTutorial auch etwas gesagt dass DataMapperAbstract die interne Property $_db als static deklariert ist, so dass es wohl Performance gewinnen soll da diese nicht immer wieder neu erstellt werden muss.
Andererseits frage ich mich, was mir eine statische Variable bei PHP bringt, wenn nach der Scriptausführung sowieso der Speicher wieder leer ist.
Somit würde mir der Performancegewinn nur zur Seite stehen, sofern die Variable im selben Scriptaufruf nochmals abgefragt wird, was im Gästebuch nicht der Fall ist.

Bei der zweiten Variante kommt es mir hingegen sauberer vor mit der Abtrennung der AbstracClasses.
Dies bedeutet jedoch auch gleichzeitig erhöhten Schreibaufwand (und vllt. Performanceverlust, so dass es sinniger ist die Propertys alle in einem Model Objekt unterzubringen ?)

Es sind einfach einige unterschiedliche Ansätze, so dass ich mich riesig freuen würde wenn jemand jemand die Antwort darauf hat was nun besser ist:

Mit oder ohne solchen Abstract Classes
Mit oder ohne extra DbTable_Abstract Datei [Und dafür ggf. Queryzusammenbau mit "from(Tablename)" im Mapper]
Etc. pp..

Geändert von dreamcatcher (14.06.2011 um 13:00 Uhr).
dreamcatcher ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 14.06.2011, 14:43  
Erfahrener Benutzer
 
Registriert seit: 11.04.2011
Beiträge: 260
PHP-Kenntnisse:
Fortgeschritten
lcrash wird schon bald berühmt werden
Standard

Sehr ausführlich. Ich bevorzuge die im Quickstart beschriebene Struktur und habe dazu abstrakte Klassen entwickelt die Schreibarbeit abnehmen. Außerdem habe ich einen Project-Provider der meine Models aus der Datenbanktabelle erzeugt. Das ist auch der Grund warum ich bisher nicht auf Doctrine umgesattelt bin (auch wegen der nicht so guten Integration).

Das mit dem statischen $_db ist mir ein Rätsel. Wo soll das ein Perfomence-Gewinn bringen, wenn es eh nur eine Zend_Db-Instanz gibt? Und der DataMapper ist ein Singleton? Kommt selten vor, aber manchmal möchte ich zwei Dinge in einer Action separat behandeln und meine DataMapper hält dabei zwei verschiedene Models.

Getter/Setter sind bei mir optional und existieren aus historischen Gründen (früher behandelte ich Zend_Db_Row direkt).
lcrash 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
Klasse mit Pfadproblem Dieselsepp PHP Einsteiger 6 27.04.2011 13:51
Wohin mit methoden BlackScorp Software-Design 9 24.03.2011 16:37
Seite nur im Script aufrufbar BlackScorp PHP Tipps 2010 4 03.11.2010 15:57
[Erledigt] Methoden zu einer Klasse hinzufügen ByStones PHP Tipps 2010 3 30.08.2010 23:58
[Erledigt] Klasse aus einer anderen Klasse aufrufen Tobby PHP-Fortgeschrittene 7 14.07.2010 20:05
[Erledigt] Nur einer bestimmten Klasse Zugriff andere Klasse erlauben Turamisi Software-Design 2 20.02.2010 20:31
Statische Methoden oder Singleton Klasse ? lopelz PHP Tipps 2009 7 30.12.2009 14:46
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Eine klasse einbinden newWorldOrder PHP Tipps 2009 2 23.02.2009 19:32
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
reflection - wie führe ich alle methoden einer klasse aus... Crypi PHP Tipps 2008 2 20.02.2008 22:51
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
klassen und methoden anderer klassen in methoden.... PHP Tipps 2005 17 25.05.2005 09:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php mapper pattern implementierung, mapper zend framework, namensschema public property, php zwei methoden auf einer seite, zend framework mapper tipps, zend framework data mapper, zend db query mapper model, 2 methoden in klass

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