![]() |
Klassendesign und Logik
Moin,
ich hab mir gerade eine Klasse erstellt, welche Felder einer Tabelle abbilden soll. Der Grund war, dass ich die eigentliche GUI nur noch zum anzeigen der Daten verwenden will, was mit jedem x-beliebigen Control sein könnte. Meine Frage wäre jetzt wie bekommt die Klasse mit, dass der Benutzer einen Wert in einem Feld geändert hat, so das wir z.B. ein entsprechendes Update in dieser Klasse, für die Tabelle aufrufen könnten (Ist-Wert entspricht nicht mehr Eingangswert, da müssten ja irgendwie beide Werte vorgehalten werden?) Sicherlich könnte man da jetzt irgendwas auf die schnelle mit Events zusammenschustern, aber ich würde gern hören, wie Ihr so etwas löst? Vermutlich wesentlich eleganter... |
AW: Klassendesign und Logik
Kommt immer ein wenig drauf an. Bewährte Konzepte, welche auch der Trennung von GUI, Business-Logik und Daten dienen sind z.B. MVC oder MVVW. Von der Umsetzung her könnte man unter Delphi z.B. auf DataBindings setzen .. Events sind aber definitiv auch eine legitime Möglichkeit.
Nachtrag: Oft sind die genannten Konzepte aber etwas starr und zumindest für kleine- bis mittelgroße Projekte mehr Last als von Nutzen. Bezüglich der Wert-Änderung, mache ich das meistens in meiner Model Klasse (deiner Entität, welche die Datenbank-Tabelle abbildet). Dort läuft das bei mir dann über Setter Funktionen der Art:
Delphi-Quellcode:
type
TModel = class(TObject) strict private FX: Integer; public ... public property X: Integer read FX write SetX; end; ... procedure TModel.SetX(const X: Integer); begin if (FX <> X) then begin FX := X; RaiseUpdateEvent; end; end; |
AW: Klassendesign und Logik
Zitat:
Genau das was ich im Kopf hatte als ich den Eingangspost erstellt hatte. MVC oder MVVW wäre vermutlich am besten allerdings sehe ich das genau wie Du, für so ein kleines Projekt ziemlicher Overkill, was sicherlich auch wieder Ansichtssache sein kann. Wie machst Du danach dein Update? Übergibst Du für dein Update SQL nur die Felder die tatsächlich geändert wurden oder machst Du ein Update aller Felder für den entsprechenden Datensatz? |
AW: Klassendesign und Logik
Zitat:
|
AW: Klassendesign und Logik
Wir nutzen da als "Schnittstelle" je Maske/Formular zwei Methoden:
Eine, um aus dem Objekt die Daten in das Formular zu bekommen und eine, um die Daten aus dem Formular in das Objekt zu bekommen. Da die Daten datenbankseitig grundsätzlich historisiert/versioniert werden, stellt sich die Frage, ob nur im Formular veränderte Daten übernommen oder alle, nicht. Jedes Attribut der Klasse hat ein entsprechendes "Gegenstück" im Formular. Ob man jetzt Plausibilitätsprüfungen in diesen Methoden vornimmt oder in den Settern des Objektes, ist ein bisserl Geschmacksfrage. Werden Plausibilitätsprüfungen auch benötig, wenn die Daten aus anderen Quellen, als der Maske, übernommen werden, bieten sich die Setter an. Eventuell erforderliche Typkonvertierungen zwischen Objektattribut und Anzeigecontrol finden in den beiden Methoden statt. |
AW: Klassendesign und Logik
Wie Zacherl schon sagte, kommt es auf den Umfang der Tabelle (also wieviele Felder) an. Bei kleinen Tabellen, würde ich persönlich gleich alle Felder Updaten.
Bei großen Tabellen, könnte man z.B. in den Settern ein Flag setzten, und beim Update diese Abfragen und so das Statement zusammenbauen. |
AW: Klassendesign und Logik
Das hat doch mit dem Umfang der Tabellen nichts zu tun, sondern mit dem Kontext, bzw. wie du Kollisionen entdecken kannst.
Ganz einfaches Beispiel: Original steht in der DB
Code:
User 1 ändert und speichert
Strasse: Holzweg 3
Ort: Walden
Code:
User 2 ändert und speichert
Strasse(*): Holzpfad 7
Ort: Walden
Code:
Heraus kommt jetzt
Strasse: Holzweg 3
Ort(*): Waldihausen
Code:
und diese Daten hat kein User jemals so abgesegnet.
Strasse: Holzpfad 7
Ort: Waldihausen |
AW: Klassendesign und Logik
@Schokohase
...na das ist ja dann erst die nächste Baustelle! Der TE hatte noch nichts von MultiUser Umgebung geschrieben, es ging erstmal nur um die Datenhaltung im Objekt usw. @Storm Im Prinzip suchst du ja nach einem ORM. Ob du das vom Umfang her benötigst kannst Du nur selbst entscheiden. |
AW: Klassendesign und Logik
Zitat:
|
AW: Klassendesign und Logik
Zitat:
Der Datensatz mit der ID 1 wird von zwei Benutzern gleichzeitig so wie beschrieben verändert. Wenn jetzt nur die Änderungen der Benutzer gespeichert werden, dann kommt dieser Unsinn heraus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz