AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Methoden-Parameter soll Referenz, aber kein nil sein können

Methoden-Parameter soll Referenz, aber kein nil sein können

Ein Thema von Der schöne Günther · begonnen am 28. Nov 2013 · letzter Beitrag vom 29. Nov 2013
Antwort Antwort
Seite 1 von 3  1 23   
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 14:22
Delphi-Version: XE5
Hallo.

Kann ich den "Gültigkeitsbereich" eines Parameters einschränken, dass ich zwar gerne Objekte annehme, aber kein nil ?

Beispiel:

Delphi-Quellcode:
procedure TMyClass.OperateOnObject(const someObject: TObject);
   if not Assigned(someObject) then raise EArgumentNilException.Create(..);
   
   // Kram
   
end;

myInstance.OperateOnObject(nil); // <-- Soll nicht kompilieren
Somit könnte ich mir auch immer das Exception werfen am Methodenanfang sparen. Gibt es da etwas?

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 Delphi-Hilfe spricht von einem sehr gut aussehenden [Ref]-Attribut für Parameter. Ich sehe allerdings bei mir keinen Unterschied: Das scheint mal wieder nur im iOS/Android-Compiler zu stecken...


Zitat:
Da S1 und S2 im Rumpf von CompareStr nicht geändert werden, können sie als Konstantenparameter deklariert werden.

Konstantenparameter können je nach verwendetem Compiler an die Funktion per Wert oder per Referenz übergeben werden. Um den Compiler zu veranlassen, einen Konstantenparameter per Referenz zu übergeben, können Sie den Dekorator [Ref] mit dem Schlüsselwort const verwenden.

Das folgende Beispiel zeigt, wie Sie den Dekorator [Ref] entweder vor oder nach dem Schlüsselwort const angeben können:

 function FunctionName(const [Ref] parameter1: Class1Name; [Ref] const parameter2: Class2Name);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#2

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 14:33
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Nov 2013 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#3

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 16:55
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 17:00
Richtig, wenn dort felsenfest und absichtlich nil steht.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 17:12
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;
Require_(keyword)


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.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#6

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 17:46
Einstweilen hilft Dir vielleicht auch eine Suche nach
Code:
\(.*nil.*\)
Ich habe seinerzeit für C mir auch ein Suchmakro gemacht, das nach 'if' und einem einzelnen Gleichheitszeiten in derselben Zeile gesucht hat - Bsp.
Code:
if (a = 0) { ... }
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.093 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 17:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#8

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 18:24
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:
require
  aValue <> 0;
begin
Ist dann doch wohl das Selbe wie das?
Delphi-Quellcode:
begin
  Assert(aValue <> 0);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 18:45
Der Unterschied ist, dass man Post- und Preconditions wenigstens zum Teil statisch auswerten könnte.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.016 Beiträge
 
Delphi 12 Athens
 
#10

AW: Methoden-Parameter soll Referenz, aber kein nil sein können

  Alt 28. Nov 2013, 18:48
Was meinst du denn mit statisch?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz