DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

Delphi Win32で、requireとensure その3 ensureの old オブジェクト


           (\
            \\
              (\\
               \\\
             (\\\\
             (\\\\\
              (\\|| |
( ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\\ | |
  ̄ ̄( ̄ ̄//// ̄\  ∧,,∧    フォーーーーーーーーー
      ̄(//// ̄\\ミ ゚Д゚彡
        (/(/// ̄ミ      彡
          (/(/(/ミ      彡
            (// ミ ミ    ミ彡
              (/ミ ミミ     ミ彡
                ミ ミミ    ミミ 彡
               ミ ミ ミ  ミ 彡ミ 彡
               ミミ  ミ  ミミ 彡  ミ ミ
                 ミ ミ ミ 彡
                ミ 彡 ミ 彡
               ミ 彡 ミ 彡
              ミ 彡 ミ 彡
              ミ,,彡  ミ,,彡


というわけで、Win32版、require/ensureの最終実装形態です。

Delphi Prism ensureをみてください。


Delphi Prism 機能評価ガイド
http://edn.embarcadero.com/print/39118

require と同じだって?、よく見てくださいよ。旦那!




  method MyObject.Add(aItem: ListItem);
  require
   assigned(aItem) : 'List Item for MyObject cannot be nil';
  begin
   InternalList.Add(aItem);
  ensure
   Count = old Count +1 : 'MyObject: Count logic error';
  End;


oldオブジェク・・・クト
ありえないだろ・・・おま・・・まぢ・・・やめ・・・・
ってくらい、苦い感じを受けるコードです。

コーディングする人間には都合がよさすぎて、わかりやすすぎなんですけれども、

Win32で工夫して実装するこっちの身にもなれよ!コンパイラに手をいれれるわけじゃないんだよ!俺は!(誰が聞いてくれるのだろうか…)
悲しみに暮れてしまうような old オブジェクトです。

どうしよう。MyObjctのコピーでも取ろうかと思ったのですが、ディープコピーとか、シャローコピーとか、そんな.NET的な、よく分からないコピーになりそうだったので、オブジェクトコピーはやめました。あきらめました。



もはや、oldオブジェクトはやめようかと思いましたよ。

でもね。
それじゃつまんないでしょ。

ということで、oldオブジェクト的なコーディングができる仕組みの実装です。どぞ。
────────────────────

var
 uOldBuffer: TStringList;

function OldBuffer: TStringList;
begin
 if not Assigned(uOldBuffer) then
  uOldBuffer := TStringList.Create;
 Result := uOldBuffer;
end;

procedure SetOld(Title: String; Value: Variant);
begin
 OldBuffer.Values[Title] := Value;
end;

function GetOld(Title: String): Variant;
var
 Index: Integer;
begin
 Result := OldBuffer.Values[Title];
 Index := OldBuffer.IndexOfName(Title);
 if Index <> -1 then
  OldBuffer.Delete(Index);
end;

initialization
 uOldBuffer := nil;
finalization
 if Assigned(uOldBuffer) then
  uOldBuffer.Free;
end.

────────────────────
はいはい。わかってしまえばなんてことありません。
誰もがお世話になっている、StringListと、誰もがお世話になっているシングルトン実装です。

Delphi Prism みたいに、ensure 文の中でいきなりoldを取得するのは、過去にさかのぼるみたいに無理だけど、requireの前でも直後でもいいけど、

  SetOld('タイトル', 値);

で、変数を保持しておいて、ensureで、

  GetOld('タイトル')

で値を取得すれば、結構らくにコーディングができるじゃないですか!

ということで、最初に示したWin32 での require ensure 実装。


  procedure TForm1.Button1Click(Sender: TObject);
  begin
   SetOld('Button1.Caption', Button1.Caption);

   require([
    Self.Caption = 'Form1',
    Button1.Caption = 'Button1', 'Button1.Caption = Button1',
   true]);

   Button1.Caption := 'Button2';

   ensure([
    GetOld('Button1.Caption') = 'Button1',
    Button1.Caption = 'Button2', 'Button1.Caption not = Button1',
   true]);
  end;


こんなコーディングが実現してしまいまいました。

requireの前で、SetOldを行って文字列に対して値を保持しています。
ensureの内部で、GetOldを行って、文字列によって値を取得しています。


あふれ出る自分の才能が怖い感じです。

(どうでもいいけど、Delphi 2011 あたりでは Win32 拡張構文に普通にrequireが採用されちゃうなんて事がありそうですね。それはそれでいいですけれども。)

ということで完了です。

が、なぜか次回に続きます。


次回に続くっていっても、ブログなんだから、続いている限り永久に次回に続くよな・・・
スポンサーサイト

| 未分類 | 23:07 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

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