DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

with TClass.Create do


      ,|丶、,,,,ノヽ
      ミ o  o ミ
      ミ " i ̄i 彡
      ミ゛  ノ―| ミ
      ミ  ミ,,゚Д゚ミ゛
     ミ (ノ   ミ)
    _,,彳,;ヾ. 丿丿
        ∪∪  寒すぎだぞゴルァ

寒いとは言っても東京は雪も降らないくらいの温暖化ですが、

ロシアん帽が欲しいです。ロシア帽で東京オサレさんです。


さて、気がついたら以外に使われてないみたいなのですが
漏れはよく使っているテクニックを紹介します。

それは、こういうものです。


With TMyclass.Create; do begin try
 MyMethod(…);
finally Free; end;

文字列がIPアドレスの形式になっているかどうか
ここのisSafeIPではStringListに対してこれをつかっています。
with TStringList.Create do try
 Delimiter := '.';
 DelimitedText := IP;
 Count
 Strings[i]
finally Free; end;
これらは全てWithで生成されているTStringList関連の動作です。

このテクを使うと、わざわざ変数を宣言しなくていいんですよ。

こっちの資料もみてもらいましょうか。

以前にあった、デベロッパキャンプでのプレゼン資料(PDF)
こちらでは、関数型ライブラリとしての実装から
クラス型のライブラリ、クラスメソッドでのライブラリ実装に変えていこう
という発展系が紹介されています。

紹介されているように単なる関数型の実装の場合は
クラスメソッドにしてしまえばいいわけで
これだと行数も増えないので許容しやすく使えるでしょう。

場合によっては、クラスメソッドだけではなく
各関数に対して共通フィールドを使いたい場合もあるでしょう。

そう。上記のisSafeIPで使っているTStringListの場合は値を保持して
分割された要素を取り出しているのだから
フィールド部分が絶対必要なのですよ。

だから、クラス型ライブラリを構築しておいて
with Create do try を使うと
実行する場合には、変数に代入せずに使用できる。

「わざわざ変数名に頭を悩まさなくてよい。」
というメリットはかなりよいので結構多用してよいのです。

with の中にはCreateだけではなく
リスト(TList)に入っているItemを表に出して使うとき、

with TMyItem(Flist.Item[i]) do begin

このようにするのもよいです。
コードを綺麗にかけるでしょう。
使ってみてください。
スポンサーサイト

| 未分類 | 23:49 | comments:5 | trackbacks:0 | TOP↑

COMMENT

変数がないから、デバッグの時はめんどいよ

| とおりすがり | 2008/01/17 00:10 | URL | ≫ EDIT

>with Create do try を使うと
生成オブジェクトをBlock内で関数に渡せないんだよねー

| とおりすがり2 | 2008/01/17 07:44 | URL | ≫ EDIT

> 変数がないから、デバッグの時はめんどいよ

リョウカイ。
ミ'◇'彡ゞ
デバッグは監視式でやるのではなく
XPファーストテストでバグ防御できるコーディングスタイルを採用してるから。
変数使わなくてもオレは平気なのかな。

開発時は変数をつかって
最終的にリファクタリングでwith TMyClass.Create do
に変更していくってことも出来ますね。


> >with Create do try を使うと
> 生成オブジェクトをBlock内で関数に渡せないんだよねー

これは、工夫してなんとかならないかな?Blogネタを考え中。

type TStringListWith = class(TStringList)
 public function Instance: TStringListWith;
end;

function Instance: TStringListWith;
begin
 Result := Self;
end;

with TStringListWith.Create; do begin
 MyFunc(Instance);
end;

こういう事。できるかな。試してないけど。
Interfaceを利用してできまいか?
結局、Interfaceを導入するために継承しないとあかんのかな?

| ミ・д・彡 | 2008/01/17 14:27 | URL | ≫ EDIT

「ファーストテスト」だと最初のテストだよ
テストはバグを見つけるものだから、依然としてデバッグは必要だけど思うよ

ふつーはコンストラクタを再定義して、そこで Self を保存するかとおもうけど何でインターフェースとか考えるんだろう

| とおりすがり3 | 2008/01/17 22:45 | URL | ≫ EDIT

ごめんごめん。テストファーストだね。

> 何でインターフェースとか考えるんだろう
いやあ、どのクラスに対しても
function Instance:
begin
 Result := Self;
end;
を行いたかったりするからかなあ。

| ミ・д・彡 | 2008/01/18 01:36 | URL | ≫ EDIT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/101-78b90cb9

TRACKBACK

PREV | PAGE-SELECT | NEXT

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