CnPack Forum


 
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2010-12-17 23:26  Profile | Blog | P.M.  | QQ
一个泛型的 memoize 实现

这个方法的原文在http://blogs.teamb.com/craigstuntz/2008/10/01/37839/  作者似乎讲的很罗嗦,不过如果看完后觉得它没有意义,最好看下原文或搜索下memoize,另外在这个实现里,作者的方法有点巧妙,不为了memoize也可以下载完整的代码看下。

我把它的示例代码简化了一下贴出来,再加上注释,方便大家看。



class function TfrmMemoize.SlowIncrement(ANum: integer): integer;  //先是定义了一个需要缓存结果的函数
begin
  Sleep(1000);
//假设这个函数需要花费大量的时间,比如从网络上获取数据之类的,这里用等待一秒来模拟。
  Result := ANum + 1;
end;


procedure TfrmMemoize.FormCreate(Sender: TObject);
begin
  FMemoizedFunc := TMemoize.Memoize<integer,integer>(SlowIncrement);  //这句执行后,FMemoizedFunc就好象是指代了SlowIncrement函数,对FMemoizedFunc的调用,也就是对SlowIncrement的调用,但是它缓存了函数的结果。
end;

//第一次点button1时,会等待一秒才出结果,而第二次点,则立即出现了
procedure TfrmMemoize.Button1Click(Sender: TObject);
var
  Input: integer;
begin
  if TryStrToInt(edtInput.Text, Input) then
     edtOutput.Text := IntToStr(FMemoizedFunc(Input));  //如果showIncrement函数曾经用input参数计算过,就直接取回它的值,否则就进行实际的函数调用。
end;


用工具网站给代码加的高亮,在这用了几次复制粘贴格式有点乱了

完整代码在附件里。

这个方法的一个问题是,被memoize的函数只能有一个泛型参数,如果想幽雅的实现多个似乎是个挑战,也许以后有时间我会完善它


Attachment: memoize_implementation_for_delphi.rar (2010-12-17 23:26, 3.01 K)
Download count 82
Top
friendlinzh
新警察
Rank: 1



UID 67162
Digest Posts 0
Credits 20
Posts 10
点点分 20
Reading Access 10
Registered 2011-8-18
Status Offline
Post at 2011-8-18 10:25  Profile | Blog | P.M. 
Sleep(1000)




Top
 




All times are GMT++8, the time now is 2024-11-22 07:03

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.011574 second(s), 10 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP