Ich stehe im Moment vor dem Problem, wie ich mein Model und meine View miteinander verbinden kann. Ich will versuchen, es an einem einfach gehaltenem Beispiel deutlich zu machen:
Das Domain-Model:
Der View übergebe ich nun die jeweiligen Objekte. Dort möchte ich nun auf die verschiedenen Arten von Objekten reagieren:
Wie komme ich nun darum herum, in meiner View ständig if-else- oder switch-Konstrukte verwenden zu müssen? Ein paar Ansätze habe ich, aber so wirklich gefallen tun sie mir alle nicht.
Entscheidung ins Model verlagern
Eine Möglichkeit wäre es, der Klasse Thread z.B. eine getImageSource-Methode zu verpassen, die dann von dem ImportantThread überschrieben werden könnte. Allerdings ist dies ein Wissen, welches das Model gar nicht haben sollte (je nach View mag es verschiedene Bilder geben). Von daher klingt dieser Ansatz für mich nicht sehr klug.
Eine extra Klasse aus der View für jedes Domänenobjekt
Ein anderer Ansatz wäre, für jedes Domänenobjekt noch ein Objekt aus der View zu nutzen.
Das könnte z.B. so aussehen:
Das Positive:
Das Negative:
Wirklich gefallen tut mir auch diese Möglichkeit nicht. Gibt es für mein Problem ein Möglichkeit, die ich übersehen habe? Irgendeine BestChoice vielleicht?
Das Domain-Model:
PHP-Code:
class Member implements User
{
//...
}
class Guest implements User
{
//...
}
interface User
{
public function getId();
public function getName();
public function getEmailAddress();
}
class Thread
{
public function getAuthor();
public function getName();
}
class ImportantThread extends Thread
{
}
- Ein ImportantThread soll ein anderes Bild als ein Thread bekommen.
- Ein Member soll verlinkt werden, ein Guest nicht.
Wie komme ich nun darum herum, in meiner View ständig if-else- oder switch-Konstrukte verwenden zu müssen? Ein paar Ansätze habe ich, aber so wirklich gefallen tun sie mir alle nicht.
Entscheidung ins Model verlagern
Eine Möglichkeit wäre es, der Klasse Thread z.B. eine getImageSource-Methode zu verpassen, die dann von dem ImportantThread überschrieben werden könnte. Allerdings ist dies ein Wissen, welches das Model gar nicht haben sollte (je nach View mag es verschiedene Bilder geben). Von daher klingt dieser Ansatz für mich nicht sehr klug.
Eine extra Klasse aus der View für jedes Domänenobjekt
Ein anderer Ansatz wäre, für jedes Domänenobjekt noch ein Objekt aus der View zu nutzen.
Das könnte z.B. so aussehen:
PHP-Code:
class MemberView extends UserView
{
public function hasLink()
{
return true;
}
//...
}
class GuestView extends UserView
{
public function hasLink()
{
return false;
}
//...
}
abstract class UserView
{
public static factory(User $user)
{
if ($user instanceOf Member) {
return new MemberView($user);
} else {
return new GuestView($user);
}
}
abstract function hasLink();
abstract function getLink();
//...
}
- Die if-else- bzw. switch-Konstrukte werden auf ein Minimum reduziert.
- Das Model kennt keine Daten der View
Das Negative:
- Parallele Vererbungshierarchien
- Sehr starke Kopplung der View-Klassen an das Model, Änderungen müssten oft doppelt erfolgen.
Wirklich gefallen tut mir auch diese Möglichkeit nicht. Gibt es für mein Problem ein Möglichkeit, die ich übersehen habe? Irgendeine BestChoice vielleicht?
Kommentar