![]() |
Nur veränderte Eigenschaften einer Klasse auslesen?
Ich möchte mir das "Leben" etwas vereinfachen, vielleicht bietet das aktuelle Delphi ja ein paar Konstrukte dafür, oder auch nicht, wenn ich auf dem Holzweg bin.
Ich habe eine Klasse mit mehreren Eigenschaften.
Code:
Die Eigenschaften werden beim Erzeugen einer Instanz einmal gesetzt und ab da immer mal wieder gelesen. Jetzt kommt es vor, das z.B. einer der beiden Werte geändert wird. Am Ende der Objekt-Lebenszeit hätte ich gern eine Möglichkeit zu sagen: "Objekt, gib mir mal alle deine geänderten Werte."
TFoo = class
public SomeInt : Integer; SomeString : String; end; Gibt es hierfür einen universellen Ansatz (bitte keine Getter/Setter, das ist zu umständlich). Wären RTTI-Attribute eine Möglichkeit? Mit Attributen hab ich noch nichts gemacht, vielleicht geht es ja auch gar nicht. Bin für jeden Tipp dankbar. |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
"bitte keine Getter/Setter, das ist zu umständlich"
Das wäre eigentlich der richtige Weg. Alternativ lege dir doch am Anfang eine Kopie der Datenstruktur an und vergleiche dann. Ansonsten hättest du mit Settern noch viel mehr Möglichkeiten. Logging, Begrenzung von sinnvollen Wertebereichen, all das. |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
Zitat:
Oder du verwendest Settermethoden und pimpst diese über AOP mit einer entsprechenden Überwachung.... |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
Zitat:
Zitat:
|
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe grade mal das hier:
Delphi-Quellcode:
(Delphi Mocks @
program Project11;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Rtti, System.Generics.Defaults, Delphi.Mocks.Helpers in 'Delphi.Mocks.Helpers.pas'; type TFoo = class(TObject) public var SomeInt: Integer; SomeString: String; public function Clone(): TFoo; end; function TFoo.Clone(): TFoo; begin Result := TFoo.Create(); try Result.SomeInt := SomeInt; Result.SomeString := SomeString; except Result.Destroy(); raise; end; end; procedure printFieldDifference(const a, b: TFoo); var context: TRttiContext; fields: TArray<TRttiField>; field: TRttiField; begin context := TRttiContext.Create(); fields := context.GetType(TFoo).GetFields(); for field in fields do if not field.GetValue(a).Equals( field.GetValue(b) ) then begin WriteLn('Field "', field.Name, '" is different.'); WriteLn('a: ', field.GetValue(a).ToString()); WriteLn('b: ', field.GetValue(a).ToString()); end; end; var myInstance: TFoo; myBackup: TFoo; begin myInstance := TFoo.Create(); myInstance.SomeInt := 42; myInstance.SomeString := 'Hallo Welt'; myBackup := myInstance.Clone(); // Irgendetwas geschieht... myInstance.SomeString := 'Tschüss Welt'; //myInstance.SomeInt := 99; printFieldDifference(myInstance, myBackup); myInstance.Destroy(); myBackup.Destroy(); readln; end. ![]() Wird benötigt um die TValue-Felder zu vergleichen Gibt am Schluss aus welche Felder verändert wurden. |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
"bitte keine Getter/Setter, das ist zu umständlich"
Was ist daran zu umständlich? Klassenvervollständigung und Templates/Live-Templates machen da praktisch alles automatisch. |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
Ich kann es schon etwas verstehen. Vergleiche mal
A) Eine Struktur mit fünf simplen Feldern B) Eine Struktur mit - Fünf public Properties - Zehn private (oder protected virtual) Getter/Setter-Methoden - Fünf private Felder Die Struktur die man ehemals mit einem schnellen Blick komplett erfasst hat ist jetzt schon um einiges aufgeblähter. In C# ist das ganze deutlich knackiger formuliert. Alternativ könnte die IDE Dinge wie einen funktionierenden Klassen-Explorer für ein schnelles UML-Diagramm mitbringen. Dann wäre das halb so wild ;-) |
AW: Nur veränderte Eigenschaften einer Klasse auslesen?
Zitat:
Edit: Könnte man eine Art LiveBinding "missbrauchen"? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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-2025 by Thomas Breitkreuz