Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Static? (https://www.delphipraxis.net/136197-static.html)

Fridolin Walther 25. Jun 2009 11:28


Static?
 
Hallo,

gibt es im Delphi Sprachumfang ein Äquivalent zu static in C? Derzeit behelfe ich mir so:

Delphi-Quellcode:
{$WRITEABLECONST ON}
function doSomeTests(stringToTest : WideString) : Boolean;
const
  lastStringTested : WideString = '';
begin
  Result := TRUE;
  if WideLowerCase(stringToTest) = WideLowerCase(lastStringTested) then
    exit;
  {Was auch immer ich dort teste ...}
  lastStringTested := stringToTest;
end;
{$WRITEABLECONST OFF}
Das find ich in gewisser Weise unschön. Allerdings möchte ich den primitiven "Cache" der hier gebaut wird, ungern ausserhalb der Funktion realisieren. Auch eine globale Variable möchte ich vermeiden. In C könnte ich lastStringTested einfach als static definieren und der Wert dieser Variable bleibt über weitere Aufrufe bestehen. In Delphi scheint diese Möglichkeit nicht zu existieren, oder?

Um Hinweise auf die Suche zu vermeiden:
Ja, das Thema wurde bereits diskutiert, vor einigen Jahren. Nur entwickelt sich Delphi als Sprache ja durchaus weiter. Könnte ja sein, daß static mittlerweile zum Sprachumfang gehört oder aber es mittlerweile eine Möglichkeit gibt, es eleganter zu implementieren, als ich es tat :).

mjustin 25. Jun 2009 11:51

Re: Static?
 
Zitat:

Zitat von Fridolin Walther
Auch eine globale Variable möchte ich vermeiden.

Klar, das ist die Dunkle Seite der Macht :)

Man könnte eine Klasse verwenden, die den Testcode enthält, und auf (strict) private Instanz- oder Klassenvariablen zugreifen kann.

Aufruf wäre dann

Delphi-Quellcode:
  if TStringTest.DoSomeTests(SomeWideString) then ...
static class methods werden unter anderem hier beschrieben:

New Delphi language features since Delphi 7
http://edn.embarcadero.com/article/34324


Die Deklaration sollte dann etwa so aussehen:

Delphi-Quellcode:
 
TStringTest = class
  strict private
     class var
     LastStringTested: WideString;
  public
    function DoSomeTests(AString: WideString);
end;
Vorteile: auf WRITEABLECONST kann man verzichten, durch Verwendung von OOP ist die Testfunktionalität sehr leicht und konsistent erweiterbar, Testklassen können auch einfach ausgetauscht werden (z.B. bei Verwendung des Visitor-Patterns), Vererbung kann benutzt werden.

Fridolin Walther 25. Jun 2009 12:04

Re: Static?
 
Im Endeffekt würde ich eine globale Variable gegen ein globales, statisches Objekt tauschen. Ich seh da nicht den Vorteil ;).

mjustin 25. Jun 2009 12:07

Re: Static?
 
Zitat:

Zitat von Fridolin Walther
Im Endeffekt würde ich eine globale Variable gegen ein Globales statisches Objekt tauschen. Ich seh da nicht den Vorteil ;).

Eine "Globale Variable" ist IMHO etwas anderes, sie muss dazu ja von überall zuweisbar sein. Und du kannst die Klasse ja auch in den implementation Teil verlagern und für die DoSomeTests Funktion eine Weiterleitung ins interface, dann sieht man noch weniger von der OOP - Implementierung.

Uwe Raabe 25. Jun 2009 13:48

Re: Static?
 
Wenn man eine class function draus macht, spart man sich das Instanzieren einer Klasse:

Delphi-Quellcode:
TStringTest = class
  strict private
     class var
     LastStringTested: WideString;
  public
    class function DoSomeTests(AString: WideString): Boolean;
end;
Der Aufruf erfordert dann allerdings den Klassentyp:

Delphi-Quellcode:
TStringTest.DoSomeTests

mjustin 25. Jun 2009 13:57

Re: Static?
 
Zitat:

Zitat von Uwe Raabe
Wenn man eine class function draus macht, spart man sich das Instanzieren einer Klasse

Ups, das class hatte ich auch schreiben wollen, in meinem esten Posting war das Beispiel daher ja auch:

Delphi-Quellcode:
if TStringTest.DoSomeTests(SomeWideString)
Warum hat der Editor hier eigentlich keinen Syntaxchecker ? ;)

DeddyH 25. Jun 2009 14:16

Re: Static?
 
Link aus einem anderen Thread entnommen: http://edn.embarcadero.com/article/34324 (da steht auch das Wörtchen static).


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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