![]() |
Gemischte Verwendung von Class und TRecord
Hallo zusammen,
ich habe ein paar ältere Threads zu diesem Thema gefunden, wollte aber mal ein kurzes Feedback, ob sich hier etwas geändert hat. Die Frage ist, was für/gegen eien gemischet Verwendung von Klassen und Records spricht. Hier die beiden Code-Varianten:
Delphi-Quellcode:
oder die reine Klassen-Variante
Type
TPosition = record X, Y, Z: Integer; end; TTest = class private FNr: Integer; FName: String; FPosition: TPosition; procedure SetNr(iNumber: Integer); public property Nr: Integer read FNr write SetNr; property Name: String read FName write FName; constructor Create; destructor Destroy; override; end;
Delphi-Quellcode:
Ich sehe in der zweiten Variante zunächst vor allem den Mehraufwand
Type
TPosition = Class FX, FY, FZ: Integer; public property X: Integer read FX write FX; property Y: Integer read FY write FY; property Z: Integer read FZ write FZ; constructor Create; destructor Destroy; override; end; TTest = Class private FNr: Integer; FName: String; FPosition: TPosition; procedure SetNr(iNumber: Integer); public property Nr: Integer read FNr write SetNr; property Name: String read FName write FName; constructor Create; destructor Destroy; override; end;
TTest steht nicht zur Diskusion. Hier habe ich in obigem Code nur einen Bruchteil der Funktionalität dargestellt. Danke für euer Feedback Gerd |
AW: Gemischte Verwendung von Class und TRecord
Dein TPosition ist ein sogenanntes
![]() Berücksichtigt man deren Eigenschaft der Unveränderbarkeit (ich kann nicht einfach nur X, Y oder Z ändern) merkt man bei der Speicherverwaltung von Delphi, dass man sich dann oft um das Freigeben, des vorherigen Objekts kümmern muss, wenn man eine neue TPosition erzeugt und zuweist. Daher bietet sich hierfür eher die Verwendung von Records an. (bei Sprachen mit GC oder anderer automatischer Speicherverwaltung ergibt sich dieses Problem nicht, daher werden dort auch oft Klassen statt Records/Structs benutzt) Außerdem kann man bei Records einfacher implizite oder explizite Typkonvertierung durch Operatorüberladung einbauen. Das könnte zur Folge haben, dass man auch beim Record private Felder, öffentliche readonly Eigenschaften und ggf einen Konstruktor benutzt. |
AW: Gemischte Verwendung von Class und TRecord
Gerne wird vergessen, dass in Delphi auch Folgendes für Records möglich ist:
Delphi-Quellcode:
Damit hat man dann auch Kontrolle über Veränderungen - in diesem Beispiel wahrscheinlich nicht sinnvoll, aber man sollte es im Hinterkopf haben. Und dann sind Records wirklich ein praktisches Mittel für die Value Objekte.
type
TPosition = record private FX, FY, FZ: Integer; procedure SetX(const Value: Integer); procedure SetY(const Value: Integer); procedure SetZ(const Value: Integer); public property X: Integer read FX write SetX; property Y: Integer read FY write SetY; property Z: Integer read FZ write SetZ; end; ...:cat:... |
AW: Gemischte Verwendung von Class und TRecord
Zitat:
Was im Zusammenhang mit Records auch gut ist, da es so nicht so Code wie diesem kommen kann:
Delphi-Quellcode:
Und man sich dann wundert, warum es nicht mehr funktioniert nachdem man für die Position Eigenschaft einen Getter geschrieben hat
test.Position.X := test.Position.X + 10;
(weil man nun X einer Kopie - Records sind Value types - ändert) |
AW: Gemischte Verwendung von Class und TRecord
Ich bin jetzt vielleicht blöd, aber wieso ist TPosition ein ValueObject?
Sherlock |
AW: Gemischte Verwendung von Class und TRecord
Zitat:
Zitat:
Delphi-Quellcode:
Angenommen ich habe nun noch Setter für X, Y, Z. Wenn ich nun
pos := TPosition.Create(4, 5, 6);
obj1.Pos := pos; obj2.Pos := pos;
Delphi-Quellcode:
schreibe, ändert sich dann die Position von obj2 möglicherweise auch.
obj1.Pos.X := 7;
|
AW: Gemischte Verwendung von Class und TRecord
Zitat:
Delphi-Quellcode:
...:cat:...
type
TPosition = record private FX, FY, FZ: Integer; public class function New(const aX, aY, aZ: Integer): TPosition; static; property X: Integer read FX; property Y: Integer read FY; property Z: Integer read FZ; end; class function TPosition.New(const aX, aY, aZ: Integer): TPosition; begin Result.FX := aX; Result.FY := aY; Result.FZ := aZ; end; |
AW: Gemischte Verwendung von Class und TRecord
Danke, Stevie!
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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