函数库设计

使用Delphi多年了,感觉它的运行库函数设计有很多不合理的地方,在字符串相关函数上体现得尤为明显。调用这些函数时,如果传递的参数类型不是严格匹配,会发生一些隐式类型转换,有时这些转换需要付出很高的代价,这种代价在某些追求效率的场合是不可接受的。但是如果不调用这些库函数,就意味着你必须自己写。比如调用StrToInt时传递的参数是PChar,首先会调用LStrLen来计算参数字符串的长度,然后从堆上面动态分配相应尺寸的内存来建立一个string。如何设计函数库才能改善这种情况呢?下面以StrToInt为例进行分析。

首先对函数实现的功能进行高度抽象,建立最基本的函数原型并实现它。StrToInt的用途是把一段数字串转换为整数。所以它的基本原型应该是这样的:

function StrToInt1(s: PAnsiChar; len: Integer): Integer;

实现了基本原型后,再设计一些包装函数,来方便函数库的使用者调用。包装函数的实现很简单,直接调用基本函数就行了。比如:

function StrToInt2(const s: AnsiString): Integer;

begin

  Result := StrToInt1(PAnsiChar(s), Length(s));

end;

 

function StrToInt3(s: PAnsiChar): Integer;

begin

  Result := StrToInt1((s, strlen(s));

end;

有了这3个的函数,用户就根据实际情况调用相应的版本,而不影响效率。而且我们虽然提供了3个函数,但是实际的逻辑代码只有一份,存在于基本函数中。某些场合,还需要将宽字符串转换为整数,所以我们还可以提供另外3个宽字符串的版本:

      

function WStrToInt1(s: PWideChar; len: Integer): Integer;

begin

       //逻辑实现

end;

 

function WStrToInt2(const s: WideString): Integer;

begin

  Result := StrToInt1(PWideChar(s), Length(s));

end;


function WStrToInt3(s: PWideChar): Integer;

begin

  Result := StrToInt1((s, wcslen(s));

end;

 

对于“将数字串转换为整数”的需求,这种设计就提供了完美的方案。以上讨论虽以Delphi举例,但实际上不局限于编程语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值