![]() |
Delphi-Version: XE5
Methoden-Parameter soll Referenz, aber kein nil sein können
Hallo.
Kann ich den "Gültigkeitsbereich" eines Parameters einschränken, dass ich zwar gerne Objekte annehme, aber kein
Delphi-Quellcode:
?
nil
Beispiel:
Delphi-Quellcode:
Somit könnte ich mir auch immer das Exception werfen am Methodenanfang sparen. Gibt es da etwas?
procedure TMyClass.OperateOnObject(const someObject: TObject);
if not Assigned(someObject) then raise EArgumentNilException.Create(..); // Kram end; myInstance.OperateOnObject(nil); // <-- Soll nicht kompilieren Bislang fällt mir nur ein, den Methoden-Parameter zu einem var-Parameter zu machen aber das kann ja auch nicht Sinn der Sache sein. Die ![]() Zitat:
|
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Nein.
Und zum Selberprüfen gibt es taustende Möglichkeiten.
Delphi-Quellcode:
Assert(Assigned(someObject));
Assert(Assigned(someObject), 'Du hast voll Mist gebaut,'); if not Assigned(someObject) then raise EProgrammerNotFound.Create('Hirn bitte anschalten!'); // Diese Exception wird eh zu selten verwendet. |
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
De Compiler kann doch noch gar nicht erkennen, ob der übergebene Parameter zur Laufzeit nil ist. Oder geht es dir um nil als Konstante im Quelltext?
|
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Richtig, wenn dort felsenfest und absichtlich nil steht.
|
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Sowas hier?
Delphi-Quellcode:
method MyObject.DivideBy(aValue: Integer);
require aValue <> 0; begin MyValue := MyValue/aValue; end;
Delphi-Quellcode:
method MyObject.Add(aItem: ListItem);
begin InternalList.Add(aItem); ensure Count > 0; End; ![]() Pre- und Postconditions stehen auch auf meiner Delphi Sprachfeature Wunschliste ganz oben. Hoffentlich baut EMBT das irgendwann mit ein. Wird echt mal wieder Zeit für ein paar echte Delphi Features, anstatt nur Halbherzigkeiten drum herum zu bauen. |
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Einstweilen hilft Dir vielleicht auch eine Suche nach
Code:
Ich habe seinerzeit für C mir auch ein Suchmakro gemacht, das nach 'if' und einem einzelnen Gleichheitszeiten in derselben Zeile gesucht hat - Bsp.
\(.*nil.*\)
Code:
if (a = 0) { ... }
|
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Das Suchen im Quelltext müsste aber jeder selbst in seiner IDE machen, richtig?
Weil einen "echten" Präprozessor habe ich in Delphi irgendwie auch noch nicht gefunden... Den Wunsch nach einem "Design by Contract" habe ich persönlich jetzt weniger, mir ging es nur um eine ganz harmlose Typeneinschränkung zur Compilierzeit. Aber sowas wär natürlich auch nicht schlecht ;-) Vor allem wundere ich mich weiterhin über das [Ref]-Attribut. Ich habe kein Android oder iOS-Device auf dem ich ein "Nextgen-Compiler"-Produkt laufen lassen könnte. Oder kann man mit den x86-Simulatoren für iOS und Android da was drehen? |
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Aber diese Pre- und Postconditions werden doch auch erst zur Laufzeit geprüft?
Wobei ich den Sinn nicht verstehen kann, warum der Compiler den Wert eines Parameters prüfen können soll. Was ist denn er unterschied, zwischen einem nil als Konstante und einem nil, das zur Laufzeit als Variable übergeben wird? Und den Sinn hinter den Pre- und Postconditions, als neues Sprachfeature, seh ich irgendwie auch nicht.
Delphi-Quellcode:
Ist dann doch wohl das Selbe wie das? :gruebel:
require
aValue <> 0; begin
Delphi-Quellcode:
begin
Assert(aValue <> 0); |
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Der Unterschied ist, dass man Post- und Preconditions wenigstens zum Teil statisch auswerten könnte.
|
AW: Methoden-Parameter soll Referenz, aber kein nil sein können
Was meinst du denn mit statisch?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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