| 

.NET C# Java Javascript Exception

2
Hallo
ich habe gerade den Blogeintrag von Stefan Lieser (Link) gelesen und habe nun eine Frage:
Koppelt man durch dieses Prinzip nicht den Kundenhandler sehr eng an die Klasse Person?

Beispiel: Ich möchte nicht nur Name und Adresse sondern auch Email-Adresse ausgeben. Dann muss ich die Methode: HandleDetails anpassen und erweitern.
public void HandleDetails(Kundenhandler handler)
{
//code der schon da steht
Handler.Email(email);
}

Nun müssen wir auch noch die Klasse Kundenhandler mit allen abgeleiteten Klassen ändern.
Was ist nun wenn ein Handler aber keine Email-Adresse verarbeiten darf?

Muss ich dann eine neue Methode in der Klasse Person erstellen, welche die neue Email-Adresse nicht verwendet und die Vererbungshirachie auflösen???

Oder soll der Handler einfach die abgeleitete Email Methode leer lassen?

Irgendwie bin ich etwas verwirrt... :(
13.09.2009
Slurmy 41 3
1 Antwort
3
Ich kann schwerlich antworten, ohne zuerst meine Bedenken zu formulieren
(1) Tell, Don't Ask scheint mir bei einigen Proponenten als universell wirksames snake oil angepriesen zu werden. Die Frage ist aber, ob wirklich der Producer der Daten immer über die anzuwendende Strategie entscheiden kann, und es nicht in anderen Fällen eben die Consumer sind.
(2) Selbst allgemeine Gültigkeit der Idee vorausgesetzt, ist Liesers Beispiel ausgesprochen schlecht, weil die einzelnen Felder überhaupt nicht mit verschiedene Strategien verbunden sind, über die das Objekt Kunde Geheimwissen besitzt.

Diese beiden Caveats ignorierend, würde ich auf Deine konkrete Fragen antworten, dass dieser Fall am besten in dynamischen Sprachen behandelt werden kann, wo das Consumer-Objekt (Kundenhandler) ihm unbekannte Methoden einfach ignoriert. In C# könnte man so etwas auf mindestens zwei Wegen simulieren.

public void HandleDetails(Object handler)
{
if (handler is INameConsumer) {
(handler as INameConsumer).Name(string.Format("{0} {1}", vorname, name));
}
if (handler is INummerConsumer) {
(handler as INummerConsumer).Nummer(nummer);
}
if (handler is IEmailConsumer) {
(handler as IEmailConsumer).Emails(email);
}
}


bzw.

public void HandleDetails(Handler handler)
{
handler.put ("name", string.Format("{0} {1}", vorname, name));
handler.put ("nummer", nummer);
handler.put ("email", email);
}
13.09.2009
pjacobi 1,1k 2 7

Stelle deine Best-practice-Frage jetzt!