`

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:='';
分享到:
评论

相关推荐

    Delphi与C#的混合编程

    实例12 &lt;br&gt;稿件名称:Delphi与C#的混合编程 &lt;br&gt;稿件作者:石晓珍 &lt;br&gt;程序名称:COM&lt;br&gt;&lt;br&gt;运行环境:Win XP;Delphi + C# &lt;br&gt;注意事项:

    Delphi ShowProgress自定义的进度条和消息提示窗口单元.rar

     注意事项:同一时间屏幕上只能显示一个进度窗体,窗体显示时其它所有窗体均不能使用,但显示该窗体的代码仍可以继续运行。  来看一下参数如何定义:  procedure ShowProgress(const Title: string; AMax: ...

    精通matlab7.0混合编程.

    11.2.5 excel link的注意事项 11.3 通过excel 生成器 11.3.1 概述 11.3.2 创建excel生成器插件 11.4 直接将matlab工作区间的数据拷贝到excel 11.5 小结 第12章 通过matlab com builder实现混合编程 12.1 com基础知识...

    Delphi D10.X 在安卓APP开发中使用Jar包的注意事项

    写完上一篇博客《对于《关于使用Delphi XE10 进行android开发的一些总结》的补充》考虑了一下,应该把一些在开发安卓APP时使用到JAR包的注意事项也再讲一下。 请注意:这里是一些注意事项,或说“在开发过程中可能...

    巧用Delphi制作溅射屏幕

    精心编写的WINDOWS程序显示启动注意事项,称之为溅射屏幕(splash screen)。利用一点儿小小的内容,即可给程序的显示添加不少色彩。 由于工程本身创建程序的主窗口,且启动溅射屏幕必须在创建主窗口之前出现,所以...

    PB进阶代码(很全的)

    注意事项: 1. 第4章部分例程需要配置名为pbbook的ODBC数据源; 第5章例程需要配置名为PrintDB的ODBC数据源。 2. 某些例程可能会因环境原因而无法运行,但源代码可供参考。 3. 部分例程所在目录有说明文件,请注意...

    计算机程序的正确定义

     注意事项:编程语言和编程工具是两回事情,编程语言是指C++、Basic、Object Pascal等。程序设计语言,它们是像汉语、英语一样的抽象的语法规则,编程工具是指 Visual C++ 6.0、Visual Basic 6.0、Delphi 7.0等包括...

    一个完整的市一级工资管理程序(包含全部控件包)D7

    注意事项:所有解压密码:158100232832041不好意思:由点大,100M,但包含全部的东东。1、如果你的系统运行安装程序时出现错误,请先安装MDAC,微软网站有的,offic软件里也有,别说你没有安装word,Excel......2、...

    WindowsAPI参考手册

    本书详细介绍了每一个Win32 API 函数的使用方法,其中着重介绍其原型表示、函数说 明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB 或.DLL)和典型示例。对于每 个函数本书给出了相应的示例部分,这样读者...

    彩虹UDA软件狗工具带硬复制工具

    开发商升级注意事项: 并口 RC-DL (现已更名为 PDL )型软件狗的软件软件狗开发套件 V3.0 与原 DJ/DK 完全兼容,即使用软件狗开发套件 V3.0 的驱动程序、模块及工具,可以正常操作 DJ/DK 型软件狗。所以建议使用原...

    虚拟机 vmprotect1.22

    注意事项: 1.用VMProtect处理,请多测试,如果不稳定,请调整被保护代码的范围。 2.VMProtect对双线程支持不是太好,请同一次仅处理一个线程内的代码 2.用SDK标记代码 VMProtect v1.2以上支持SDK了,可以编程时...

Global site tag (gtag.js) - Google Analytics