In einer nicht verteilten Anwendung, scheint alles so schön einfach zu sein. Man sie objektorientiert implementieren, so dass ein Fachobjekt durch ein Objekt im Programm repräsentiert wird.
Wenn man die Anwendung aber auf mehrere verteilt, muss man sich die Frage stellen, ob und wie die Geschäftslogik verteilt werden soll.
Man kann die Geschäftslogik in der Datenbank als Stored Procedures und Trigger zentralisieren, und so die Datenintegrität aber auch Vendor-Lock-In und Abhängigkeit von der Infrastruktur maximieren. Oder man kann sie in der Client-Schicht direkt zum Benutzer schieben, und so die Netzwerklast aber auch die Korrektheit der Daten minimieren.
In einer mehrschichtigen Architektur, befindet sich die Fachlogik der Anwendung oft in der Mittelschicht.
| Client: | Darstellungslogik |
|---|---|
| Anwendungsserver: | Fachlogik |
| Datenbank: | Datenhaltung |
Die Zentralisierung bringt wichtige Vorteile: verständlichere Quelltexte, und einfachere Entwicklung der Fachlogik. Da die Fachlogik in nur einer Schicht liegt, ähnelt ihre Struktur der in einer unverteilten Anwendung. Leider hat diese Architektur auch Nachteile. z.B.:
Motivation: Und so bin ich etwas zwiegespalten: Einerseits möchte ich die Fachlogik wie in einer unverteilten Anwendung entwickeln - die Quelltexte sollten nur die Fachlogik und nicht die technischen Aspekte der Verteilung beinhalten. Sie sollten zentralisiert und zusammenhängend sein.
Anderseits möchte ich als Ergebnis eine Anwendung haben, die Bulk-Updates und Stored Procedures in der Datenbank verwendet; Zugriff auf die Daten für Ad-Hoc-Berichte ermöglicht, die Darstellung nach Benutzereingabe sofort (z.B. durch JavaScript im Falle einer browserbasierten Anwendung) aktualisiert, die Datenkonsistenz sicherstellt, sich gut skalieren und an andere Systeme ankoppeln lässt. Die Fachlogik sollte also quer durch alle Schichten redundant und in verschiedenen Technologien implementiert verteilt sein.
Lösung? Was ich möchte, ist ein Framework, das die Fachlogikquelltexte nimmt, und die so beschriebenen Fachregeln in die technischen Schichten der Anwendung verteilt. Ich möchte z.B. in einer Autobauer-Fachlogik-Sprache beschreiben, wie man ein Auto konfigurieren kann und wie der Listenpreis eines so zusammengestelltes Autos berechnet wird; und das Framework würde dafür sorgen, dass der Kunde sich sein Auto schnell Internet (mit JavaScript) zusammenstellen kann, dass der Autohändler eine Offline-Anwendung auf seinem Laptop bekäme, dass die Anwendungsserver des Autoherstellers nur korrekte Bestellungen akzeptieren würde...
So könnte man beides erreichen - die Fachlogik wäre einfach und zentralisiert beschrieben und gleichzeitig verteilt eingesetzt.
Leider kenne ich (noch?) kein Framework, mit dem man dies im vollen Umfang realisieren könnte :-(
Ein Beispiel, wie man bestimmte Regeln in verschiedenen Schichten aus
eindeutigen Quelltexten redundant verteilen kann, ist der
Validator im Struts.
Der Validator platziert die Validierungsregeln einerseits in die HTML-Seiten
und anderseits überprüft er sie auch in der Webserver-Schicht.
Allerdings handelt es sich in diesem Fall nicht um die Fachregeln, sondern
um die Validierung der Eingabefelder von Formularen.