AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Casts - is, as, Assert

Ein Thema von uligerhardt · begonnen am 4. Feb 2010 · letzter Beitrag vom 4. Feb 2010
Antwort Antwort
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#1

Casts - is, as, Assert

  Alt 4. Feb 2010, 09:16
Nachdem das Thema grad mal wieder aufgetaucht ist:

Ein Cast mit "as" enthält ja eine Laufzeittypprüfung und löst bei Fehlschlag eine Exception aus. Ich hätte jetzt gern, dass die Typprüfung nur dann zuschlägt, wenn {$ASSERTIONS ON} sind. Momentan schreibe ich immer
Delphi-Quellcode:
Assert(Sender is TButton);
TButton(Sender).Caption := 'Blubb';
, aber das ist auf Dauer ganz schön umständlich für eine Funktionalität, die ich oft benutze. Kennt jemand eine schönere Lösung? Quasi (Sender assert_as TButton).Caption := 'Blubb'; ?
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:22
Toll, schalltet man die Assertions ab, gibt es keine Prüfung mehr und es kommt womöglich zu undurchsichtigen Folgefehlern.

Fazit:
- wenn du nicht sicherstellen kannst, daß dort ein passendes Objekt vorliegt,
dann nutze (Sender as TButton).Caption
- wenn du die Prüfung nur wärend der Programmierphase möchtest, dann stell halt dein Assert(Sender is TButton) davor
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.170 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:25
Ich mach es immer wie Astat vorgeschlagen:

Delphi-Quellcode:
  if (Sender is TButton) then
    showmessage((Sender as TButton).Name);
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:26
Dann könnte man auch einen harten Cast machen. Ich bevorzuge aber auch diese "doppelte" Methode
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:30
Delphi-Quellcode:
if (Sender is TButton) then
    showmessage((Sender as TButton).Name);
ist vollkommen unnötig, denn wenn IS meinte es wäre OK, dann ist AS an dieser Stelle unnüzt, da es eh nie anschlagen kann.

Delphi-Quellcode:
if (Sender is TButton) then
    showmessage(TButton(Sender).Name);
Dieses reicht also aus und ist sogar kürzer und, für mich zumindestens, "übersichtlicher".

PS: statt des Castes vor Ort nutze ich hier manchmal sogar "externe" Casts, in Form einer ABSOLUTE-Deklaration.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:32
Zitat von himitsu:
Toll, schalltet man die Assertions ab, gibt es keine Prüfung mehr und es kommt womöglich zu undurchsichtigen Folgefehlern.
Wenn du so argumentierst, darfst du aber gar keine Assertions verwenden oder musst deine Anwendung mit eingeschalteten Assertions ausliefern.

Zitat von himitsu:
Fazit:
- wenn du nicht sicherstellen kannst, daß dort ein passendes Objekt vorliegt,
dann nutze (Sender as TButton).Caption
- wenn du die Prüfung nur wärend der Programmierphase möchtest, dann stell halt dein Assert(Sender is TButton) davor
Genau: Version 2 möchte ich, aber ohne mich beim Programmieren wiederholen zu müssen. Wenn die Prüfung Aufwand macht, besteht ja bekanntlich die Neigung, sie ggfs. "schnell mal" wegzulassen.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 09:51
Zitat von uligerhardt:
Wenn du so argumentierst, darfst du aber gar keine Assertions verwenden oder musst deine Anwendung mit eingeschalteten Assertions ausliefern..
Darum meinte ich ja, daß dieses nicht unbedingt ein optimaler Weg ist, um eventuelle Fehler abzuprüfen.

hmmmm, sowas geht leider nicht, da man hierfür ja den Typ vom Check-Parameter als Result bräuchte.
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
  Begin
    Assert(O is Check);
    Result := O;
  End;
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
  Begin
    {$IFOPT C+}
      If Assigned(O) Then
        Raise EAssertionFailed.CreateFmt('Object $%.8x "%s" is not %s',
          [Integer(O), O.ClassName, Check.ClassName])
      Else Raise EAssertionFailed.CreateFmt('Object (nil) is not %s', [Check.ClassName]);
    {$ENDIF}
    Result := O;
  End;

Aber wieso Aufwand?
Wenn du einmal ein Assert(Sender is TButton) an den Anfang der Prozedur stellt, dann brauchst du danach doch nichts mehr machen?

Delphi-Quellcode:
Procedure X(Obj: TObject);
  Var O: TButton absolute Obj:

  Begin
    Assert(Obj is TButton);
    ...
    O.Caption := 'ich bin ein Button';
    ...
  End;
Dieses prüft nur wärend der Programmierpfase und mit aktiven Assertions.

Wobei ich es meißt eher so mach:
Delphi-Quellcode:
Procedure X(Obj: TObject);
  Var O: TButton absolute Obj:

  Begin
    If Obj is TButton Then Begin
      ...
      O.Caption := 'ich bin ein Button';
      ...
    End Else {mach was, wenn es kein Button ist};
  End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Casts - is, as, Assert

  Alt 4. Feb 2010, 10:08
Mir ist das immer OK erschienen: Während der Entwicklungs- und Testphase prüft mein Ereignishandler, dass ihm auch wirklich nur Buttons reingereicht werden. Danach bin ich hinreichend davon überzeugt, dass meine Programmierung passt, und kan auf die Typprüfung verzichten.

Zitat von himitsu:
hmmmm, sowas geht leider nicht, da man hierfür ja den Typ vom Check-Parameter als Result bräuchte.
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
  Begin
    Assert(O is Check);
    Result := O;
  End;
Delphi-Quellcode:
Function OCheck(O: TObject; Check: TClass): {TObject}; Inline;
  Begin
    {$IFOPT C+}
      If Assigned(O) Then
        Raise EAssertionFailed.CreateFmt('Object $%.8x "%s" is not %s',
          [Integer(O), O.ClassName, Check.ClassName])
      Else Raise EAssertionFailed.CreateFmt('Object (nil) is not %s', [Check.ClassName]);
    {$ENDIF}
    Result := O;
  End;
Mit so Ähnlichem hab ich auch schon rumgespielt. Aber ich fürchte, ohne Compilerunterstützung ist da nix zu machen. :-/

Zitat von himitsu:
Aber wieso Aufwand?
Wenn du einmal ein Assert(Sender is TButton) an den Anfang der Prozedur stellt, dann brauchst du danach doch nichts mehr machen?
Naja, das sind halt trotzdem 2, im echten Leben manchmal auch 3 oder 4 Zeilen, wo meinem Empfinden nach eine reichen müsste. Und das Ganze mit reichlich Wiederholungen (== Fehlerquellen).
Uli Gerhardt
  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 02:32 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