Gästebuch Tutorial

Hier dreht sich alles um die auf der Webseite veröffentlichten Tutorials. // This forum is all about the APF tutorials.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 28.09.2009, 21:00:39

Hallo Thalo,
Ganz schön viele Fragen :D
Kein Problem, dafür bin ich da! :geek:
Nutze ich ein Model, was ich ausschließlich in der Präsentation verwende (Boxen sind aus oder aufgeklappt, Button ist geklickt, ..) weise ich dies der Präsentationsschicht zu. Nutze ich aber ein Model was ich zum Austausch verschiedener Schichten benutze (z.B das Domänen Objekt) dann der Business? Oder werfe ich da gerade etwas durcheinander? :D
Das ist eine gute Unterscheidung. Ich würde das so stehen lassen.
Ich habe mir den Artikel AJAX & the APF angesehen. Ist die Ausgabe der XML nicht die Aufgabe des Views?
In diesem Fall übernimmt die Ausgabe ein JavaScript-Snippet (=Präsentation), die ihre Daten von einer für AJAX- und normaler GUI gemeinsamen Business-Schicht. XML ist in diesem Fall nur eine andere Repräsentation des Domänen-Objekts, weil mit einem XMLHTTPRequest ein XML einfacher zu verarbeiten ist. Aus diesem Grund zähle ich die Generierung des XML zur Business-Schicht.
Ist es nicht möglich, mit dem mailSender des APFs, eine eigene SMTP Socket zu öffnen? Grund hierfür ist: mail öffnet für jede Mail einen neuen Socket, was bei großer Anzahl an Mails (Errinerungen, Newsletter, ...) nicht wirklich günstig ist.
Nein, das ist nicht möglich, da der mailSender auf die Funktion mail() aufsetzt, die nur für den Einzel-Mail-Versand taugt. Solltest du eine Komponente benötigen, die das kann, schau mal bei Google unter PHPMailer & Co., da sollte sich etwas finden. Der mailSender sollte ohnehin einer Code-Pflege unterzogen werden, da die Klasse schon recht betagt ist.
Mir ist auch nicht klar, warum in der PHP5-Version des APFs immer noch auf trigger_error anstatt auf Exceptions zurückgegriffen wird?
In PHP4 und PHP5 ist es völlig legal Error-Handling einzusetzen. Nicht jeder Fehler ist auch eine echte Exception. Dies wird ab > 1.11 nochmals überarbeitet, weil es ab dann keine PHP4-Unterstützung mehr geben wird.
Ebenfalls, warum du so häufig Referenzen benutzt? ( wegen dem "Bug" aus PHP4, dass Objekte als Kopie und nicht als Referenz übergeben wurden?)
Häufig? Ich nutze im APF an nahezu allen Stellen Referenzen, das wird auch weiter so bleiben. Der komplette DOM-Baum der GUI besteht aus Referenzen. Andernfalls wäre es z.B. nicht möglich einem Document-Controller eine Referenz auf den aktuellen Dokument-Knoten mitzugeben. Was sich ändert ist nur die Tatsache, dass in PHP5 Objekte per default als Referenz übergeben werden. Sofern du dich an den "&" störst, die kannst du getroßt ignorieren, in PHP5 werden diese bypassed, sprich sind hinsichtlich eines Referenz-Operators wirkungslos. :) Ich schreibe diese nur immer noch hin, weil man dadurch für die Doku besser verdeutlichen kann, dass hier mit Referenzen "gespielt" wird und daher Vorsicht angesagt ist.

Wie das waren schon alle Fragen? ;)
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 29.09.2009, 01:06:23

Hi Doc,
Wie das waren schon alle Fragen? ;)
Nö, habe noch einige :P
In diesem Fall übernimmt die Ausgabe ein JavaScript-Snippet (=Präsentation), die ihre Daten von einer für AJAX- und normaler GUI gemeinsamen Business-Schicht. XML ist in diesem Fall nur eine andere Repräsentation des Domänen-Objekts, weil mit einem XMLHTTPRequest ein XML einfacher zu verarbeiten ist. Aus diesem Grund zähle ich die Generierung des XML zur Business-Schicht.
Wo genau siehst du den Unterschied eines HTML und XML Dokumentes?
In PHP4 und PHP5 ist es völlig legal Error-Handling einzusetzen. Nicht jeder Fehler ist auch eine echte Exception. Dies wird ab > 1.11 nochmals überarbeitet, weil es ab dann keine PHP4-Unterstützung mehr geben wird.
Für mich ist eine Exception eine Ausnahme, wo erstmal egal ist, wer sie ausgelöst hat. Ich nutze Exceptions schon allein deshalb lieber, weil sie dem Programmierer überlassen, wie er mit dieser Ausnahme umgeht. Und die Trennung klarer ist. In dem "ConnectionManager" könnte ich somit, bei gescheitertem Verbindungsaufbau, selber bestimmten wie verharren wird (Okay, kann ich nun auch..). Hab ich ein falsches Verständnis von Exceptions oder nutzt du trigger_error für die Abwärtskompatibilität? Pauschal würde ich sagen:Eine Exception werfe ich dort, wo ein Fehler auftritt der nicht passieren darf.
Nicht jeder Fehler ist auch eine echte Exception.
Was unterscheidest du da genau? Das, was schon in dem Link oben angedeutet wurde?

In der PDF die du mir geschickt hast, wird auf Seite 34 in dem UML eine Assoziations-Beziehung von "Attribute2Language" die Beziehung von Language zu Attribute dargestellt. Müsste die Beziehung nicht von dem Attribute ausgehen (Attribute TO Language)?

Mir fehlt beim ConnectionManager ein PDO Wrapper. Gibt es bisher nur einen für MySQL und SQLite? Wie sieht es aus mit proprietären Funktionen die, die einzelnen Treiber mit sich bringen?

Im UMTG Manager Tutorial bin ich auf

Code: Alles auswählen

protected $__ApplicationID = 1;
gestoßen. Gehört das nicht im Grunde in ein extra Model? :D

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 29.09.2009, 09:19:58

Hi,
Wo genau siehst du den Unterschied eines HTML und XML Dokumentes?
Hier geht es nicht um HTML und XML, sondern, was das XML repräsentiert. In diesem Fall ist es ein Domänen-Objekt, das ich zur Business-Schicht zähle. Damit geht es nicht um GUI/Pres. ;)
Für mich ist eine Exception eine Ausnahme, wo erstmal egal ist, wer sie ausgelöst hat. Ich nutze Exceptions schon allein deshalb lieber, weil sie dem Programmierer überlassen, wie er mit dieser Ausnahme umgeht. Und die Trennung klarer ist. In dem "ConnectionManager" könnte ich somit, bei gescheitertem Verbindungsaufbau, selber bestimmten wie verharren wird (Okay, kann ich nun auch..). Hab ich ein falsches Verständnis von Exceptions oder nutzt du trigger_error für die Abwärtskompatibilität? Pauschal würde ich sagen:Eine Exception werfe ich dort, wo ein Fehler auftritt der nicht passieren darf.
Ich gebe dir Recht, nicht alle Stellen mit einem trigger_error() sind korrekt, sondern sollten im OO-Style eigentlich Exceptions sein. Diese Tatsache ist in der Tat der (noch) vorhandenen PHP4-Kompatibilität geschuldet, die - wie gesagt - mit der Version 1.12 entfernt wird. Die relevanten Stellen (z.B. ConnectionManager) werden jedoch trotzdem korrekt behandelt, hier gibt es ein trigger_error() mit FATAL-Qualität.
Was unterscheidest du da genau? Das, was schon in dem Link oben angedeutet wurde?
Es gibt Fehler, bei denen die Verarbeitung der Applikation fortgesetzt werden kann. Beispiel: du adressierst ein Template im Controller, das es aber nicht gibt. Hier ist es nicht notwendig eine Exception zu werfen, weil es kein "Ausnahme-Fehler" ist. Diese Art der fehler sollten ohnehin nur während der Entwicklung auftreten.
In der PDF die du mir geschickt hast, wird auf Seite 34 in dem UML eine Assoziations-Beziehung von "Attribute2Language" die Beziehung von Language zu Attribute dargestellt. Müsste die Beziehung nicht von dem Attribute ausgehen (Attribute TO Language)?
Korrekt, hier ist die Grafik falsch. Werde das gleich noch für den Artikel ausbessern.
Mir fehlt beim ConnectionManager ein PDO Wrapper. Gibt es bisher nur einen für MySQL und SQLite? Wie sieht es aus mit proprietären Funktionen die, die einzelnen Treiber mit sich bringen?
Du kannst beim ConnectionManager jederzeit eigene Treiber einhängen. Das kann ein PDO-kompatibler genauso wie ein Treiber mit der Unterstützung von proprietären Funktionen sein. Der MySQLxHandler unterstützt aktuell einen Standard-Satz an Funktionalität, wenn du diesen erweitern möchtest, kannst du das gerne per Vererbung oder Neu-Implementierung tun. Wenn du möchtest, kann ich die Erweiterung dann gerne in's Framework übernehmen. Einzige Einschränkung ist, dass die Treiber im Namespace core::database liegen müssen, was man aber ohne weiteres noch mit in die Konfiguration aufnehmen kann.
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 29.09.2009, 18:02:47

Hi Doc,
Hier geht es nicht um HTML und XML, sondern, was das XML repräsentiert. In diesem Fall ist es ein Domänen-Objekt, das ich zur Business-Schicht zähle. Damit geht es nicht um GUI/Pres. ;)
Ich seh schon, hab noch viel zu lernen... ;) Grundsätzlich die Möglichkeit besteht aber, dass ich statt html auch xml als View benutze?

Korrekt, hier ist die Grafik falsch. Werde das gleich noch für den Artikel ausbessern.
Das irritiert micht. Ist das UML dann beim UMTG auch falsch?
Du kannst beim ConnectionManager jederzeit eigene Treiber einhängen. Das kann ein PDO-kompatibler genauso wie ein Treiber mit der Unterstützung von proprietären Funktionen sein. Der MySQLxHandler unterstützt aktuell einen Standard-Satz an Funktionalität, wenn du diesen erweitern möchtest, kannst du das gerne per Vererbung oder Neu-Implementierung tun. Wenn du möchtest, kann ich die Erweiterung dann gerne in's Framework übernehmen. Einzige Einschränkung ist, dass die Treiber im Namespace core::database liegen müssen, was man aber ohne weiteres noch mit in die Konfiguration aufnehmen kann.
Muss ich also doch selber Hand anlegen oder den (veralteten) MySQL Treiber benutzen? Wofür steht das X? Für extended?

Im UMTG bin ich auf

Code: Alles auswählen

protected $__ApplicationID = 1;
gestoßen. Wäre das nicht in einem extra Model besser aufgehoben?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 29.09.2009, 21:07:54

Hi,
Ich seh schon, hab noch viel zu lernen... ;) Grundsätzlich die Möglichkeit besteht aber, dass ich statt html auch xml als View benutze?
Selbstverständlich. Das kann insbesondere bei einem RSS-Fead sinnvoll sein, da dort XML die View-Repräsentation darstellt.
Das irritiert micht. Ist das UML dann beim UMTG auch falsch?
Welche Grafik meinst du? Die auf der Usermanagement-Seite? Nein, diese ist völlig korrekt.
Muss ich also doch selber Hand anlegen oder den (veralteten) MySQL Treiber benutzen?
Jepp. Wenn du möchtest, kann ich in 1.12 auch die Konfiguration des ConnectionManager erweitern, so dass der Treiber direkt angegeben werden kann.
Wofür steht das X? Für extended?
Für die Versionen MySQL4+5. Die Namensgebung ist aber eher historisch bedingt, da es ganz früher noch einen MySQLHandler gab (bis 1.10 ist dieser auch noch im Release enthalten) und zur Zeit der Erstellung des ConnectionManager gerade MySQL5 relevant wurde.
Im UMTG bin ich auf

Code: Alles auswählen

protected $__ApplicationID = 1;
gestoßen. Wäre das nicht in einem extra Model besser aufgehoben?
Nein, für eine Variable brauchst du kein eigenes Model, das kann ohne weiteres direkt in der Business-Komponente gespeichert werden. Dieses Konstrukt bedeutet nicht mehr und nicht weniger, als das eine Klasse einen Zustand seiner Instanz sekbst verwaltet und nicht an dein Model delegiert. Diese Vorgehensweise ist auch nicht ungewöhnlich.
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 29.09.2009, 21:26:53

Hi Doc,
Selbstverständlich. Das kann insbesondere bei einem RSS-Fead sinnvoll sein, da dort XML die View-Repräsentation darstellt.
Das XML repräsentiert das Domänen-Objekt, welches durch JavaScript dargestellt wird. Richtig? Was mach ich denn, um nicht die Übersicht zu verlieren, bei sehr umfangreichen Objekten?
Welche Grafik meinst du? Die auf der Usermanagement-Seite? Nein, diese ist völlig korrekt.
Dort steht: "Role2User" die Beziehung geht aber vom User aus?
Jepp. Wenn du möchtest, kann ich in 1.12 auch die Konfiguration des ConnectionManager erweitern, so dass der Treiber direkt angegeben werden kann.
Ich denke ich werde das selber mal probieren. :)
Nein, für eine Variable brauchst du kein eigenes Model, das kann ohne weiteres direkt in der Business-Komponente gespeichert werden. Dieses Konstrukt bedeutet nicht mehr und nicht weniger, als das eine Klasse einen Zustand seiner Instanz sekbst verwaltet und nicht an dein Model delegiert. Diese Vorgehensweise ist auch nicht ungewöhnlich.
Im Gästebuch2009 wurde dafür ein extra Model benutzt. Hat das einen besonderen Grund?

Wenn ich nun möchte, dass von einer Klasse nicht mehr als ein Objekt erzeugt werden kann. Implementiere ich dann das Singleton-Entwurfsmuster in die Klasse oder nutze ich hierfür den DIServiceManager?

Wenn ich ein Modul nutzen möchte, den View aber anpassen möchte. Wie gehen ich da vor? Einen extra View in meinen Applikations-Ordner?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 29.09.2009, 22:07:46

Hi Thalo,
In der PDF die du mir geschickt hast, wird auf Seite 34 in dem UML eine Assoziations-Beziehung von "Attribute2Language" die Beziehung von Language zu Attribute dargestellt. Müsste die Beziehung nicht von dem Attribute ausgehen (Attribute TO Language)?
Korrekt, hier ist die Grafik falsch. Werde das gleich noch für den Artikel ausbessern.
Hab grade nochmal drüber geschaut, die Grafik ist jedoch korrekt. Die Beziehung geht von Attribute aus zur Sprache. Der Pfeil ist nur leicht missverständlich, weil dieser eine Assoziation kennzeichnet, die von jenem Objekt ausgeht, die auch den Pfeil besitzt. Bei der Komposition ist das die Raute.
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 29.09.2009, 22:11:42

Hi Doc,

Beim Gästebuch ist es doch genau anders herum?
http://media.adventure-php-framework.or ... bjects.png

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 29.09.2009, 22:28:23

Hi Thalo,

dieses UML zeigt auch eine Beziehung vom Typ "Vererbung" und nicht "Assoziation". ;)
Das XML repräsentiert das Domänen-Objekt, welches durch JavaScript dargestellt wird. Richtig? Was mach ich denn, um nicht die Übersicht zu verlieren, bei sehr umfangreichen Objekten?
Diese kannst du - vorausgesetzt wir sprechen immernoch von einer JS-Implementierung - in einem komplexeren XML darstellen oder in unterschiedlichen Feeds, die jeweils nur eine Resource repräsentieren. Hier ist das REST-Prinzip sicher interessant für dich.
Dort steht: "Role2User" die Beziehung geht aber vom User aus?
Nein, diese geht von Role aus. Die Bedeutung der Darstellung ist hier wie oben beschrieben.
Ich denke ich werde das selber mal probieren. :)
An dieser Stelle gilt: jeder Treiber muss den AbstractDatabaseHandler implementieren. Sofern du das versuchen möchtest, würde ich dir empfehlen, den aktuellen Code aus dem 1.11er Branch zu nutzen, denn dieser hat schon einige Optimierungen hinsichtlich der DB-Treiber enthalten. Check dir mal den Code unter http://adventurephpfra.svn.sourceforge. ... php5/1.11/ aus oder lade dir ein TGZ herunter.
Im Gästebuch2009 wurde dafür ein extra Model benutzt. Hat das einen besonderen Grund?
Grund ist hier, dass die API konsistenter bleibt, die Model-Information trotzdem "einfach" für alle Komponenten zugreifbar ist.
Wenn ich nun möchte, dass von einer Klasse nicht mehr als ein Objekt erzeugt werden kann. Implementiere ich dann das Singleton-Entwurfsmuster in die Klasse oder nutze ich hierfür den DIServiceManager?
Du hast beide Möglichkeiten. Reicht dir ein klassische Singleton, so nutze diese Art, möchtest du dir die Option der dynamischen Initiualisierung und der Entkopplung von Schichten vorbehalten, verwende den DIServiceManager.
Wichtig bei der Nutzung eines klassischen Singleton ist, dass dieses kein "APF-Objekt" ist, sprich nicht automatisch mit dem aktuellen Context und der aktuellen Sprache initialisiert wird. Dies musst du - wenn du darin auf Konfigurationen zugreifen möchtest - selbst implementieren.
Wenn ich ein Modul nutzen möchte, den View aber anpassen möchte. Wie gehen ich da vor? Einen extra View in meinen Applikations-Ordner?
Die Frage verstehe ich nicht ganz. Kannst du das genauer erläutern?
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 29.09.2009, 22:43:15

Hi Doc,
dieses UML zeigt auch eine Beziehung vom Typ "Vererbung" und nicht "Assoziation". ;)
Meine auch die Komposition und nicht die Generalisierung :)
Diese kannst du - vorausgesetzt wir sprechen immernoch von einer JS-Implementierung - in einem komplexeren XML darstellen
Genau das meine ich. Sehr übersichtlich ist das nicht ;) soll ich hier dann einfach auf readfile zurückgreifen?
Hier ist das REST-Prinzip sicher interessant für dich.
Kenne ich schon. Ist hier aber nicht so passend, denke ich.
Nein, diese geht von Role aus. Die Bedeutung der Darstellung ist hier wie oben beschrieben.
Hab das Konzept falsch verstanden. Aber "Guestbook2Entry" verstehe ich nicht. Gehört der Eintrag nicht zum Gästebuch und nicht das Gästebuch zum Eintrag? :geek:
An dieser Stelle gilt: jeder Treiber muss den AbstractDatabaseHandler implementieren. Sofern du das versuchen möchtest, würde ich dir empfehlen, den aktuellen Code aus dem 1.11er Branch zu nutzen, denn dieser hat schon einige Optimierungen hinsichtlich der DB-Treiber enthalten. Check dir mal den Code unter http://adventurephpfra.svn.sourceforge. ... php5/1.11/ aus oder lade dir ein TGZ herunter.
habe ich mir schon angesehen..
Grund ist hier, dass die API konsistenter bleibt, die Model-Information trotzdem "einfach" für alle Komponenten zugreifbar ist.
Gilt das für "ApplicationsID" nicht?
Die Frage verstehe ich nicht ganz. Kannst du das genauer erläutern?
Ich habe bei den Modulen die Views ja bereits implementiert. Was wenn ich einen leicht abgeänderten View möchte?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 30.09.2009, 12:26:47

Hi,
Meine auch die Komposition und nicht die Generalisierung :)
Die Komposition ist aber korrekt. Der Bommel ist dort, wo die Beziehung startet.
Genau das meine ich. Sehr übersichtlich ist das nicht ;) soll ich hier dann einfach auf readfile zurückgreifen?
Sofern du statische Inhalte (=statische XML-Dateien) auslieferst, ja, sonst nein.
Hab das Konzept falsch verstanden. Aber "Guestbook2Entry" verstehe ich nicht. Gehört der Eintrag nicht zum Gästebuch und nicht das Gästebuch zum Eintrag? :geek:
Das Gästebuch hat (komponiert) Einträge. Damit gehören die Einträge zu, Gästebuch.
Gilt das für "ApplicationsID" nicht?
Nein, weil die ID nicht für andere Komponenten des UMGT von Bedeutung ist. :)
Ich habe bei den Modulen die Views ja bereits implementiert. Was wenn ich einen leicht abgeänderten View möchte?
Hier hast du mehrere Möglichkeiten. Eine ist, die gleichen Teil auszulagern und per <core:appendnode /> einzubinden, zweite ist, die gleichen Teile in <html:template />-Fragmente auszugliedern und die Ausgabelogik im Controller entsprechend anzupassen. Dieser muss dann entsprechend wissen, welcher Typ von View dargestellt werden soll.
Dritte denkbare Möglichkeit wäre, den <core:importdesign />-Tag so zu konfigurieren, dass das gewünschte Typ-Template an Hand eines Request-Parameters eingebunden wird.
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 30.09.2009, 16:02:14

Hi Doc,
Die Komposition ist aber korrekt. Der Bommel ist dort, wo die Beziehung startet.
In meinem Buch steht "Pfeil gibt Leserichtung an" das kann man sehr leicht missinterpretieren... Danke für die Aufklärung

Das Gästebuch hat (komponiert) Einträge. Damit gehören die Einträge zu, Gästebuch.
Wieso dann "Attribute HAT Language"? Hat nicht die Language Attribute? :oops: Und warum eine Assoziation? Sind die nicht von einander abhängig?

Woran genau machst du fest von wem aus die Beziehung startet? Scheinbar hätte ich nun einen Fehler gemacht :roll:
Nein, weil die ID nicht für andere Komponenten des UMGT von Bedeutung ist. :)
Hätte nun gesagt, dass die ApplicationsID nicht nur für den UMGT von Bedeutung ist und diese in ein ApplicationsModel ausgelagert? :?

Wenn ich nun ein Backend für die einzelnen Module erstelle. Bekommt jedes Modul eine Eigenständige Login-Prozedur?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 30.09.2009, 21:18:42

Hi,
Wieso dann "Attribute HAT Language"? Hat nicht die Language Attribute? Und warum eine Assoziation? Sind die nicht von einander abhängig?
"Hat" ist eine andere Ausdrucksweise für Komposition, "kennt" wird stellvertretend für Assiziationen verwendet. Diese beiden Beziehungstypen habe ganz bestimmte Bedeutungen.

Hier die relevanten Abschnitte aus dem Design-Artikel zum Gästebuch:
Nach der Analyse der Anwendungsfälle widmen wir uns den im Gästebuch verarbeiteten Daten. Hierfür ist es von Vorteil, zunächst die Objekte der Anwendung (=Domäne) unabhängig von Datenhaltung und Darstellung zu betrachten. In einem weiteren Schritt kann dann auf den Ergebnissen des Domänen-Modells die Modellierung der Datenschicht vorgenommen werden.
Wie bereits in einem der voran gegangenen Abschnitte angesprochen, bedeutet Objektorientierung die Abbildung einer reellen Problemstellung in Objekten, deren Funktionen und Beziehungen. Wer versucht ist, bereits zum Zeitpunkt der Daten-Analyse Besonderheiten der Darstellung oder Speicherung mit in die Modellierung einzubeziehen, läuft Gefahr, sich von der Realität zu entfernen.
Für eine korrekte Datenmodellierung sollten folgende Grundregeln und best practices beachtet werden:
  • Objekte sollten genau mit einer Aufgabe betraut sein.
  • Sofern ein Attribut eines Objektes mehrfach verwendet wird, sollte dieses als eigenes Objekt ausgelagert und mit einer Beziehung referenziert werden.
  • Die Komposition bezeichnet eine starke Zugehörigkeit (Beispiel: Gästebuch hat Einträge).
  • Jedes Objekt darf nur einmal komponiert werden, da ein reelles Objekt nur exakt eine starke Zugehörigkeit besitzen kann.
  • Die Assoziation bezeichnet eine schwache Zugehörigkeit. Diese wird verwendet, um für eine Applikation logisch zusammen gehörende Objekte zu verbinden. Assoziationen können jederzeit aufgelöst werden, da das betroffene Objekt weiterhin „lebt“.
In den folgenden Abschnitten wird zwischen dem Daten-Modell der Anwendung (domain object model) und dem Daten-Modell der Datenschicht (data layer object model) unterschieden.
Die Anforderungen beschreiben, dass ein Gästebuch in mehreren Sprachen einsetzbar sein soll. Dies ist nur dann möglich, wenn es nur eine Instanz gibt, der die sprachabhängigen Attribute direkt zugeordnet sind. Andernfalls kann die Mehrsprachigkeit nur über eigene Gästebücher für jede Sprache abgebildet werden.
Für Einträge ist es hingegen möglich, jeweils ein Entry-Objekt direkt mit den sprachabhängigen Werten zu füllen und zu einer Sprache zuzuordnen. Die Einträge eines Gästebuchs können dann durch Einschränkung über die Beziehung zum Gästebuch und der aktuell gewählten Sprache selektiert werden. Um die Lesbarkeit zu erhöhen und die Erweiterbarkeit des Datenmodells zu vereinfachen, wird auch diesem Fall auf die Auslagerung der Attribute in eigene Objekte gesetzt. Als Nachteil dieser Vorgehensweise ist der erhöhte Aufwand beim Lesen und Schreiben von Daten zu nennen.
Um die Erweiterung des Domänen-Modells um sprachabhängige Attribute-Objekte für die Anwendung selbst transparent zu gestalten wird das Mapping der sprachabhängigen Werte komplett an die Daten-Schicht delegiert. Diese füllt beim Lesen die Guestbook- und Entry-Objekte mit den für die ausgewählte Sprache relevanten Daten und übersetzt beim Speichern die Domänen-Objekte in sprachabhängige Attribute-Objekte.
Woran genau machst du fest von wem aus die Beziehung startet? Scheinbar hätte ich nun einen Fehler gemacht
Hier geht es zunächst um "Wer ist früher da?". Weiter musst du dir überlegen, wie die Realität aussieht. Wenn du ein Gästebuch erstellst, hat dieses zunächst keine Einträge. Wenn also ein Gästebuch Einträge hat (so auch der übliche Sprachgebrauch), dann muss wohl das Gästebuch, dasjenige Objekt, sein, das die Beziehungen ausprägt. Die Komposition (Einträge können ohne Gästebuch nicht leben) startet also beim Gästebuch. Die Attribut-Objekte sind ebenfalls explizit abhängig von den Entry- und Guestbook-Objekten. Deshalb: Komposition von Entry und Guestbook ausgehend. Bei den Attributen verhält es sich so, dass die Assoziation vom Attribut-Objekt ausgeht, weil dieses seine Sprach-abhängigkeit kennzeichnet. Ich empfehle dir zu diesem Thema das Buch UML konzentriert. Dort findest du viele Beispiele mit ausführlichen Erläuterungen.
Viele Grüße,
Christian

Thalo
Beiträge: 240
Registriert: 10.08.2009, 16:56:52

Re: Gästebuch Tutorial

Beitrag von Thalo » 30.09.2009, 21:34:34

Hi Doc,
"Hat" ist eine andere Ausdrucksweise für Komposition, "kennt" wird stellvertretend für Assiziationen verwendet. Diese beiden Beziehungstypen habe ganz bestimmte Bedeutungen.
Ist bewusst. Hast mich wahrscheinlich missverstanden. Ich meine, dass die Language doch Attribute hat und nicht die Attribute Language oder? Mir geht nicht ganz empor wieso. Mit der Assoziation meine ich, dass die Attribute doch nicht ohne Language leben können, oder? Das wäre dann eine Komposition. Daher frage ich, warum Assoziation..
Hier geht es zunächst um "Wer ist früher da?". Weiter musst du dir überlegen, wie die Realität aussieht. Wenn du ein Gästebuch erstellst, hat dieses zunächst keine Einträge. Wenn also ein Gästebuch Einträge hat (so auch der übliche Sprachgebrauch), dann muss wohl das Gästebuch, dasjenige Objekt, sein, das die Beziehungen ausprägt.
Beim Gästebuch ist das ja noch relativ eindeutig. Bei Rolle und User finde ich das schon etwas schwerer. Hat der User eine Rolle oder die Rolle einen User?

Im UMTG hast du es ja mit Rolle hat User gelöst. Wahrscheinlich wegen "Wer ist früher da?"

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Gästebuch Tutorial

Beitrag von dr.e. » 30.09.2009, 21:59:36

Hi,
Ich meine, dass die Language doch Attribute hat und nicht die Attribute Language oder?
Das missverstehst du etwas. Die Idee ist folgende:
Um der Anforderung nach Mehrsprachigkeit des Gästebuchs gerecht zu werden, ist eine Erweiterung des Domänen-Modells notwendig, da dieses bisher keine Zuordnung eines Gästebuchs oder Eintrags zu einer Sprache „kennt“.
Aus diesem Grund soll nun das Daten-Modell der Anwendung von dem der Datenhaltung getrennt werden. Vorteil dieser Verfahrensweise ist, dass die Anwendung nochmals von der Datenhaltung abstrahiert wird und Änderungen zu einem späteren Zeitpunkt dadurch erleichtert werden.
Die Erweiterung besteht nun darin, die Attribute der Domänen-Objekte durch sprachabhängige Attribute-Objekte zu ersetzen. Diese sind den „eigentlichen“ Guestbook- oder Entry-Objekt mit einer Komposition zugewiesen, besitzen jedoch gleichzeitig eine Zuordnung (Assoziation) zu einer Sprache.
Mit der Assoziation meine ich, dass die Attribute doch nicht ohne Language leben können, oder? Das wäre dann eine Komposition. Daher frage ich, warum Assoziation..
Die Attribute können nicht ohne Sprache leben stimmt nicht. Sonst wäre dort eine Komposition angesagt. Sprache ist aber etwas sehr allgemeines, das einen sehr hohen Stellenwert hat und - man möchte annehmen - deshalb vor allem anderen vorhanden ist. Insbesondere, wenn es um Mehrsprachigkeit geht. Die Assoziation kann man auch noch so erklären, dass die Sprache nicht gelöscht werden muss, wenn ein Attribut entfernt wird, weil dieses auch noch andere Attribute-Objekte brauchen. Schau dir hierzu vielleicht mal die Mapper-Implementierung an, dann wird es vielleicht klarer.
Beim Gästebuch ist das ja noch relativ eindeutig. Bei Rolle und User finde ich das schon etwas schwerer. Hat der User eine Rolle oder die Rolle einen User?
Beim UMGT hat das einen dedizierten Grund: ein User darf seine Rolle nicht direkt kennen, denn eine Rolle ist einem Menschen immer durch sein System gegeben. Das bedeutet, dass die Beziehung immer von der Rolle initiiert wird und deshalb auch dort starten muss.
Im UMTG hast du es ja mit Rolle hat User gelöst. Wahrscheinlich wegen "Wer ist früher da?"
Falsch! Role <-> User ist keine Komposition (=hat), sondern eine Assoziation! Das ist wichtig, da die beiden Objekte ohne Beziehung nebeneinander existieren dürfen.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast