AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C/S mit Objekten - Grundsatzfrage

Ein Thema von stahli · begonnen am 21. Sep 2012 · letzter Beitrag vom 4. Okt 2012
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

C/S mit Objekten - Grundsatzfrage

  Alt 21. Sep 2012, 00:15
Ich habe mal ansatzweise überlegt, wie so eine Anwendung strukturiert wird.
Also ich würde mir das wie in der Skizze vorstellen:

Im Server gibt es eine Factory, die auf Anfrage Businessobjekte erzeugt bzw. heraus gibt.
Z.B. die Schüler, Lehrer, Klassen und Zimmer einer Schule.
Bei der Anfrage kann die ID des gewünschten Objektes übergeben werden. Sonst kann auch ein neues Objekt erzeugt werden.
Die Factory bleigt Eigentümer der Objekte und gibt die nach einiger Zeit und vollem Puffer wieder frei.
Intern werden die Daten über einen ORM aus einer Datenbank geholt.

Die gesamte Geschäftslogik läuft in den Objekten, die die Factory erzeugt. Greift ein Objekt auf ein anderes zu, holt es sich entsprechend auch über die (eigene) Factory.

In den Clients gibt es auch eine Factory, die eine bestimmte Menge an Objekten puffern kann und die ggf. wieder verwirft.
Allerdings holt diese die Daten über ein Protokoll vom Server.

Die GUI-Controls holen sich die Daten aus den Eigenschaften der Objekte, die die Factory bereit stellt.
An der Stelle fällt mir ein, dass das neue LiveBinding dafür nicht taugen wird, da die GUI-Controls jeweils eine ObjektId (z.B. PersonId) und die Factory kennen, bei Bedarf von der Factory ein entsprechendes Objekt abrufen und sich dann selbst an die gewünschte Objekteigenschaft (z.B. Person.FirstName) binden müssen. Insofern wird hier das Konzept meiner bisherigen odControls in ähnlicher Form sinnvoller sein als das (durchaus interessante) LiveBinding.

Die Clients müssten beauftragt werden, sich neu zu zeichnen, wenn im Server Änderungen erfolgen.
Objekte haben einen Zeitstempel, in dem die letzte Änderung gespeichert wird (Uhrzeit auf dem Server). Wenn das lientobjekt den gleichen Zeitstempel hat muss das Objekt nicht neu zum Client übertragen werden.
Ebenso müssen die Clients Datenänderungen natürlich an den Server schicken.


Bis hierher ist mir alles so ziemlich klar und klingt machbar.
Hoffe, dass Ihr mir das nicht alles um die Ohren haut...


Z.B. eine Namensänderung einer Person lässt sich so recht leicht syncronisieren. Wie geht man aber mit komplexen Methodenaufrufen um, die die Geschäftslogik betreffen?
Z.B. könnte es eine Methode geben TStudent.MoveToClass(Class: TClass) geben. Diese Aktion kann ja nicht im Client durchgeführt werden.
Wie gibt man diese denn an den Server weiter? Als Zeichenkette, die der Server dann wieder (per RTTI?) als Objektmethode ausführt? Dann müsste aber u.U. auch wieder ein Result an den Client geschickt werden (für eine sinnvolle Reaktion der GUI und Focusänderung)!?
Dann müssten die Objekte jeweils wissen, ob sie sich im Server oder Client befinden. Im Client könnten die Methoden "normal" arbeiten und im Client müssten sie eine Anweisung an den Server schicken.

Gibt es irgendwo Informationen, wie solche Anwendungen arbeiten?
Miniaturansicht angehängter Grafiken
csoop.jpg  
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: C/S mit Objekten - Grundsatzfrage

  Alt 21. Sep 2012, 07:02
Gibt es irgendwo Informationen, wie solche Anwendungen arbeiten?
Patterns of Enterprise Application Architecture (Martin Fowler, verlegt bei Addison Wesley) hat dazu einige Kochrezepte.

Ich bin ein großer Fan des "Service Layers" - der Client spricht mit einem zustandslosen Service Layer, das ist eine Art Interface bei dem der Client die komplexeren Aktionen wie MoveToClass als Remote Procedure Call ausführt. Auch "Remote Facade" und "Data Transfer Object" sind wichtige Patterns.

Ich setze diese Patterns in Java Enterprise Edition Anwendungen an. Geht aber analog auch mit Delphi. Zwischen den Schichten wie Webanwendung (serverseitig) und Enterprise JavaBean (auch im Server) werden dann Data Transfer Objekte über eine "Facade" ausgetauscht.
Michael Justin

Geändert von mjustin (21. Sep 2012 um 07:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: C/S mit Objekten - Grundsatzfrage

  Alt 24. Sep 2012, 19:51
Michael, danke für den Tipp. Das Buch habe ich heute (in deutsch) bestellt und darf vor dem Kauf auch nochmal rein schauen.


Aber mal noch eine grundsätzliche Frage zur Realisierung über DataSnap.

Ich würde in meinem Client ein Panel verwenden, das (wie im Bild) einen Schüler darstellt. Durch Doppelkick soll eine Funktion Student.SwipNames(Age:Integer):Boolean aufgerufen werden, die den Vornamen und Nachnamen vertauscht und ein Alter zuweist (auch wenn das natürlich recht sinnfrei ist).

Implementiert wäre das etwa so:
Delphi-Quellcode:
function TStudent.SwipNames(Age_:Integer): Boolean;
var
  S: String;
begin
  S := FirstName;
  FirstName := LastName;
  LastName := S;
  Result := (Age <> Age_);
  Age := Age_;
end;
In einer Desktopanwendung würde PanelStudent, wenn es das Student-Objekt kennt ja einfach die Methode aufrufen und gut ist.

Über DataSnap würde ja eine Persistentklasse registriert (hier mal TSchool), die im Client und Server bekannt ist.
Jetzt kann der Client Methoden von TSchool ausführen, die DataSnap zum Server weiter leitet.

Von TStudent direkt können aber keine Methoden ausgeführt werden - oder?

Also müsste man eine neue Funktion

TSchool.Student_SwipNames(Student: TStudent; Age_:Integer): Boolean
bzw.
TSchool.Student_SwipNames(StudentId: Integer; Age_:Integer): Boolean

einführen, der das Student-Objekt oder dessen Id übergeben wird und die dann die eigentliche Funktion ausführt. Richtig?


Das PanelStudent dürfte dann beim Doppelklick nicht die StudentObjekt-Methode ausführen, sondern die School-Methode auf dem Server starten.
Aber es dürfte keine Methode eines im Client instanziierten Student-Objektes ausgeführt werden. Das StudentObjekt müsste sich also unterschiedlich verhalten, je nachdem ob es im Client oder auf dem Server instanziiert wurde.
Oder gibt man an den Client nur reine Datenobjekte ohne jede Geschäftslogik?
Ich komme da zu keinem Schluss...

Funktioniert das so? Bzw. wo liege ich daneben? Wie kommt das Result zurück zum Client?
Wie sieht ein Setter (z.B. set_FirstName) eines TStudent-Objektes im Client aus? Dort klassisch Value an FFirstName zuzuweisen macht ja keinen Sinn...

Gibt es dazu Infos?

(Sonst finde ich Demos und Erklärungen zu DataSets, die für meinen Anwendungsfall ja nicht passen.)
Angehängte Grafiken
 
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: C/S mit Objekten - Grundsatzfrage

  Alt 24. Sep 2012, 20:08
Also auch bei einer Desktop-Anwendung würde ich dem Model keine weiterführende Funktionalität zuweisen, sondern dieses eben auch an eine Methode einer Verwaltungsklasse übergeben.

Diese Verwaltungsklasse ist bei C/S aber nur eine Durchreiche an den Server und die Bearbeitung findet dort statt.

Also statt
Delphi-Quellcode:
TStudent.SaveTo(WhereEver);
TStudent.SwipNames(AAge : integer)
nehme ich lieber
Delphi-Quellcode:
TSchoolManager.Save( ASchoolSubject : TSchoolSubject );
TSchoolManager.SwipNames( APersonSubject : TPersonSubject; AAge : Integer );
Delphi-Quellcode:
TSchoolSubject = class
...
end;
TPersonSubject = class(TSchoolSubject)
...
end;
TStudent = class( TPersonSubject )
...
end;
Warum?

Der Manager weiß, ob und wenn ja wohin und wie er speichern soll.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: C/S mit Objekten - Grundsatzfrage

  Alt 24. Sep 2012, 23:07
Ok, in dem Zusammenhang klingt das plausibel. Aber die Möglichkeiten der OOP werden dadurch ja eigentlich nicht ausgeschöpft bzw. zu Gunsten anderer Aspekte zurückgefahren.

Kannst Du mal noch andeuten, wie Du dann
Delphi-Quellcode:
  TSchoolManager.Save( ASchoolSubject : TSchoolSubject );
  TSchoolManager.SwipNames( APersonSubject : TPersonSubject; AAge : Integer );
implementierst?

Würdest Du dann die entsprechende Ausführung letztlich doch in den übergebenen Objekten ASchoolSubject.Save (sofern kein Serialisierer eingesetzt würde) und APersonSubject.SwipNames(AAge) vornehmen oder die Objekte lediglich wie Records ohne Funktionalität behandeln?
Wenn die Funktionalität in den Objekten steckt, müsste aber sicher gestellt sein, dass diese auf den Clients (dort können die Objekte ja auch instantiiert werden) nicht ausgeführt wird (z.B. durch eine Reaktion auf einen bestimmten Wert in einem Setter).

Vielleicht wäre es ja daher doch nicht so verkehrt, die Daten zwischen Server und Client als DataSets zu übertragen und nur auf dem Server mit Business-OOP zu arbeiten?

Oder man erstellt reine Datenklassen, die man im Client verwendet und für den Server um die Businesslogic erweitert. Aber dann passt das mit der Übertragung nicht zusammen. Und selbst wenn man in einem Setter ggf. den Value korrigieren würde, wäre das ja schon eine Art Businesslogic!?

Ach Mann - ich koche mir lieber erst mal noch einen Kakao...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: C/S mit Objekten - Grundsatzfrage

  Alt 25. Sep 2012, 02:42
Im Anhang mal ein Mini-Beispiel (nur Source) mit der Speicherung in einem FlatFile.

Für alle anderen Speicherorte/-ziele (DB,XML,etc.) einfach einen entsprechende Handler schreiben.
Das Model und der Manager bleiben davon unberührt ... und das ist auch gut so.

Besondere Beachtung bitte der Klasse TVisitor schenken, die habe ich dem Uwe gRaabet
Angehängte Dateien
Dateityp: zip CS_School.zip (5,0 KB, 18x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: C/S mit Objekten - Grundsatzfrage

  Alt 25. Sep 2012, 19:47
Ok, vielen Dank für die Mühe!
Ich hoffe, dass ich Dich nicht nicht überstrapaziere - oder dass ich mich jedenfalls mal irgendwann revangieren kann!


Also implementierst Du Deine Objekte als reine Datenspeicher ohne jegliche Funktionalität, die statt dessen komplett im Manager und den dazu gehörigen Klassen untergebracht wird.
Der Einfachheit halber denke ich mir die Visitor und den Writer mal weg.
Dann werden die Objekte an an den Manager übergeben, der die Eigenschaften der Objekte irgendwo speichert. Ok.
Für die Serverseite ist das für mich soweit verständlich.

Aber wie wird im Client auf Änderungen reagiert?
Z.B. soll ein Edit an PersonWithId1.FirstName gebunden werden. Jeder Tastendruck soll den Personennamen an den Server übertragen und dort in der Datenschicht ändern.
Mit DataBinding sehe ich da keine Möglichkeit. Es gibt ja kein Personenobjekt auf dem Client, an das sich das Edit binden kann.
Das Edit müsste dazu eine Id (1), den gewünschten PropertyNamen ("FirstName") und den ClientManager kennen um bei diesem Manager ein entsprechendes Objekt abzufordern, an das es sich dann binden kann.
Ein Standardedit kann das aber ja nicht.
Somit müsste alternativ die GUI (z.B. in Form.Show) die Daten vom Server holen und das Edit händisch an die Daten kleben. Und Glue Code will man ja nicht mehr.

Jetzt wird es noch schwieriger...
Änderungen im Edit werden nun an das Personenobjekt im Client geschickt, welches die Änderung brav in FFirstName vermerkt.
Dadurch geht aber doch keine Meldung an den Server!?

Statt dessen müsste doch (soweit ich das bisher durchschaue) das Edit im OnChange etwa folgendes veranlassen:
ClientManager.SetFirstName(PersonWithId1, EditFirstName.Text); Datasnap schickt den Auftrag dann an den Server, der dann die Änderung vornimmt.
Für jede Klasse und jede Eigenschaft müsste der Manager eine entsprechende Methode bereit halten.

Ist das so?
Ich hoffe nicht!
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: C/S mit Objekten - Grundsatzfrage

  Alt 25. Sep 2012, 20:48
Äh, nee, da hast du das Konzept noch nicht verstanden

Das alles ist so für den Client. Auf dem Server könnten die Daten völlig anders abgelegt sein..

Der Manager nimmt die Objekte entgegen und übergibt diese an die Datenschicht.
Was diese Datenschicht damit macht ist der GUI, dem Objekt und sogar dem Manager sowas von egal.
In diesem Beispiel werden die Daten in eine Textdatei gepackt.
Aber wo wäre das Problem, hier etwas zu haben, was die Daten in einen Stream packt und an einen Server sendet. Oder eine email schreibt - gut das ist sinnlos, aber möglich und es würde sich keiner der restlichen Beteiligten daran stören.
Warum auch, der Manager hat den Wunsch der Speicherung durchgereicht und die Datenschicht meldet zurück "ist erledigt"
Jetzt wird natürlich implizit auch erwartet, dass der Wunsch des Ladens ebenso wieder erfüllt wird.
Frage an den Manager, der an die Datenschicht und die muss jetzt zusehen, wie sie da rankommt.

Aber jetzt mal im Ernst, warum sollte jeder Tastendruck an den Server geschickt werden?
Die Oberfläche (z.B. ein Edit) bekommt einen Wert aus einem Objekt geliefert (DataBinding). Dieser kann jetzt verändert werden.
Wenn alle Änderungen erfolgt sind, dann gibt es eine Entscheidung, diese Daten zu speichern.
Also die Daten von der Oberfläche in das Objekt (DataBinding) und jetzt das Objekt an den Manager.
Der Rest ist wie gehabt.

Für eine Validierung der Daten macht es durchaus Sinn, diese vom Manager überprüfen zu lassen.
Die Vorgehensweise ist die gleiche wie beim Speichern, nur dass dem Manager mitgeteilt wird, diese zu prüfen und eben nicht zu speichern.

Wo die Validierung erfolgt (im Client, ein Teil auf dem Client und ein Teil auf dem Server oder ausschließlich auf dem Server) ist dem Objekt und der GUI wieder sowas von egal. Hauptsache es wurde geprüft und man bekommt zurück ob das ok ist oder wo die Fehler sind.

Achja, die Frage wer holt denn jetzt die Daten?

Es wird eine Entscheidung getroffen, einen TStudent mit der ID 5 zu bearbeiten (Doppelklick auf ein Listenelement einer ListView)

Instanz vom Manager laden lassen
EditFormular aufrufen und Instanz übergeben
DataBinding übergibt die Daten an die GUI
Jetzt darf getippt werden bis zum OK (oder Abbruch)
DataBinding übergibt die GUI Daten an das Objekt
EditFormular wird geschlossen
Instanz an den Manager übertragen zum Speichern
fertisch
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: C/S mit Objekten - Grundsatzfrage

  Alt 26. Sep 2012, 01:25
Dann haben wir uns falsch verstanden (oder zumindest ich Dich).

Ich bin ursprünglich von einem Thin Client ausgegangen, der nur der Darstellung und Eingabe von Daten dient.
Die gesamte Geschäftslogik soll im Server laufen (der evtl. einen ORM nutzt und darüber ggf. auf einen DB-Server zugreift - genau so gut könnten die Objekte des Servers aber auch persistent im Speicher gehalten werden - das würde für die Clients absolut keinen Unterschied machen).
Die Clients müssen sich nur die Daten (Objekte) abholen, die sie gerade anzeigen müssen. Alles andere interessiert sie nicht.
(Der Manager kümmert sich allerdings um eine Zwischenpufferung der Objekten und verwirft sie nach einiger Zeit wieder wenn sie nicht benötigt werden.)

Ich will dann auch nicht ein bestimmtes Objekt (z.B. Person) händisch abrufen und beim Öffnen eines Bearbeitungsformulars mit der GUI verdrahten, sondern die GUI-Controls sollen das selbständig erledigen.
Nach meinen Vorstellungen erhält das Formular einen Controller, dem eine ObjektId zugewiesen werden kann. Daraufhin öffnet er das Formular, auf dem er sich befindet und gibt die Id an alle enthaltenen GUI-Controls des Formulars weiter.
Edit1.MyPropName wurde bereits zur Designtime 'FirstName' zugewiesen und Edit2.MyPropName entsprechend 'LastName'. Die Edits holen jetzt von globalen Manager das Objekt mit der betreffenden Id und binden sich (selbständig) an dessen Propertys "FirstName" bzw. "LastName".
Verschachtelungen sind in diesem Szenario auch möglich. Hat z.B. eine Person ein Unterobjekt "Adress" und dieses die Eigenschaften "City" und "Street" können z.B. zwei Labels die MyPropNames "Adress.City" und "Adress.Street" zugewiesen werden. Über RTTI wird die Zuweisung dann aufgelöst und die beiden Labels an die entsprechenden Eigenschaften des Unterobjektes "Adress" gebunden.

So würde ich mir das wünschen und so nutze ich das bereits in einer Desktopanwendung (jedoch noch nicht als C/S).


Ob nun jeder Tastendruck zum Server gehen soll, darüber kann man natürlich unterschiedlicher Auffassung sein. Ich würde aber dahin tendieren.
Spätestens mit Verlassen eines Edit-Feldes oder nach einer Eingabepause sollte eine Syncronisation erfolgen.
Ändere ich im Objekt den PersonX.FirstName wird ja damit erst mal noch nichts an den Server geschickt und nichts validiert.

Grundsätzlich könnte aber im Setter jeder Eigenschaft (TPerson.set_FirstName, TPerson.set_FirstName usw.) geprüft werden, ob sich das Objekt im Server oder im Client befindet (z.B. ob ein TClientManager existiert) und im letzteren Fall das Objekt zur Übertragung an den Server anmelden (Warteschlange) oder es auch sofort vom Server validieren lassen.

Im Client will ich letztlich nur die Controls platzieren und die Eigenschaftsnamen zuweisen. Per Code muss dann nur die GUI-Logik geschrieben werden.
Die GUI muss nichts von den Objekten wissen.

Ein Framework beschafft im Hintergrund die Datenobjekte und bindet sie per RTTI an die GUI-Controls (sofern ein entsprechendes Objekt gefunden wurde und die in "MyPropName" angegebene Eigenschaft existiert - sonst wird das Control gecleart).


Die BusinessLogic soll m.E. komplett im Server laufen. Der Client braucht demzufolge auch gar keine geschäftsfähigen Objekte sondern letztlich einfach nur die Daten.
Die Frage ist für mich allerdings, wie man die Businesskommunikation zwischen Client und Server abwickelt, die über reine Datenänderungen hinaus gehen.
Dieses Problem löst ja offenbar DataSnap, jedoch ist mir das alles zu komlex, als dass ich da einen Einstieg finde. Ein paar frühe Demovideos sahen ganz interessant aus. Das aktuelle erschlägt mich aber ziemlich.


Sir, bei Deiner Zusammenfassung kann ich auch nicht komplett folgen, Sir (jedenfalls nicht in der Reihenfolge):
- Instanz vom Manager laden lassen
ok
- EditFormular aufrufen und Instanz übergeben
ok
- DataBinding übergibt die Daten an die GUI
Hier musst Du die Datenbindung von Hand vornehmen, oder?
Entweder kannst Du klassisch Edit1.Text:=Person.FirstName vornehmen oder Du musst in ähnlicher Weise ein LiveBinding (im Quelltext) vornehmen.
- Jetzt darf getippt werden bis zum OK (oder Abbruch)
ok
- DataBinding übergibt die GUI Daten an das Objekt
Das ist missverständlich. Die Daten WURDEN bereits per LiveBinding in das Objekt geschrieben oder im anderen Fall musst Du wieder Person.FirstName:=Edit1.Text zuweisen.
- EditFormular wird geschlossen
Und hier muss entschieden werden, ob die neuen Daten des Objektes gespeichert (also an den Server geschickt) werden sollen (ggf. mit vorheriger Validierung) oder nicht.


Dein Szenario würde ich letztlich nicht einmal als wirkliche C/S-Anwendung, sondern eher als Datenbankanwendung bezeichnen wollen (Ich biete Dir bereits hier eine Friedenspfeife an! ).
Die Clients sind eigenständige Programme, die ihre Daten an einer zentralen Stelle speichern und gemeinsam darauf zugreifen.
Das macht jede Datenbankanwendung so, nur dass Du die Daten in Objekten weiter verarbeitest.

Oder lehne ich mich da zu weit aus dem Fenster?
Oder ist es einfach schon wieder zu spät für mich? Nachti!
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (26. Sep 2012 um 12:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#10

AW: C/S mit Objekten - Grundsatzfrage

  Alt 26. Sep 2012, 07:57
Dann haben wir uns falsch verstanden (oder zumindest ich Dich).

Ich bin ursprünglich von einem Thin Client ausgegangen, der nur der Darstellung und Eingabe von Daten dient.
Die gesamte Geschäftslogik soll im Server laufen (der evtl. einen ORM nutzt und darüber ggf. auf einen DB-Server zugreift - genau so gut könnten die Objekte aber auch persistent im Speicher gehalten werden - das würde für die Clients absolut keinen Unterschied machen).
Die Clients müssen sich nur die Daten (Objekte) abholen, die sie gerade anzeigen müssen. Alles andere interessiert sie nicht.
(Der Manager kümmert sich allerdings um eine Zwischenpufferung der Objekten und verwirft sie nach einiger Zeit wieder wenn sie nicht benötigt werden.)
Das willst Du nicht wirklich. Natürlich interessiert den Client die Geschäftslogik. Und zwar sowas von.

Insbesondere zum Beispiel die Validierung. Wenn ich auch nur anfange falsche Usereingaben zu machen, dann soll mich die GUI *sofort* darüber informieren - und nicht erst, wenn ich nach der Mittagspause zurück komme und auf 'speichern' drücke - und dann das ganze erst zum Server geht und dort erst validiert wird.

Die Idee mit 'die Anwendung geht sofort zum Server' kannst Du unmittelbar verwerfen. Das Skaliert nicht. Der Server müsste für jeden Client ein eigenes Datenuniversum vorhalten (was ist, wenn ein User nahezu alle Daten verändert, aber nie auf Speichern klickt?). Was ist, wenn die Netzwerkverbindung ausfällt? Das ganze ist nur für extrem beschränkte Anwendungsfälle möglich, und jede kleine Anforderung die es erfordert, aus dieser 'Immer da, unendlich bandbreite, kurze Roundtrips, genug Serverkapazität'-Komfortzone auszubrechen ist mit Deiner Architektur nicht abbildbar und erfordert unmengen an Aufwand.

Und natürlich kannst Du die Validierung auch nicht komplett auf den Client verschieben. Der Server kann sich niemals sicher sein, dass ein 'korrekter' Client mit ihm spricht und ihm bereits validierte Daten liefert. Er muss die Validierung zwangsläufig nochmal durchführen. Es hätte ja jemand die Kommunikation abhören können und der schickt nun gefälschte Anfragen.


Rockford Lhotka hat in seinem Buch 'Expert C# 2008 Business Objects' (http://www.amazon.com/Expert-C-2008-.../dp/1430210192) ziemlich viele geniale Konzepte über Verteilte Anwendungen beschrieben. Seine Implementierung hat er - wie der Name schon sagt - für .NET umgesetzt, aber in dem Buch geht es mehr um die Konzepte dahinter.

Die Idee ist es, eine verteilte Anwendung so aufzuteilen, dass es egal ist, wo welche Schicht läuft.
Das heisst in dem konkreten Fall einer klassischen 3-tier Anwendung (DB, Appserver & Client) läuft die absolut identische Businesslogik *sowohl* auf dem Server als auch auf dem Client. Nur so kann eine gescheite, sofortige Reaktion auf die Usereingabe erfolgen und der Server sicher sein, dass valide Daten vorliegen. Du hast aber durch diese Architektur auch sofort die Möglichkeit, dass der Appserver weggelassen wird und Du, nur durch umkonfigurieren und ausrollen einer zusätzlichen dll (die die Datenzugriffsschicht enthält) aus der 3- eine 2-Schicht Anwendung zu machen (das klassische Client/Server Modell: Client-Anwendung gegen Datenbank-Server).

Aber im Prinzip versuchst Du hier
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz