« お茶会 | メイン | howm-helper on xyzzy »

[Delphi] class helper

今、話題(2chのDelphiスレだけで)の class helper 使ってみました。

ruby だと

class String
  def increment
    result = "";
    self.each_byte do |c|
      result << (c + 1).chr
    end
    result
  end
end

p "HAL".increment

という風に書くのを、Delphi で書くと、

program test;

{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
  TMyClassHelper = class helper for TStringStream
    function Increment: string;
  end;

{ TMyClassHelper }
function TMyClassHelper.Increment: string;
var i: Integer;
begin
  Result := '';
  for i := 1 to Length(DataString) do
    Result := Result + Char(Ord(DataString[i]) + 1);
end;

procedure Main;
var s: TStringStream;
begin
  s := TStringStream.Create('HAL');
  try
    Writeln(s.Increment);
  finally
    s.Free
  end;
end;

begin
  Main;
  {$WARN SYMBOL_PLATFORM OFF} if DebugHook <> 0 then Readln; {$WARN SYMBOL_PLATFORM ON}
end.

となる。
(stringがクラスじゃないので、TStringStreamで代用……)

これって、Mixinじゃない?
下手すると変なコードを量産しそうだけど、
使いようによっては、かなり使えるんじゃないんだろか?

あと、よく考えたら、アスペクト指向的にも使えね?

program test;

{$APPTYPE CONSOLE}
uses SysUtils, Classes;
type
  TStringList = class helper for TStringList
    function Add(const S: string): Integer;
  end;

{ TMyClassHelper }
function TMyClassHelper.Add(const S: string): Integer;
begin
  Writeln('start - TStringList.Add(' + S + ')');
  Result := inherited Add(S);
  Writeln('end - TStringList.Add');
end;

procedure Main;
var s: TStringList;
begin
  s := TStringList.Create;
  try
    s.Add('Hoge');
    s.Add('Moge');
    s.Add('Mage');
    Writeln('Count = ', s.Count);
  finally
    s.Free
  end;
end;

begin
  Main;
  {$WARN SYMBOL_PLATFORM OFF} if DebugHook <> 0 then Readln; {$WARN SYMBOL_PLATFORM ON}
end.

出力結果は以下。

start - TStringList.Add(Hoge)
end - TStringList.Add
start - TStringList.Add(Moge)
end - TStringList.Add
start - TStringList.Add(Mage)
end - TStringList.Add
Count = 3

ちょwww!?これはっwww
なんだか、脳汁が出てきましたよwww!?

とりあえず、標準出力にデバッグ文出してるだけだけど、
関数の実行時間を測ったり、用途はいろいろありますなー。

ヘルプに書いてある、
『ただし,ソースコード内の特定の場所では,最大 1 つのクラスヘルパーだけが適用されます。』
というのがなんだか、(´・ω・`)ショボーン 。
複数のクラスヘルパー適用できないのかい!
って、実は使えなさげな雰囲気もかもしだしておりますが、
class helperは、面白そうな機能であることは確かです。

カテゴリ: [ Delphi ]

トラックバック

この一覧は、次のエントリーを参照しています: [Delphi] class helper:

» Delphi/class helper 送信元 TOBYSOFT wiki (PukiWiki/TrackBack 0.3)
▲ はじめに はじめに † Delphi8あたりから使えるようになった class helper 使ってみようジャマイカ。... [詳しくはこちら]

コメントを投稿

Twitter(今何してる?)

プロフィール

あわせて読みたい

あわせて読みたいブログパーツ

人気エントリー

About

2006年03月26日 12:02に投稿されたエントリーのページです。

ひとつ前の投稿は「[雑記] お茶会」です。

次の投稿は「[メモ取り環境] howm-helper on xyzzy」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。