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:可能抛出异常。
    函数内部开头必须写上函数思路,除非是简单地返回。
    重要算法必须写明思路,测试用例中必须有算法的详细测试。

    变量
    变量定义按以下方法注释:
    {**...}
    说明变量的值范围和功能, 由谁初始化,什么时候初始化,什么时候被释放即生命周期。
  • io操作是否必须异步?
    io操作元即底层IO函数是同步运行。
    高级应用则使用线程去运行底层IO函数。
    线程控制IO函数,截获错误,并且放入错误池中统一处理。
  • 单线程不用考虑线程安全的问题,而多线程则需要考虑线程安全。
    线程类实例会创建自己独立的栈(由线程函数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、付费专栏及课程。

余额充值