DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

StringListObjectテストコード


   ∧,,∧ がむばれニッポン!!
   ミ,,゚Д゚彡
  ⊂ミ ⊂''ミ 从 ボカッ!!
 ~ミ,,,,,,,つ< > ─=≡二三三 (((⌒)
    し'     W
"""""""""""""""""""""""""""""""""""""""""""""""

ワンテンポもツーテンポもずれましたが、サッカーはいかがでしたか?
日本は勝ったのでしょうか、負けたのでしょうか?
私は日本の試合、1秒も見ていません。興味がないのですが、何か?


さて、前回のStringListObjectはいかがでした?



Index&名前指定シングルトンの、新概念に楽しんでいただけましたです?
とりあえずネタ投入ということで喜んでいただけたかな?
※ちょっと冷静さを失いましたが、忘れてね。(w

消してしまったコメントでも書きましたが、実はこのコードは、なんら、TStringListに依存していません。
単に実装上、TStringListを使っているだけ。

ジェネリクス実装をしてしまえば、全てのクラスでこの技が使えます。
俺は未だにD2007メインなので、ジェネリックス動かないので。まあ、どなたか、興味があれば実装しちゃってくださいな。


すべての自作クラスが、もはや変数宣言の煩わしさと、メモリリークから解放される、、かもしれません。

メモリリークについてですが、
try finally end で囲んでいません。
でも、基本的に安全です。

この仕組みで作成されるクラスが全て管理テーブルにて管理されているから。

try finally で、囲ってもいいですが、
囲わなくて、途中で例外発生して終了コードまで到達しなくても安全。
トレース実行して研究してみるとよいかと思います。



とりあえず、テストコードをさらしておきます。
ユニットが二つあって、CHがついているのは、ClassHelper版。
それぞれコメントアウトを切り替えて同じコードでテストができます。
uses XPtestはいつものユニット。

────────────────────
unit testStringListObjectUnit;

interface

uses XPtest;

procedure testStringListObject;
procedure testStrListObj;

implementation

//uses StringListObjectUnit; type TStringListX = TStringListObject;
uses Classes, StringListObjectCHUnit; type TStringListX = TStringList;


procedure testStringListObject;
begin
 TStringListX.ArrayClear;

 Check(0, TStringListX.ArrayLength);
 StringListObject(2).Add('123');
 StringListObject(2).Add('456');
 StringListObject(2).Add('789');
 Check(1, TStringListX.ArrayLength);
// Check(False, uStringListObject[0] = nil);

 Check('123', StringListObject(2)[0]);

 StringListObject(4).Text := StringListObject(2).Text;
 Check('789', StringListObject(4)[2]);
 Check(2, TStringListX.ArrayLength);

 {↓文字でアクセスした場合は配列の最後に追加される}
 StringListObject('test').Add('ABC');
 Check(3, TStringListX.ArrayLength);
 Check('ABC', StringListObject('test')[0]);

 {↓大小文字は区別せずにアクセスされる}
 Check(True, StringListObject('test') = StringListObject('TeSt'));

 {↓自動的にリサイズされサイズ=ArrayLengthが縮む}
 Check(3, TStringListX.ArrayLength);
 StringListObject('TEST').Free;
 Check(2, TStringListX.ArrayLength);

 {↓文字列で指定すると新たに配列が増える}
 StringListObject('abc'); //2 4 abc
 StringListObject('def'); //2 4 abc def
 StringListObject('ghi'); //2 4 abc def ghi
 Check(5, TStringListX.ArrayLength);

 {↓途中を破棄しても配列要素数は変わらない}
 StringListObject('def').Free; //2 4 abc ghi
 Check(5, TStringListX.ArrayLength);

 {↓違う文字だと配列は増える}
 StringListObject('jkl'); //2 4 abc ghi jkl
 Check(6, TStringListX.ArrayLength);

 StringListObject('jkl').Free; //2 4 abc ghi
 Check(5, TStringListX.ArrayLength);
 {↓自動的にリサイズされサイズ=ArrayLengthが縮む}
 StringListObject('ghi').Free; //2 4 abc
 Check(3, TStringListX.ArrayLength);


 StringListObject('abc').Free; //2 4
 Check(2, TStringListX.ArrayLength);

 //一度削除したタイトルはもう一度使うと新しい番号で使われる
 StringListObject('ghi'); //2 4 ghi
 Check(3, TStringListX.ArrayLength);

 StringListObject('あ');
 StringListObject('い').Text := 'A'#13#10'B'#13#10'C';
 StringListObject('う');
 StringListObject('え');
 StringListObject('お'); //2 4 ghi あ い う え お
 Check(8, TStringListX.ArrayLength);
 Check('B', StringListObject('い').Strings[1]);
end;
────────────────────
例えば、この仕組みがどれだけ強力かというと、タブ区切りやカンマ区切りテキストを
Gridにつっこむときの実装とか、
Gridにつっこまずに、内部的に所有したい時の実装など考えるとそりゃもう楽々…

…って、まあいいか。
くどくど説明しなくても、にちゃんねるの、実装も出来ないし利用方法も分からない嫉妬心に溢れるアフォ以外には、わざわざ説明しなくてもわかると思うし。

利用したい人はどーぞです。

概念をうまく利用してもいいかもね。
スポンサーサイト

| 未分類 | 00:35 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。