Frage zur Umsetzung des Domänen-Modell beim Gästebuch2009

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
filipre
Beiträge: 13
Registriert: 02.12.2009, 23:10:39

Frage zur Umsetzung des Domänen-Modell beim Gästebuch2009

Beitrag von filipre » 25.08.2010, 18:54:24

Hallo,
ich hab wieder eine Frage :)

Ich habe mir mal das Gästebuch2009 Modul mal näher angeguggt, und mir viel auf, dass bei den Klassen "guestbook", "user" und "entry" immer sehr viele get* und set* Methoden verwendet wurden. Ich kann es mir im Moment nicht wirklich erklären, warum man nicht diese 3 Klassen mit dem APFObject vererbt wurden. Beziehtunsweise, habe ich eine Begründung von dr.e. gefunden:
durch Vererbung ist die Abhängigkeit zu groß. So kannst du den TagManager schön in anderen Applikationen auch einsetzen. Eine mögliche Lösung wäre es natürlich, aber schön ist das nicht.
Jedoch versteh ich nicht, was man mit Abhängigkeit meint. Bedeutet das, dass dann die Klassen IMMER geladen werden, auch wenn man sie nicht braucht? Würde mich freuen, wenn das Beispiel mit dem "Guestbook2009" und "warum die 3 Klassen so viele get* und set* Methoden erhalten" näher erläutert werden könnten.

Dann habe ich noch ein ein Code-Bespiel, wie man die vielen Methoden verringern kann, da dies für mich persönlich etwas redundant aussieht. Ich habe mich dabei an das Gästebuch orientiert und auch keine Vererbung auf das APFObject verwendet. Meinungen dazu wären toll :D

systemObjects.php

Code: Alles auswählen

<?php
class systemObjects {
		
		private $attribute = array();
		
		public function getObjectAttribute($attributeKey) {
			return $this->attribute[$attributeKey];
		}
		
		public function setObjectAttribute($attributeKey,$value) {
			$this->attribute[$attributeKey] = $value;
		}
		
		//diese Methode habe ich noch nicht getestet
		public function addObjectAttribute($attributeKey,$value) {
			if(!is_array($this->attribute[$attributeKey])) $this->attribute[$attributeKey] = array();
			$this->attribute[$attributeKey][] = $value;
		}
	}
	
	final class application extends systemObjects {
	}
	
	final class server extends systemObjects {
	}
	
	final class user extends systemeObjects {
	}

	[...]
}
?>
Dabei kann man dann auf die Attribute zugreifen, indem man $object->setObjectAttribute('serverID','42'); oder $object->getObjectAttribute('serverID'); verwendet. Ein persönlicher Vorteil war auch noch, dass ich jederzeit Attribute hinzufügen kann, ohne etwas daran zu ändern.

mfg filipre

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

Re: Frage zur Umsetzung des Domänen-Modell beim Gästebuch2009

Beitrag von dr.e. » 26.08.2010, 12:01:14

Hallo filipre,

das Domänen-Modell im Guestbook2009 ist von der Idee ein echtes Domänen-Modell, da sich die Abbildung der Datenhaltung hinsichtlich Mehrsprachigkeit deutlich unterscheidet. Die Klassen, die das Modell in PHP repräsentieren sind einfache DTO-Klassen, die ihre Attribute mit expliziten get/set-Methoden nach aussen repräsentieren. Grund dafür ist, dass man einem Objekt durch seine Methoden direkt ansieht, "was es kann". Hast du nur einfache getAttribute() bzw. setAttribute() - wie auch in deinem Beispiel - dann siehst du nicht, was das Objekt ausmacht - es ist zu generisch. Dieser Ansatz ist sicher auch relevant und hat seine Berechtigung in der Anwendung, aber im Fall des Gästebuchs war es Ziel, die Domäne treffend zu beschreiben.

Der generische Ansatz kommt übrigens im GORM zur Anwendung, da dieser tatsächlich den generischen Ansatz verfolgt, mit einem Domänen-Objekt alle Anwendungsfälle abbilden zu können. Das Gästebuch nutzt das zur generischen Datenhaltung und mappt dann die generischen Objekte in "richtige" Domänen-Objekte.
Jedoch versteh ich nicht, was man mit Abhängigkeit meint. Bedeutet das, dass dann die Klassen IMMER geladen werden, auch wenn man sie nicht braucht? Würde mich freuen, wenn das Beispiel mit dem "Guestbook2009" und "warum die 3 Klassen so viele get* und set* Methoden erhalten" näher erläutert werden könnten.
Hier ging es im Speziellen - soweit ich mich richtig erinnere - um eine Implementierung eine Business-Komponente, die von einer anderem erben sollte. Hier ist in der Tat die Abhängigkeit zu dieser zu groß. Du schleppst dadurch den kompletten Ballast (Konfiguration, DB-Setup, ...) mit, was du an sich nicht brauchst. Für eigene Applikationen und Business-Kompoenten, die andere nutzen, empfiehlt es sich einen weiteren Service (nach dem Gedanken der Service-Orientierung) zu schaffen, der einfach den anderen nutzt (delegate pattern). Das hat aber mit dem Design des Gästebuchs wenig zu tun. Letzteres findest du übrigens im Artikel Objektorientiertes Design eines Gästebuchs, der auch im PHP-Journal erschienen ist.
Dabei kann man dann auf die Attribute zugreifen, indem man $object->setObjectAttribute('serverID','42'); oder $object->getObjectAttribute('serverID'); verwendet. Ein persönlicher Vorteil war auch noch, dass ich jederzeit Attribute hinzufügen kann, ohne etwas daran zu ändern.
Wie gesagt: das mag im ersten Moment verführerisch klingen, die API des Objekts wird dadurch aber intransparenter und eignet sich oft schlecht für Code, der von anderen wiederverwendet werden soll. Aus diesem Grund wurde im letzten Release auch die API des APF umgekrempelt um gleich bei der Entwicklung sehen zu können, was mit einem Objekt anzustellen ist. Alleine die Vererbung von APFObject ist noch keine Abhängigkeit, die als "böse" zu bezeichnen ist, mit Abhängigkeit geht es vielmehr um die oben genannten.

Ich hoffe, ich konnte dir weiterhelfen.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast