| | | | |
| |||||||
| Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene |
|
| | LinkBack | Themen-Optionen | Bewertung: |
| | |
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Hallo zusammen! Ich beschäftige mich nun seit längerem mit verschiedenen Architectual Pattern, die von Martin Fowler, David Rice, Matthew Foemmel, Edward Hieatt, Robert Mee, Randy Stafford in ihrer gemeinsamen Veröffentlichung Patterns of Enterprise Application Architecture vorgestellt werden.Von besonderem Interesse sind dabei für mich Pattern gewesen, die dem Programmierer helfen Domain Objekte zu überwachen, dauerhaft zu speichern, sie identifizieren zu können usw. Mit anderen Worten ich möchte ein eigenes kleines Persistence Framework schreiben. Viele werden jetzt fragen wieso? Es gibt ja eigentlich schon recht gute Lösungen, die zudem sogar kostenlos sind, auf dem Markt. Das stimmt zwar, man denke an Propel oder doctrine, jedoch muss ich sagen, dass die meisten Lösungen entweder viel zu umfangreich sind, meiner Meinung nach unnütze Tools implementieren oder wichtige Punkte beim Object Relational Mapping vergessen. Deshalb habe ich angefangen die wichtigsten Pattern selbst zu implementieren und bin damit auch bisher sehr gut vorangekommen. Da ich sicherstellen möchte, dass Domain Objekte nur dann geladen, erstellt, gelöscht oder geändert werden, wenn dies nötig bzw. möglich ist, habe ich eine Klasse geschrieben, die das Unit of Work Pattern implementiert. Dieses von Martin Fowler vorgestellte Pattern beschreibt wie eine Klasse dafür Sorge tragen kann, dass Veränderungen an Objekten, neue Objekte, nicht neue aber unveränderte Objekte und zu löschende Objekte erfasst und unterschieden werden können. So kann sichergestellt werden, dass alle Veränderungen an der Objektstruktur auf die Datenbank übertragen werden können. Die verschiedenen Objekte können also überwacht werden, jedoch muss ich momentan noch für jedes Objekt eine Klasse schreiben, was manchmal nicht nötig ist. Deshalb habe ich eine abstrakte Implementierung eines Domain Objekts vorgenommen, die neben einfachen Setter- und Getter-Methoden das Identy Map Pattern implementiert. Das Identy Map Pattern stellt sicher, dass jedes Objekt eindeutig identifiziert werden kann. Dank dieser Klasse ist es nun also möglich einfache Objekte, zum beispiel für eine Ausgabe zu laden, die neben den Standard-Methoden nichts bereitstellen. Ich kann nun also einfache Objekte laden und diese überwachen. Jedoch muss ich auf der einen Seite die Struktur der Objekte speichern und auf der anderen Seite die Struktur der Datenbank erfassen. Das Metadata Mapping Pattern zeigt, wie man eben dieses Problem lösen kann. Auch dieses Pattern habe ich (in abgewandelter Form) in drei Klassen implementiert. Wieso nun aber dieser Thread? Ich habe nun noch zwei Klassen bzw. Klassenkonstrukte zu implementieren, wovon mir eins bisher einige Schwierigkeiten bereitet. Es Fehlen ein Klassenkonstrukt, dass das QueryObject Pattern und eine Klasse, die den eigentlichen Mapper implementiert. Bevor ich den Mapper implementieren kann muss ich natürlich erst das QueryObject Pattern implementieren, da dies mir ermöglicht die Datenbank-Request an Bedingungen (where-Klauseln) und andere Einschränkungen und Spezifizierungen zu binden. Des weiteren soll dieses Klassenkonstrukt es mir ermöglichen Teile der Queries automatisch zu generieren. Bisher habe ich folgende überlegungen angestellt. Es soll die folgenden Klassen geben:
Ich würde mich sehr über Anregungen und Hilfestellungen freuen. Fragen und Anmerkungen rund um das Thema Object Relational Mapping sind natürlich auch erwünscht. MfG, Andy Criteria PHP-Code: PHP-Code: PHP-Code:
__________________ I'm so tired of slitting the throats of people calling me a violent psychopath. Geändert von #Avedo (19.03.2009 um 00:12 Uhr). |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Gast
Beiträge: n/a
| Das ist ja ein Zufall, gerade gestern habe ich mir darüber Gedanken gemacht. Dazu habe ich mir erstmal folgendes angesehen: Chapterª34.ªAddon: YDDatabaseQuery, using objects to create SQL queries Vielleicht könntest du auch mal ein Beispiel geben, wie du diese Query mit deinen Klassen generieren würdest. Weil ich mir auch noch nicht so ganz im klaren bin, was der große Vorteil daran ist. Code: SELECT `id`, `name`, `g`.`id` AS `gid`, `g`.`name` AS `group_name`, `a`.`id` AS `aid`, `a`.`name` AS `attach_name` FROM `user` AS `u` LEFT JOIN `group` AS `g` ON ( u.group_id = g.id ) INNER JOIN `attach` AS `a` ON ( g.attach_id = a.id OR ( a.size > 150 AND a.status = 3 ) ) WHERE g.id = 144 ORDER BY `a`.`name` LIMIT 50 Bei dir werden alle WHERE-Bedingungen AND-verknüpft, und JOINs nur über =. Eigentlich könnte man ON/WHERE (eine Klasse) gleichbehandeln? Achso, ein Vorteil wäre das automatische Escapen von Bezeichnern bzw. quoten von Werten, wo machst du das? Und wie escapet man folgende Konstrukte: SUM( `value` ) die Lösung aus dem YDF gefällt mir garnicht. |
|
| | ||
| Moderator und Wett-König | Hallo Phlegma, hallo Andy, Zitat:
@Andy: Ich denke, dass du bei deinem aktuellen Ansatz deshalb etwas stecken bleibst, weil du zuerst die Helper- und dann die Core-Komponenten implementiert hast. Was ist dein Join-Objekt wert, wenn du keinen DataMapper hast, der Objekte mappt. Weiterhin hast du noch nicht berücksichtigt, wie deine Objekte von der Peristenz-Schicht zur Verfügung gestellt werden. Du erinnerst dich? GenericDomainObject vs. konkrete Domänen-Objekt. Ich würde mir diese Fragen zuerst stellen und dann Helper und Gimmicks schreiben. Du wirst sehn, das ist einfacher. ![]() Noch eine kleine Anmerkung: PHP-Code: PHP-Code: Just my 2 cent! Dr.E.
__________________ 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Geändert von dr.e. (18.03.2009 um 21:38 Uhr). Grund: Code-Formatierung bearbeitet! | |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Hallo Christian! Schön dass du dich hier auch in die Diskussion einklinkst. In Bezug auf das Problem DomainObject vs. konkrete Domänen-Objekt habe ich bereits eine Lösung gefunden. In den Klassen, die sich um das Metadata Mapping kümmern, wird nicht nur die Struktur der Datenbank und derer Tabellen abgebildet sondern auch die der Domain Objekte. Es reichen ja manchmal einfache Domain Objekte zum beispiel wenn ein Artikel gespeichert werden soll. Wenn man allerdings ein Auto aus einer Datenbank läd möchte man nicht nur die Farbe und die Marke wissen, sondern man möchte damit auch fahren, Radio hören oder es putzen. Dazu braucht man aber Methoden, die generisches Domain Objekt nicht implementiert. Man also von Fall zu Fall unterscheiden können und diese Unterscheidung möchte ich mit Hilfe von Reflections umsetzen. Ich werde mich aber nun erstmal an die eigentliche Mapper Klasse setzen und dann die einzelnen Helper schreiben. Das ist eine gute Idee. Danke! MfG, Andy
__________________ I'm so tired of slitting the throats of people calling me a violent psychopath. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Guten Abend! Habe heute den ganzen Tag an der Fertigstellung der Mapper Klasse gearbeitet. Und ja es ist tatsächlich einfacher erst die Kernklassen zu schreiben und dann die Helper-Klassen zu implementieren, denn ich weiß nun, welche Methoden diese zur Verfügung stellen sollen und welche Parameter diese Erwarten müssen. Sie ist mit sicherheit noch nicht ganz Fehlerfrei jedoch würde ich mich sehr freuen, wenn trotzdem schonmal jemand einen Blick darauf werfen könnte. MfG, Andy PHP-Code:
__________________ I'm so tired of slitting the throats of people calling me a violent psychopath. |
| | |
| | |
| Moderator und Wett-König | Meine Punkte:
__________________ 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! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Geändert von dr.e. (19.03.2009 um 20:59 Uhr). Grund: Farbe geändert |
| | |
| | ||
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Eine Alternative könnte so aussehen: PHP-Code: Zitat:
Was meinst du damit? Meinst du damit ob die unterschiede zwischen den Datentypen in der Datenbank und den PHP Datentypen berücksichtigt werden? Nein noch nicht, aber ich werde diese Änderung auch noch vornehmen. Ich habe leider noch ein kleines Problem. Ich überlege gerade, wie ich Änderungen an Domain Objekten speichern soll, die sich auf mehrere Tabellen in der Datenbank beziehen (wurden mittels Joins geladen). Wie soll ich das erkennen und wie kann ich es später umsetzen? MfG, Andy
__________________ I'm so tired of slitting the throats of people calling me a violent psychopath. | |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| PHP Application Framework | root66 | PHP-Fortgeschrittene | 6 | 13.02.2009 22:45 |
| Suche Schüler o.ä. mit Zend Framework Erfahrung -> 200 Euro | mrmojo | Beitragsarchiv | 3 | 10.01.2009 15:38 |
| CMS mit Framework | KeKs0r | PHP-Fortgeschrittene | 11 | 27.12.2008 23:03 |
| Zend Studio for Eclipse und Zend Framework | KeKs0r | PHP-Fortgeschrittene | 5 | 15.12.2008 15:10 |
| Release 1.8 (RC1) des Adventure PHP Framework verfügbar! | dr.e. | Beitragsarchiv | 4 | 11.12.2008 09:44 |
| Bestehende Seite in Framework einbinden | MaWe4585 | PHP-Fortgeschrittene | 1 | 16.10.2008 08:20 |
| Suche nach Framework für schnelles programmieren | BLACK | PHP Tipps 2008 | 4 | 13.08.2008 04:54 |
| Release 1.7 beta des Adventure PHP Framework verfügbar! | dr.e. | Beitragsarchiv | 2 | 30.07.2008 17:50 |
| BrickOO :: PHP Framework | Hroudtwolf | Scriptbörse | 14 | 06.05.2008 12:04 |
| Zend Framework | Melchior | PHP-Fortgeschrittene | 29 | 13.03.2008 21:12 |
| framework struktur | notyyy | PHP Tipps 2008 | 3 | 06.11.2007 18:19 |
| Framework aus Haupt und Unterverzeichnis nutzen? | Anotherone | PHP-Fortgeschrittene | 8 | 24.07.2007 15:05 |
| Framework gesucht | Trash | 8 | 06.06.2006 14:04 | |
| [Erledigt] Framework empfehlen? | PHP-Fortgeschrittene | 1 | 01.06.2004 07:56 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php persistence, php persistence framework, php persistenz, php persitence, persistence framework, persistence php, persistenz framework php, persistence framework php, php object persistence, data mapper pattern, persistenz php, php persistenz framework, php persistance, php persistenzframework, php persistenzschicht, persistenz framework, php persistance framework, data mapper pattern php, php persitence framework, persistence frameworks |