søndag den 30. oktober 2011

Class og Record Helpers

"Hjælpe-klasser" til både records og klasser var en af de store nyheder til Delphi 2007. Her flere år efter er det stadig ikke ret udbredt, ihvertfald ikke i den kode jeg er kommet forbi.

På min arbejdsplads sidder vi 8 Delphi-udviklere, og til trods for det, er der ikke andet end en enkelt eller to (ud over mig), der for alvor har taget class/record helpers i brug. Personligt forstår jeg det ikke, fordi det er sådan et fantastisk værktøj, men som med alt muligt andet skal man også være opmærksom på  "don't overdo a good thing", som man siger på engelsk.

Grund ideen bag class helpers er at tilføje nye metoder til en klasse uden at skulle nedarve fra den. Et meget godt eksempel er TStrings klassen, som danner ramme for en del ting: Lines på en TMemo, Items på en TlistBox og TComboBox samt en masse andet.

TStrings' Add-metode tillader kun en string som parameter, hvilket så betyder man selv skal konvertere til en string, hvis man derudover ønsker at tilføje noget andet, fx en integer eller en boolean.

Det kan man implementere vha. en class helper:

unit TStringsHelperU;

interface

uses
  Classes;

type
  TStringsHelper = class helper for TStrings
  public
    function Add(const V: Variant): Integer; overload;
    function Add(const Args: array of Variant): Integer; overload;
  end;

implementation

uses
  Variants;

function TStringsHelper.Add(const Args: array of Variant): Integer;
var
  Tmp: string;
  I: Integer;
  V: Variant;
begin
  Tmp := '';
  for V in Args do
    Tmp := Tmp + VarToStr(V);
  Result := Add(Tmp);
end;

function TStringsHelper.Add(const V: Variant): Integer;
begin
  Result := Add([V]);
end;

end.


Brugen af en class helper er næsten 100% transparent. Det eneste man som programmør skal gøre er, at tilføje den unit man har implementeret sin class helper i, og så ellers bare bruge den:

with Memo1.Lines do
  begin
    Add('Delphi på dansk');
    Add(2011);
    Add(true);
    Add([1, ' linje med blandet indhold: ', 1, #32, true]);
    Add(['π ~', PI]);
    Add(['Det ', 21, '. bogstav i det græske alfabet er φ' ]);
  end;



Resultatet ses her:


Jens Borrisholt

Ingen kommentarer:

Send en kommentar