DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

引き続き暮らす型(?)ライブラリについて


 o ゚   i  |   ◯'⌒ヽ、       ゚、 o    *       ○
・、    / ノ   (    )    、           、゚   o
゙、\   i  i゚  / `;;;;;_/  ◯    、           ゚
 \`ー'   i /  /  ´o        。   o    o   、  o
   `\  ◯  /)      、     o         ○   、゚
    i   、 /   o      o        o        o   、゚
o   |   /゚  ,i'⌒ヽ、  ゚    。   ◯      o   o  、
゙、\_ノ  i o (    )           、   、       、
 ` 、゙   ノ /`;;;;;_ノ       ∧,,∧         *    ◯  o
   \  i,//´   o    ミ,,゚Д゚彡 、             o
   i  ◯/    、      ,;゙   ミ      ○   、
  /   / 。          ~ミ,,,,,UUミ   O  o         、
;;⌒::.;;.⌒⌒/   /| ̄ ̄ ̄ ̄ ̄/   /::. :; ;⌒⌒:.:⌒:;⌒;;⌒:;⌒;;⌒
                     雪です。


んーーーーー、寒くないですか?
うちのボロアパートはモロ学生アパートなので
すきま風とか、すごいんですよ、もう。こりゃまた。

はっきり言って野良猫レベルの非快適生活なのですが
ホットカーペットがあって、ほんとよかった。
ああ寒い。
生活がちょっと恵まれてない気がします。


さて、クラス型のライブラリについての考察です。

TryStrToInt(S, Val): Boolean;
この関数の実装は当時としては最もなのですが

人間として考えるのが自然な形かどうか、っていうと微妙じゃないかしら?

俺は文字列を数値に変換したい場合、こう考えるわけです。


if (文字列が数値に変換できるかどうか調べる)=True then
 変換
else
 エラー表示とか

これは、CanStrToIntっていう関数があったとしたら
具体的に伝わりやすいかな?

if CanStrToInt(s)=True then
 Value := StrToInt(s)
else
 ShowMessage(s+':エラーです');

ところが、TryStrToIntときたら
数値変換できるかどうかを調べたついでに
同時に変換もしてくれるんですよ。


var Val: Integer

if TryStrToInt(s, Val)=True then
 Value := Val
else
 ShowMessage(s+':エラーです');

うん、コンピュータ的には完璧だと思います。
StrToIntの中では"数値かどうか"を調べつつ
数値を文字列に変換するのですから
CanStrToIntを実施してStrToIntを実施すると
同じ処理が2度呼ばれている事になります。

それは低速になる原因ですよね。
動作確認と値取得とは同時にやるのはプログラミングとしては当然。

ですが、どうもTryStrToIntでは人間様の思考が
自然ではなく、アレ?って感じてしまう点があるみたいなんですよ。
人間的な IF…THEN なロジックに従ってない感じがオレはします。

「もし、文字列が数値に変換できる形式なら、変換」
これが自然じゃないかなと。思いました。

ですので、これはクラス型なアプローチをして
素直な実装ができるかどうか考えてみましょう。

StringConvert これで変換するとして
with TStringConvert.Create do try
String := s;
if CanToInt then
 Value := ToInt
else
 ShowMessage(String+':エラーです');
finally Free; end;

ん?なんか逆に不自然だな。with無しのこっちの方がいいかい?

var sc: TStringConvert
sc := TStringConvert.Create; try
sc.String := s;
if sc.CanToInt then
 Value := sc.ToInt
else
 ShowMessage(String+':エラーです');
finally sc.Free; end;

これを実装するのは、結構簡単でしょ?

TStringConvert.CanToIntの内部でTryStrToIntを使い
値をキャッシュしておいて、キャッシュ値があるなら
TStringConvert.ToIntでそれを返す。キャッシュ値がないならその場で求める。
そういう二度手間じゃない実装をしてみてください。

速度も失われないし、記述も自然になるような気がします。

さて、どうだろうなあ、場合によっては使えるだろうけど
実際には微妙かなあ。

Createしなきゃいけないしね。
新型のrecord型なら、Createしなくても宣言と同時にインスタンス確保できるんでしたっけ?
確か、ここに説明があった気がする。
→CodeGear Delphi 7以降の言語およびコンパイラの新機能 メソッドを持つレコード

StringConvertクラスがToIntやToFloart、ToDate、ToTimeとか
さまざまなものを実装されたものが
すでに作られていたらともかく俺は自分で実装....するかなあ。微妙。

あ、そうそう最近のJavaや.NETでは
String型、ではなく、Stringクラスだったり
Integer型、ではなく、Integerクラスだったりして
こういう型変換はその型に付属したメソッドとしてつかえるのかな?

String.ToInt
とかっていうのは、書き方がエレガントでいいよなあ。

TStringConvertクラスや、TIntegerConvertクラス、
TRectConvertクラス、TPointConvertクラス

作ってみて使ってみたら、また新たな書き方に目覚めれるかもね。

※ん!?リンク先のクラスヘルパーとかって、、、、
>>クラスヘルパーは、継承を使用することなくクラスを拡張する手法です。
むむむむむ?、、、もしかしてかなりつつつ使いたいかも、、、
かなりマニア心をつかむようにに進化してません?
スポンサーサイト

| 未分類 | 01:42 | comments:3 | trackbacks:0 | TOP↑

COMMENT

こんにちは。可愛いデザインですね。残念な点が1つ。FireFox 2.0 で見ると、ずれてます。IE7 では大丈夫です。

| RAN | 2008/01/18 09:04 | URL | ≫ EDIT

ありがとうございます。

会社のスレイプニンルでみて
ビックラこいたです~

・・・微妙なドット数かしら。

FC2ブログの3ペインってAAと混ぜると
設定が難しいっす。

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

> FC2ブログの3ペインってAAと混ぜると

何のことを言っているかと申しますと

はじめてのFC2ブログカスタマイズ
http://blog.fc2.com/custom_manual/#m010

3ペインじゃなくて3カラムって呼ぶようです。

元々、FC2の3カラムテンプレートを
AAの都合上、2ペインのようにして動かしたいのですが
extra-column を小さくして
wrapper を大きくして
primary-column と secondary-column も大きくするけど
wrapper より小さく....

こんな工夫を…

ミ'A`彡マンドクセ

| ミ・Д・彡 | 2008/01/21 23:54 | URL | ≫ EDIT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/102-9a3a7e97

TRACKBACK

PREV | PAGE-SELECT | NEXT

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