Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.062 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Code-Kata: Cache-Klasse. Wer produziert den besten Code

  Alt 30. Jul 2015, 09:00
Auch wenn ich weiß, dass nicht alle Anforderungen erfüllt sind, will ich doch einen ersten Versuch posten.
Denn in Sachen Lesbarkeit ist durch die Verwendung von System.Contnrs.TObjectList kaum was zu verbessern.
Zwar wäre ein Nachbau eines Dictionarys vielleicht zielführender, aber die anderen dürfen auch gerne ran.

Delphi-Quellcode:
unit Code.Kata.Cache;

interface

uses
  System.SysUtils,
  System.Contnrs,
  System.Classes,
  System.Math;

type
  TCache = class
  strict private
    FObjectList : System.Contnrs.TObjectList;
  private
    function GetCurrentNumberOfElements : Integer;
    function GetSize : Integer;
  public
    constructor Create(MaxSize : Integer);
    function Contains(ID : Integer) : Boolean;
    function Get(ID : Integer) : TObject;
    procedure Put(ID : Integer; Item : TObject);
    procedure Remove(ID : Integer);
    property MaxSize : Integer read GetSize;
    property CurrentNumberOfElements : Integer read GetCurrentNumberOfElements;
  end;

implementation

{ TCache }

function TCache.Contains(ID : Integer) : Boolean;
begin
  Result := Get(ID) <> nil;
end;

constructor TCache.Create(MaxSize : Integer);
begin
  FObjectList := System.Contnrs.TObjectList.Create(True);
  FObjectList.Capacity := MaxSize;
end;

function TCache.Get(ID : Integer) : TObject;
begin
  Result := nil;
  if InRange(ID, 0, FObjectList.Count - 1) then
  begin
    Result := FObjectList.Items[ID];
  end;
end;

function TCache.GetCurrentNumberOfElements : Integer;
begin
  Result := FObjectList.Count;
end;

function TCache.GetSize : Integer;
begin
  Result := FObjectList.Capacity;
end;

procedure TCache.Put(ID : Integer; Item : TObject);
begin
  if ID <> -1 then
  begin
    FObjectList.Add(Item)
  end
  else
  begin
    FObjectList.Insert(ID, Item);
  end;
end;

procedure TCache.Remove(ID : Integer);
begin
  FObjectList.Delete(ID);
end;

end.
  Mit Zitat antworten Zitat