Delphi编程注意事项--转

 Delphi编程注意事项

任何单元必须有对应测试单元,任何类和函数必须有对应的测试函数,允许合并少于3个关联测试函数,即一个测试函数同时测试3个函数。 PObj继承下来的对象是需要释放的,所以返回值上禁止出现PObj继承下的对象,也就是说不允许在函数里New对象并返回。
例: [禁止] function SomeOne():PStrList;
如果需要传递对象参数则放在函数参数里,这样就由调用者来创建和释放对象。
例:[允许] function SomeOne(list:PStrList):boolean;
当然,NewXXX之类的创建对象的函数除外。一直存在的全局对象也除外,这些全局对象将在初始化时创建,结束时释放。
类定义中如果重载了Destory必须在里面加上inherited,否则不会释放的。 使用对象(object)还是记录结构(record)。
在有关性能方面的服务程序中:
只产生单个实例或少于10个实例则允许使用对象。
否则一律使用记录结构。
在GUI方面都使用对象,但是不得超过五级继承。
纯数据信息必须使用记录结构。
错误、异常处理规则:
1.Test,Check,Is开头的函数并不抛出异常,只检验。
2.其他函数遇到错误或异常都要抛出异常,使用raise显式抛出,
并且在函数文档中注明抛出异常的种类,方便使用者处理。
3.如果需要屏蔽异常,则显式地写try..except语句拦截。

禁止使用无类型参数:
由于无类型参数会导致一定地混乱,因此禁止任何函数拥有无类型参数。如果遇到使用无类型参数的系统函数,则作转换即可。
例:无类型参数=> var buf;
使用指针代替=> const buf:Pointer;
使用无类型参数的系统函数=> FileRead(handle,PChar(buf)^,len); 创建和释放
在什么情况下使用free,什么情况下使用freeandnil。
1.free之后不再使用的函数局部变量要使用free。
2.全局变量或者Free后继续使用的变量要使用FreeAndNil;
Utils里的FreeAndNil是检查过是否assigned之后再调用free,
而kol里的Free_And_Nil是不检查指针状态的。

任何KOL对象中string的成员变量必须在destory时赋成'',否则会造成内存泄漏的,因为在Destory中不释放huge string。
而TObject是没有这种情况的,因为在CleanInstance中释放了huge string。
自定义KOL对象,如果是继承已有对象,可以在Destory中释放额外的内存,不要继承Clear。

TList是可以释放对象的,不需要另外继承。
而TTree是不能释放对象,可以另外继承后释放对象。
尽量少用Crack类,以避免混乱。 注释
单元
所有的单元都用规定的单元头,如下:
{**
@abstract(|)
@author(magicgod<magicgod@gmail.com>)
@cvs($Date: 2006-04-13 03:07:16 +0800 (鏄熸湡鍥? 13 鍥涙湀 2006) $)
@created(%Date%)
@changelog(
)@br
@todo()
@comment()
@br
}
abstract:单元名称
author:单元作者,可以放多个
cvs:只接受 $Author$作为作者的同意词,$Date: 2006-04-13 03:07:16 +0800 (鏄熸湡鍥? 13 鍥涙湀 2006) $作为lastmod的同意词:最后修改时间。
created:创建时间。
changelog:本单元修改历史,自动生成文件。
todo:准备要做的任务。
comment:详细说明和注释。

函数
所有的函数按照以下方法注释:
{**
@param(...)
@return(...)
@raises(...)
}
param:参数,可以有多个,标明参数名、值范围和功能说明。
return:返回值。
raises:可能抛出异常。
函数内部开头必须写上函数思路,除非是简单地返回。
重要算法必须写明思路,测试用例中必须有算法的详细测试。

变量
变量定义按以下方法注释:
{**...}
说明变量的值范围和功能, 由谁初始化,什么时候初始化,什么时候被释放即生命周期。 单线程不用考虑线程安全的问题,而多线程则需要考虑线程安全。
线程类实例会创建自己独立的栈(由线程函数ThreadProc隐含创建),而普通类是使用主线程栈的。 这就是意味着,在子线程中使用局部变量是安全的,因为局部变量是分配在栈中的。 各个线程都有自己的栈(包括主线程),而且一般情况下是无法直接访问别的线程的栈空间的, 除非是一些极端的情况(如将局部变量通过指针传给其它线程供操作),局部变量都不需要访问冲突保护。
同步。
同步的意思就是协调一致,保证不发生冲突。
保持同步使用的办法就是临界区。

线程中的字符串连接竟然会引起内存泄漏。可能是bug。例:
[禁止]:DataDebugLog('ExecuteOperate','thread:'+int2str(sender.Handle)+' xpath:'+cache.xpath); //会引起内存泄漏
[允许]:
t1:=int2str(sender.Handle);
t2:=pchar(@cache.xpath[0]);
t3:= 'thread:'+t1+' xpath:'+t2;
DataDebugLog('ExecuteOperate',t3);
//一定要释放
t1:='';
t2:='';
t3:='';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值