warum das globale
var QueryCache: TQueryCache; ?
die Konstruktoren kannst du dir sparen
- dynamische Array und String sind per Standard eh leer
leere Destruktoren/Funktionen sind ebenfalls sinnlos
getCached liefert einen undefinierten Wert, wenn nichts im Cache ist
if Length(entries) > 0 then in isCached bringt auch nichts, denn dieses ist praktisch in der Forschleife schon vorhanden.
Try-Except ... eine dort auftretende
Exception sollte man nicht einfach unter den Tisch kehren, denn dieses würde auf eine defekte Datenstruktur hinweisen und sowas dürfte eh nie auftreten
Vergleiche mit
=true macht man nicht
(es sei denn man muß GENAU auf True(1) vergleichen)
Delphi-Quellcode:
unit QCache;
interface
uses
..., QCacheEntry;
type
TQueryCache =
class(TObject)
private
entries:
array of TQueryCacheEntry;
public
function isCached(
name:
string;
var pos:integer): boolean;
function getCached(pos: integer): TQueryCacheEntry;
procedure addEntryToCache(Charinfo: TQueryCacheEntry);
function getNumEntries: integer;
end;
implementation
function TQueryCache.getNumEntries: integer;
begin
Result := Length(entries);
end;
function TQueryCache.getCached(pos: integer): TQueryCacheEntry;
begin
//if Assigned(entries[pos]) then
// Result := entries[pos]
//else
// Result := nil;
// gekürzt kommt das bei raus und nebenbei wird nun nur noch einmal gesucht :)
Result := entries[pos];
end;
function TQueryCache.isCached(
name:
string;
var pos:integer):boolean;
var
i: integer;
begin
Result := false;
for i := 0
to Length(entries)-1
do
if entries[i].option1 =
name then
begin
Result := true;
pos := i;
break;
// wenn gefunden, dann braucht man nicht weitersuchen
end;
end;
procedure TQueryCache.addEntryToCache(Charinfo: TQueryCacheEntry);
begin
SetLength(entries,Length(entries)+1);
entries[High(entries)] := Charinfo;
end;
end.
Delphi-Quellcode:
unit QCacheEntry;
interface
type
TQueryCacheEntry =
class(TObject)
option1:
string;
option2:
string;
option3:
string;
option4:
string;
option5:
string;
option6:
string;
end;
implementation
end.
Delphi-Quellcode:
procedure TForm1.testName(name:string);
var
...
qpos: integer;
Charinfo: TQueryCacheEntry;
begin
qpos := 0;
if Cache.isCached(name, qpos) then
begin
ListBox1.Items.Add('Found Object in cache: ' + name + ' in Position: ' + IntToStr(qpos) + ' and total cache size: ' + IntToStr(Cache.getNumEntries));
Charinfo := Cache.getCached(qpos);
end else
...