Was ist der Weg des geringsten Übels beim Umgang mit Polymorphismus und Vererbung von Entitätstypen in einer serviceorientierten Architektur?
Ein Prinzip von SOA (so wie ich es verstehe) ist es, Entitätsklassen als reine Datenkonstrukte zu haben, die keine Geschäftslogik enthalten. Die gesamte Geschäftslogik ist in eng umgrenzten, lose gekoppelten Diensten enthalten. Das bedeutet, dass die Service-Implementierungen so klein wie möglich sind, um die lose Kopplung zu fördern, und dass die Entitäten nicht wissen müssen, was sie tun. jede Verhalten, das das System an ihnen vornehmen kann.
Aufgrund der recht verwirrenden Entscheidung von Java, die angegebener Typ bei der Entscheidung über die zu verwendende überladene Methode wird jegliches polymorphes Verhalten in den Dienstimplementierungen durch eine Reihe von Konditionalitäten ersetzt, die Folgendes überprüfen object.getClass()
oder mit instanceof
. Dies erscheint in einer OOPL eher rückständig.
Ist die Verwendung von Konditionalen die akzeptierte Norm in SOA? Sollte die Vererbung in Entitäten aufgegeben werden?
UPDATE
Ich meine definitiv das Überladen und nicht das Überschreiben.
Ich definiere SOA so, dass das Verhalten des Systems nach Anwendungsfällen in Schnittstellen gruppiert wird und die Logik für diese in der Regel in einer Klasse pro Schnittstelle implementiert wird. Als solche wird eine Entitätsklasse (z.B. Product
) wird zu nichts weiter als einem POJO mit Gettern und Settern. Sie sollte auf keinen Fall Geschäftslogik enthalten, die mit einem Dienst zusammenhängt, denn dann führen Sie einen Kopplungsschwerpunkt ein, bei dem die Entitätsklasse über alle Geschäftsprozesse Bescheid wissen muss, die jemals auf ihr ablaufen könnten, was den Zweck einer lose gekoppelten SOA völlig negiert.
Da man also kein geschäftsprozessspezifisches Verhalten in eine Entitätsklasse einbetten sollte, kann man mit diesen Entitätsklassen keinen Polymorphismus verwenden - es gibt kein Verhalten, das man überschreiben könnte.
UPDATE 2
Das oben beschriebene Verhalten ist einfacher zu erklären als eine überlastet Pfad wird gewählt bei Kompilierzeit und ein außer Kraft gesetzt Pfad bei Laufzeit .
Es wäre eine schlechte Praxis, eine Unterklasse Ihrer Service-Implementierung für jeden Untertyp der Domänenmodellklasse zu haben, auf die sie wirkt, also wie umgeht man das Problem des Überladens zur Kompilierzeit?