![]() |
Zugriff auf Unterklasse absichern
Hallo zusammen,
ich habe folgende (vereinfachte) Klassenstruktur
Delphi-Quellcode:
Die Zuweisung in der letzten Zeile würde natürlich fehschlagen, wenn der Analyse keine gültige Methode zugewiesen ist. Wie fange ich diesen Fall am Besten ab:
TMethode = class
private FNo: Integer; FName: String; public property No: Integer read FNo write FNo; property Name: String read FName write FName; constructor Create; destructor Destroy; reintroduce; end; TAnalyse = class private FNo: Integer; FName: String; FMethode : TMethode; public property No: Integer read FNo write FNo; property Name: String read FName write FName; property Methode: TMethode read FMethode write FMethode; constructor Create; destructor Destroy; reintroduce; end; begin Label1.Caption := Analyse.Methode.Name; end;
Danke Gerd |
AW: Zugriff auf Unterklasse absichern
Die "elegante" Möglichkeit ist was andere Sprachen als "Elvis-Operator" oder (etwas seriöser) "Null-Propagation" kennen. Delphi hat das leider nicht.
Bleiben Möglichkeit 1 und 2: Entweder du belegst die "FMethode"-Referenz schon im TAnalyse-Konstruktor mit einer gültigen Dummy/Null-Instanz, oder du prüfst halt jedes mal. Beides ist legitim, wichtig IMO nur dass es vernünftig dokumentiert ist ob man sich drauf verlassen kann dass die Referenz niemals
Delphi-Quellcode:
ist oder man gefälligst vorher prüft.
nil
|
AW: Zugriff auf Unterklasse absichern
Es gibt bei Delphi die IfThen-Funktion, die ähnlich wie der Elvis-Operator (kannte die Bezeichnung bisher gar nicht) arbeitet.
Delphi-Quellcode:
Label1.Caption := IfThen(Assigned(Analyse.Methode), Analyse.Methode.Name, '');
Ist aber kein wirklich schöner Code. |
AW: Zugriff auf Unterklasse absichern
Zitat:
cu |
AW: Zugriff auf Unterklasse absichern
Richtig - Er würde ja erst alle Parameter auswerten (und scheitern) bevor er diese komische
Delphi-Quellcode:
-Methode überhaupt betreten würde.
IfThen
|
AW: Zugriff auf Unterklasse absichern
Man kann TAnalyse ggf. auch ein Property oder eine Funktion (Get)MethodeName spendieren, wo die Nil-Prüfung dann direkt gekapselt ist und man immer einen sinnvollen Text zurück erhält.
|
AW: Zugriff auf Unterklasse absichern
Eine ganz andere Frage:
Delphi-Quellcode:
:shock: :?:
destructor Destroy; reintroduce;
|
AW: Zugriff auf Unterklasse absichern
Hier gibt's einige Dinge, die man eleganter lösen könnte.
Einerseits können dich immutable objects vor dem unsauberen inneren Zustand des TAnalyse-Objekts schützen. Das würde bedeuten, dass Properties keine Set-Methode besitzen und daher nur lesend zur Verfügung stehen. Die Initial-Werte aller Properties werden dem Konstruktor per Parameter übergeben und können danach nicht mehr von außen verändert werden. Wenn beim Aufruf von TAnalyse.Create ein gültiges TMethod-Objekt übergeben werden muss und man es anschließend nicht mehr ändern kann, dann brauchst du dich mit Assigned-Checks nicht mehr herumplagen. Das bedeutet natürlich auch: Möchtest du den Wert einer Property ändern, musst du dir ein neues Objekt erstellen. Das klingt zwar aufwendig aber es verhindert eine Vielzahl von Fehlern. Nachdem ich vor ein paar Jahren Setter aus meinen Projekten verbannt habe, hat sich die Menge neuer Bugs erheblich reduziert. Viele Fehler entstehen durch inkonsistente interne Zustände von Objekten. Ohne Setter ist es erheblich leichter die Kontrolle zu behalten. Außerdem könnte die Einhaltung des ![]() Zuguterletzt sollten Destruktoren mit override markiert werden und nicht mit reintroduce. |
AW: Zugriff auf Unterklasse absichern
Zitat:
Die Fehlermeldung ist berechtig, aber anstatt den Fehler zu beheben, wird hier die Meldung deaktiviert. :freak: |
AW: Zugriff auf Unterklasse absichern
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 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