Hi,
ist es möglich, dass ein Domain Model von mehreren Klassen erbt?
Folgendes Szenario:
Domain Model PKW hat folgende Attribute: Hersteller, Erstzulassung, Farbe, Modellbezeichnung, VolumenKofferraum
Domain Model LKW hat folgende Attribute: Hersteller, Erstzulassung, Farbe, Reifenanzahl, Ladevolumen
Wie man sehen kann, sind einige Attribute doppelt vorhanden. Diese sollen jetzt in eine eigene Klasse ausgelagert werden:
Domain Model FahrzeugDetails hat diese Attribute: Hersteller, Erstzulassung, Farbe
Normalerweise erben Domain Models ja von der Extbase Klasse Tx_Extbase_DomainObject_AbstractEntity:
<?php
class Tx_MyExt_Domain_Model_PKW extends Tx_Extbase_DomainObject_AbstractEntity {}
?>
Wie können jetzt die Klassen PKW und LKW gleichzeitig von Tx_Extbase_DomainObject_AbstractEntity und von FahrzeugDetails erben? Sowas geht ja nicht?!
<?php
class Tx_MyExt_Domain_Model_PKW extends Tx_Extbase_DomainObject_AbstractEntity extends Tx_MyExt_Domain_Model_FahrzeugDetails {}
?>
Danke schon mal für eure Hilfe! 🙂
Hi,
du kannst nicht von mehreren Klassen erben, da PHP nur eine Klasse als Elterklasse erlaubt. Du könntest alternativ mit Interfaces arbeiten und dort deine Standardeigenschaften reintun.
Oder du arbeitest mit abstrakten Klassen. Diese abstrakte erbt von AbstractEntity und deine Klassen von der abstrakten Basisklasse.
Hi,
Danke für deine Antwort 🙂
In der Extension SjrOffers hab ich gesehen, dass mit abstrakten Klassen gearbeitet wurde. Ich schaff es aber nicht, dies auf meine eigene Klasse zu übertragen.
In der Extension SjrOffers gibt es z.B. die abstrakte Klasse Tx_SjrOffers_Domain_Model_RangeConstraint. Diese erbt von Tx_Extbase_DomainObject_AbstractValueObject,
Dann gibt es die Klasse Tx_SjrOffers_Domain_Model_DateRange, welche von Tx_SjrOffers_Domain_Model_RangeConstraint erbt. Es gibt in der Klasse DateRange aber "eigene" Programmlogik, so dass die geerbte Programmlogik von RangeConstraint ausreicht um alle Funktionalitäten in DateRange abzubilden.
Meine Klassen (PKW, LKW) haben aber noch weitere Funktionen, welche in der Klasse FahrzeugDetails nicht vorhanden sind. Dazu brauche ich dann aber die Vererbung von Tx_Extbase_DomainObject_AbstractEntity in PKW und LKW.
Hab ich irgendwo einen Denkfehler? Muss ich meine Klassen vielleicht anderes aufbauen und "verknüpfen"?
PS: mit Programmlogik meine ich alle Attribute und Methoden einer Klasse.
Ich noch mal 😉
Hab deinen Rat befolgt und meine abstrakte Klasse FahrzeugDetails nicht von Tx_Extbase_DomainObject_AbstractValueObject sondern von Tx_Extbase_DomainObject_AbstractEntity erben lassen.
Nun erben die Klassen PKW und LKW von FahrzeugDetails.
Wozu ist dann aber die Klasse Tx_Extbase_DomainObject_AbstractValueObject gut?
Vielen Dank 🙂
Uupps, hab deine Frage in deinem anderem Thread beantworten wollen ;-) Siehe dort.
Also ich weiß nur dass ein ValueObject für ein exakt und nicht weiter zerlegbares "Etwas" steht, während ein EntityObject zerlegbar und nicht eindeutig sein muss. Ein EntityObject bekommt soweit ich weiß einen "künstlichen" Identifier, während ein AbstractObject allein durch seine Werte eindeutig ist.
Vielleicht wird dies irgendwie durch PHP-Code in den entsprechenden abstrakten Klassen forciert, müsste man mal nachschauen ;-)
Gruß
Hi,
welchen Thread meinst du? Kannst du einen Link posten?
Ok deine Erklärung muss ich mir noch mal genauer anschauen wenn ich richtig wach bin 😉
Danke.
Zum Unterschied Value Object und Entity kann ich nur ein Buch über Domain Driven Design empfehlen, z.B. Domain Driven Design von Eric Evans. Generell ist ein Value Object austauschbar gegen ein anderes mit den selben Properties, während eine Entity eine, über die Eigenschaften hinausgehende, Existenz hat.
Beispiel Model "Person" mit Vorname + Nachname. Du kannst aber zwei Person Objects nicht einfach gegeneinander austauschen nur weil sie denselben Namen haben. Es können eben trotzdem unterschiedliche Personen sein. Wird technisch dann häufig über einen unique identifier gelöst.
Ein Model "Farbe" mit Rot, Grün, Blau als Properties dürfte aber in der Regel schon ein Value Object sein, denn die Farbe ist vollständig durch die drei Werte definiert, ein zweites object mit den selben Werten für Rot, Grün, Blau kann getrost gegen das erste ausgetauscht werden, d.h. es sollte bei value objects eigentlich nie zwei mit den selben properties geben.
Ich definiere den Unterschied für mich einfach so:
Ein Value Object ist nicht weiter zerlegbar, es beschreibt sich also eindeutig und atomar. Ein Entity-Object ist wiederum zerlegbar in (Unter)Objekte, es ist für sich alleine genommen noch nicht identifizierend.