易语言优化教程

易语言优化教程


2024年2月5日发(作者:)

1、对象的载入与卸载

有时我们会发现,用易语言测试运行一些朋友编写的易程序,当退出后,鼠标指针一直呈箭头及沙漏形状,甚至会死机。原因可能是该程序还没有完全退出,还有一些对象数据留驻内存。对象会占用相当程序的内存及系统资源。作个假设,如果你在退出程序时不关闭打开的数据库,那么多次打开程序并退出后,可能会引起内存泄漏事件而导致很快死机。故如果我们载入了某个对象,在使用完后要卸载对象释放资源,这是绝对有必要的。

有些编程语言甚至在建立变量、数组、常量及窗口对象后,在程序退出时又要销毁它们。但易语言不用,因为在退出易程序时,它已自动帮你做了这些工作。但有很多对象是无法在程序退出时自动销毁的,故需要编写代码来卸载这些对象。下面列举一些对象在易语言中怎样载入和销毁的例子。 一、易语言内部命令中的对象载入和卸载 1、打开数据库与关闭数据库 载入数据库用“打开”命令,卸载或销毁数据库用“关闭”或“全部关闭”命令。 2、打开文件与关闭文件 打开文件用“打开文件”命令,关闭文件用“关闭文件”或“关闭所有文件”命令。 3、载入图片与卸载图片 有时不一定要在退出程序时卸载被载入的图片,因为如果某图片被载入后未被卸载,在易程序退出时将自动被卸载。但退出时用代码卸载保险一点。 二、API函数中的对象载入和卸载 1、获取设备环境与释放设备环境 由GetDC函数获取的设备环境必须用ReleaseDC函数释放;由BeginPaint函数获取的设备环境要用EndPaint函数释放。 2、创建画笔与删除画笔 使用画笔之前必须事先定义一个画笔句柄。形式如下:

HPEN(hP)

然后调用函数GetStockObject获取Windows系统定义的四种画笔例如获取画笔BLACK_PEN的形式如下:

hP=GetStockObject(BLACK_PEN)

创建画笔后,必须调用SelectObject函数将其选入设备环境。不再使用当前画笔时,需用DeleteObject删除画笔,以免占内存。 3、建立画刷句柄与删除画刷句柄 使用画刷需事先定义一个画刷句柄。形式如下:

HBRUSH(画刷句柄)

然后调用函数GetStockObject获取Windows系统提供的7种画刷;不使用画刷时,可用DeleteObject删除画刷,释放内存。 4、载入位图与释放位图 用LoadBitMap加载位图并获得位图的句柄,用DeleteObject来释放位图或其他对象。 5、打开剪贴板与关闭剪贴板 打开剪贴板由应用程序调用OpenClipboard 函数完成;关闭剪贴板由应用程序调用函数CloseClipboard完成。 6、创建计时器与删除计时器 SetTimer用于建立一个计时器,KillTimer用于删除一个计时器。

除上面这些之外,对象的载入和卸载还包括:建立与删除场景、载入与卸载DLL、捕获与释放鼠标、置与重置父窗口、载入与卸载皮肤、分配与释放内存、打开与关闭对话框、创建与释放压缩包、添加与删除提示、注册与撤消热键、创建与销毁线程、播放文件与关闭播放等等很多,其中有一些在易友所编写的易模块、支持库中有所反映。

2、让你的易程序启动快一点

有时是否觉得你的应用程序启动得太慢了?你可以用下面小技巧让你的程序启动起来感觉快一点: 在“__启动窗口_创建完毕”事件子程序的第一行或其他适当位置加入下面一行代码: _启动窗口.可视 = 真 点评:易语言在窗口显示前一般先执行“__启动窗口_创建完毕”事件中的程序,如果你在“__启动窗口_创建完毕”中加入大量代码或载入庞大的数据库,就可能导致易程序执行代码很久而不显示窗口。我们在“__启动窗口_创建完毕”事件

的第一行强制加入“ _启动窗口.可视 = 真”让窗口先显现出来,这样给人感觉程序运行好象就快了点。 加上这一句,程序窗口就会先显示出来再说,保险一点。

3、[转帖]让易语言编译的程序更小

作者:MSG]Hearson 一、引言 易语言3.x独立编译的程序相对于2.x版本的来说,执行效率提高了,代码也短了。但是还是让人觉得 颇为臃肿,什么程序也不写,编译出来的动辄就400多k。那么有什么好的方法吗?请往下看。 二、操作方法 吴老大在几个月以前发表了 易语言支持库开发技术文档 里面对易支持库开发有详细的说明。因为支持库是一个dll文件,那么,也就可以用其它编程工具来编写这个支持库。里面还有有关 *.fn? 的后缀名含义的说明: 支持库文件名的后缀必须固定为.fnx,其中x为一类型字母,目前有意义的后缀有: 1、“.fne”: 带编辑信息、有运行支持代码的支持库; 2、“.fnl”: 带编辑信息、无运行支持代码的支持库; 3、“.fnr”: 不带编辑信息、有运行支持代码的支持库; [/QUOTE] 由于编译时打入文件的支持库后缀名为*.fnr,而每个支持库均为dll动态连接库,dll是win32 pe文件,那么我们就可以使用一些已经存在的pe文件压缩工具对*.fnr文件进行压缩。我用的是upx。 [QUOTE] upx -9 upx -9 upx ...... 这样,打入编译文件的支持库就小很多。再经过编译时的压缩,使目标文件更小。我的一个程序,压缩支持库以前有400多k,现在只有386k。 三、期望 由于 系统核心支持库 为必包含的文件,希望吴老大能把这个支持库进行分割,以求更小的编译文件。 今天凌晨刚被斑竹删帖,写一篇文章将功补过。

4、从几种判断星期几的方法看编程思路

思考下面的判断星期几的多种程序实现方法,从中选择更好的方法,可以开拓我们的编程视野,锻炼编程思维的灵活性。

“取星期几”命令是返回一个值为 1 到 7 之间的整数,表示一个星期中的某一日。星期日为 1,星期一为 2,依此类推。为什么这样?因为西方的每个礼拜周是从星期日算起的,到星期一、星期二、、、星期六是周末,而西方的礼拜假在周始日,即星期日和星期一放假。易语言的“取星期几”命令其实是沿用西文编程的习惯,所以无法直接获取星期几,所以我们要自制一个函数来完成这项功能。

一、流程控制方法:

子程序:取星期

返回值类型:文本型

星期 = 取星期几 (取现行时间 ())

如果真 (星期= 1)

返回(“今天是:星期日”)

如果真结束

如果真 (星期= 2)

返回(“今天是:星期一”)

如果真结束

如果真 (星期 = 3)

返回(“今天是:星期二”)

如果真结束

如果真 (星期 = 4)

返回(“今天是:星期三”)

如果真结束

如果真 (星期 = 5)

返回(“今天是:星期四”)

如果真结束

如果真 (星期= 6)

返回(“今天是:星期五”)

如果真结束

如果真 (星期 = 7)

返回(“今天是:星期六”)

如果真结束

二、更精简的流程控制命令方法:

子程序:取星期

返回值类型:文本型

局部容器:星期 数据类型:整数型

星期 = 取星期几 (取现行时间 ())

判断 (星期 = 1)

返回 (“星期日”)

默认

返回 (“星期” + 数值到大写 (星期 - 1, 真))

判断结束

三、多项选择方法:

子程序:取星期

返回值类型:文本型

局部容器:星期 数据类型:整数型

星期 = 取星期几 (取现行时间 ())

返回(多项选择(星期, “星期日”, “星期一”, “星期二”, “星期三”, “星期四”, “星期五”, “星期六”))

以上三种代码中,第一种代码可能是一般人首先想到的,因为各个星期几的性质的一样的,所以很容易就用到“如果真”或多项判断,其中多是受到思维定势的影响。首先想到用这种方法或第二种方法的人应该比较普遍,因为较容易理解。

而第二种方法是在第一种方法上的进一步精简。当用第一种代码时,可能你会想,每增加一个选择项,就要增加一个“如果真”或“判断”,代码行是不是多了一点。于是你想到星期值除了星期日,对应的星期几比它多1,于是你就想到 返回 (“星期” + 数值到大写 (星期 - 1, 真))。也有一部分人首先想到的是这种方法,一般来说头脑比选第一种方法的人更

快捷,更容易接近事物本质。

选第三种方法的人一般对命令运用较娴熟,思考也更快捷、直击事件本质。所以当你想精简代码时,就可以考虑运用后两种更简便的方法。

从上可知,要培养你的编程思路,一要对易语言的语法、命令等各方面都要熟悉,二是要花一点时间来优化、精简你的代码,三是尽量摆脱思维惯性,培养思维的快捷性,扩展编程视野。

5、从数值运算看程序代码的优化

有人说易语言不讲究算法,不是这样的。易语言的编程原理跟其他编程语言一样,哪有不讲究算法的道理?易语言跟其他编程语言一样都要优化代码、讲究编程效率。下面试举一例说明在易语言中如何优化代码。

我们还在读书的时候,常会接触一些数学智力题,比如当最大数为n时计算下面算式的值:

1-2+3-4++n

我相信没有哪个同学会这样计算:先算1-2的结果,再算1-2+3的结果、、、一步一步这样算下去。这种计算方法很慢,太笨了。有些计算能力比较强的同学可能会较快找到好的方法得到正确的结果。

编程的运算原理跟我们数学的计算方法差不多,一般来说,在数学中好的运算方法用到编程中也是好的,在数学中不好的方法在编程中也会不好。下面我们就用编程的方法计算上面算式的值来说明这一点,我们编制一个子程序"运算最大值"来完成这项功能。

可能一般人首先想到的是下面这种方法: 子程序:运算最大值

返回值类型:长整数型 参数:最大值 数据类型:长整数型 局部容器:临时值 数据类型:长整数型

局部容器:循环值 数据类型:整数型

局部容器:标记值 数据类型:整数型 临时值 = 0

标记值 = 1

如果真 (最大值 ≤ 0)

信息框 (“错误: 最大值 必须 > 0”, 0, )

结束 ()

如果真结束

计次循环首 (最大值, 循环值)

临时值 = 临时值 + 标记值 × 循环值

标记值 = -1 × 标记值

计次循环尾 ()

返回 (临时值)

上面的步骤肯定可以得到正确的答案。但是只要你测试一下,就会发现:当最大值为很大时,程序的执行速度非常慢。在程序开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,让我们看看这个程序还有什么可以修改的地方,把程序优化一下。我们修改为下面的代码看看: 子程序:运算最大值

返回值类型:长整数型 参数:最大值 数据类型:长整数型 局部容器:临时值 数据类型:长整数型

局部容器:循环值 数据类型:整数型

局部容器:标记值 数据类型:整数型 临时值 = 0

标记值 = 1

循环值 = 1

如果真 (最大值 ≤ 0)

信息框 (“错误:最大值 必须 > 0”, 0, )

结束 ()

如果真结束

判断循环首 (标记值 ≤ 最大值)

临时值 = 临时值 + 循环值

循环值 = -循环值

如果 (循环值 > 0)

循环值 = 循环值 + 1

否则

循环值 = 循环值 - 1

如果结束

标记值 = 标记值 + 1

判断循环尾 ()

返回 (临时值)

经测试上面代码的执行速度比第一种代码快了一点点,原因是加法运算会比乘法运算快,而代价仅仅是增加了一个整数型变量。但是当最大值为很大时,运算速度仍然很慢。也就是说这个程序仍然不能达到要求,还应该有更优的方案。更优的方案是: 子程序:运算最大值

返回值类型:长整数型 参数:最大值 数据类型:长整数型 如果真 (最大值 ≤ 0)

信息框 (“错误:最大值 必须 > 0”, 0, )

结束 ()

如果真结束

如果 (最大值 % 2 = 0)

返回 (最大值 ÷ 2 × -1)

否则

返回 ((最大值 - 1) ÷ 2 × -1 + 最大值)

如果结束

运用上面的方法,计算结果好象即算即出。在数学中的最好计算方法是不是这种方法?怎么样?想到了吗?没错,当最大值很大很大的时候这三种程序的运行时间简直是天壤之别!所以,不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的。

6、错误处理例程详解

程序错误一般归结为三大类:编译错误(代码行不能确定的错误)、运行错误(无法运行的错误)、逻辑错误(不能达到你设定的目标的错误)。 测试运行过程中当出现运行错误时,在易语言的输出框提示错误信息并用箭头指示出错代码行。而运行错误有两种情况,一种是运行后立即提示错误的错误,如错误(10004) 指定窗口单元名称“编辑框2”未找到、现行容器或参数不能接受空数据、现行容器或参数的数据类型与传递给它的数据的类型不一致、被调试易程序读写了非法内存地址、被调试程序堆栈溢出,等。一种是在具体操作程序时(比如单击按钮)才出现错误提示,如除数为零、数组下标越界、用户操作错误等。第一种情况比第二种情况更容易发现一点。

数组成员下标小于1和超过成员数都是属于数组下标越界!!!

比如说,“数组[索引]”共有10成员,那么就不允许“数组[0]”出现,因为易语言的数组成员下标是从1算起。该数组也不也许“数组[11]”出现(超过了限定的10个成员数),否则就会产生数组下标越界错误。 也就是说该数组的最小下标为1,最大下标为10,不在这个范围就是数组下标越界。

二、错误处理例程。

一生一次所说的就是一种错误处理程式,为了防止程序运行错误而导致程序中止运行所采取的一种预防措施,但是一生一次的代码并没有达到防止程序中止运行的目的,还要修改代码,比如去掉“结束()”这一行,但是还要继续防止操作时数组下标越界,所以还要加上数组下标越界时的处理语句,当数组下标越界时,用信息框提示错误。 程序有时会出现运行错误,比如:错误(10004) 指定窗口单元名称“编辑框2”未找到、除数为零、现行容器或参数不能接受空数据、现行容器或参数的数据类型与传递给它的数据的类型不一致、被调试易程序读写了非法内存地址、被调试程序堆栈溢出,等等。程序出现运行错误时就会中止运行,假设程序运行到紧要之处突然出现运行错误而中止运行,很可能会给你带来损失。 在这里我们主要了解一下在程序中怎样加入错误效验语句。

有人可能要问,既然易语言对于程序错误有出错提示,为什么还要在程序中加入错误效验语句呢?诚然易语言有强大的错误处理功能,但由于出错原因五花八门,易语言也不可能面面俱到。同时程序出错常常会中止运行,假设你正在处理数据,已经花了数小时,如果程序突然出错而中止运行,那你数小时甚至更长时间的心血就会付之东流了。这时加入出错效验语句,当程序出错时,执行其他语句或询问保存,就有可能会防止数据丢失。

错误处理程序有多种,比如除数为零的处理、文件(包括数据库文件)打开失败的处理、通用对话框打开失败的处理、数组下标越界的处理、用户操作错误的处理,等等。下面试举一例说明怎样进行错误处理。

【例程1】、除数为零的处理。

当除数为零时会终止程序运行,我们可以加入错误效验语句制止这种现象。例程设计界面如图7-1-9所示。例程代码如下:

子程序名 返回值类型 备注 _按钮1_被单击

如果 (到数值 (编辑框2.内容) = 0)

信息框 (“除数不能为零!请返回重填”, 0, )

否则

编辑框3.内容 = 到文本 (到数值 (编辑框1.内容) ÷ 到数值 (编辑框2.内容))

(图7-1-10)

运行效果如图7-1-10所示。

很多编程用户(包括其他编程语言的用户)都不习惯进行错误处理,那么你编的软件很可能会给你的用户带来问题,故而大家很有必要学习一下错误处理的程式。有时很简单,加个“如果”语句,判断出现错误时弹出信息框。

7、关于支持库开发规则的建议(简称b氏18条) 1、命名习惯要尽量跟飞扬易语言的命名习惯相一致(包括库名和命令名等)。 2、一般命令的命名方法是飞扬法:动词+名词。 3 、命令标识符应当直观且可以拼读,可望文知意,不必进行"解码"。 4、命名尽量简洁。命令标识符的长度应当符合"长度小、信息少"的原则。 5、命令名不要跟原有的系统命令相混淆。当要给自己的支持库命名时,要看看会不会跟前面用户制作的支持库及易原有支持库的命名重复。 6、用正确的反义词组命名具有互斥意义或相反动作的子程序、命令等。例如:“置长度()”与“取长度()”。 7、用语要严格准确。比如命名为“取当前路径”而不要命名为“取目前路径”。 8、支持库里各命令的命名风格尽量一致。比如某个命令命名为“相乘”,那么另外的命令就命名为“相除”、“相加”之类而不要命名为“求除数”、“求加数”。 9、按照易语言的习惯,尽量用白话文方式,当然也可以考虑用文言文方式。 10、汉语编程不要用英语来命名(包括参数、变量等),否则易语言就失去意义。 11、将API等改编为支持库要完整反映原著,否则很多人不如用API还好,因为API函数是经过大量经验总结而成,一般人的水平很难超出它。开发支持库不应象开发易模块那么随便,因为这反映的是易语言给人的印象。 12、支持库开发要反复测试,否则支持库命令错误,有可能给用户带来损失,比如文件被修改或丢失、数据被删等。所以支持库命令里考虑加上错误处理程序是必不可少的环节。 13、支持库的解释文本要准确、详细,不要让人产生歧义。 14、支持库的解释文本要按照易语言解释文本的格式去设计,使易语言解释文本的规格一致。 15、要考虑哪些参数可空,哪些参数是必需的。如果不是必需的,就要设为可空,以减少用户输入代码的工

夫。 举例:“修改提示标签文本”可以改为“置提示文本”,“修改提示标签背景颜色”改为“置提示签底色”或“置提示底色”或“置提示区底色”,“修改提示标签文本颜色”改为“置提示文本色”或“置提示字色”,“修改提示标签显示时间”改为“置提示时间”,“修改提示标签图标”改为“置提示签图标”或“置提示图标”或“置提示区图标”。我觉得这样较符合飞扬易语言的命令命名习惯。

8、减少程序错误的建议

1、最好将大程序分解成一些小程序,再用调用子程序模块的方式把它们粘结起来,因为程序越小,就越容易隔离错误。 2、每次修改程序的时候都要测试程序。当改变了程序中的三行内容之后,程序运行得很好,那么错误完全可以排除在这三行之外。 3、预先要为应用程序的每一个事件过程和每一个一般过程都规定好明确的目标,如有可能,就写好程序开发文档。 4、在编写程序时要多加注释。没有注释的程序不要说别人看不懂,就是编程人自己过一段时间也会“丈二和尚摸不着头脑”,对于调试维护程序带来很很多不便,许多编程者都深有体会。 5、尽量用中文来命名变量和对象,尽量使用约定的命名方式。比如文本型变量命名为“文本1”、“级别文本”等,数值型数据命名为“数值1”、“××数值”等,按钮对象命名为“评比按钮”、“按钮1”等。但是“按钮1”、“编辑框2”之类的默认命名方式要尽量少用,转而用“姓名框”、“年龄框”、“退出钮”之类的“用途+对象类别”的命令方式。

6、慎重使用复制和粘贴的代码。比如你在程序外复制一段代码粘贴到本程序中,其中有“评比按钮.可视=假”这一行,但本程序中没有“评比按钮”这一对象,运行时就会出现运行错误。 7、尽量用代码设置属性。使用属性窗口设置属性方便而快捷,但也使人难以看出已经作了哪些属性设置。使用代码来设置属性就好象为属性设置建立了一个文档,方便日后维护。

8、当心那些视觉上不易分辨的操作符发生书写错误。我们经常会把“==”误写成“=”,象“||”、“&&”、“<=”、“>=”这类符号也很容易发生“丢1”失误。然而编译器却不一定能自动指出这类错误。 9、变量(数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。 10、当心变量的初值、缺省值错误,或者精度不够。 11、当心数组的下标越界。 12、当心忘记编写错误处理程序,当心错误处理程序本身有误。 13、避免编写技巧性很高代码。 14、不要设计面面俱到、非常灵活的数据结构。 15、如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。 16、尽量使用支持库命令,不要“发明”已经存在的库命令。

9、如何编写高质量的易语言代码? 下面参考了尘虚缘的意见作了一些修改。 什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源。程序的时间效率是指运行速度,空间效率是指程序占用内存或者外存的状况。另外程序的效率我们也可以分为全局效率和局部效率。全局效率是指站在整个系统的角度上考虑的效率,局部效率是指站在模块或函数角度上考虑的效率。 1. 使用整数和长整数

提高代码运行速度最简单的方法莫过于使用正确的数据类型了。也许你不相信,但是正确地选择数据类型可以大幅度提升代码的性能。在大多数情况下,程序员可以将短整数型、小数型和双精度小数型的变量替换为整数(Integer)或长整数(Long)类型的变量,因为易语言处理整数和长整数的能力远远高于处理其它几种数据类型。 在大多数情况下,程序员选择使用小数型或双精度小数型的原因是因为它们能够保存小数。但是小数也可以保存在整数类型的变量中。例如程序中约定有三位小数,那么只需要将保存在整数型变量中的数值除以1000就可以得到结果。根据我的经验,使用整数和长整数替代短整数型、小数型和双精度小数型后,代码的运行速度可以提高将近10倍。 但是我们也不要老是强调使用使用整数和长整数,因为在程序中数据类型的定义还牵涉一个关键的问题,就是数据的安全,频繁而无规范地定义 数据类型会使算法出现漏洞,是数据的安全和临界判断有问题.对财务和工程计

算而言,小数点的精度是很敏感的数据,只能用双精度数据来规范.另外, 换成整型也会导致程序可读性急剧下降. 2. 避免使用通用型数据 通用型的变量需要16个字节的空间来保存数据,而一个整数(Integer)只需要2个字节。通常使用通用型变量的目的是为了减少设计的工作量和代码量,也有的程序员图个省事而使用它。但是如果一个软件经过了严格设计和按照规范编码的话,完全可以避免使用变体类型。 3. 尽量避免使用属性 在平时的代码中,最常见的比较低效的代码就是在可以使用变量的情况下,反复使用属性(Property),尤其是在循环中。要知道存取变量的速度是存取属性的速度的20倍左右。下面这段代码是很多程序员在程序中会使用到的: 容器名: 数值 类型:整数型容器名: 容器 类型:整数型 计次循环首(7,容器) 文本1.内容 = 文本1.内容 + #换行符 + 到文本((数值×容器))计次循环尾() 下面这段代码的执行速度是上面代码的20倍。 容器名: 数值 类型:整数型容器名: 容器 类型:整数型容器名: 文本 类型:文本型 文本 = 文本1.内容

计次循环首(7,容器) 文本 = 文本 + #换行符 + 到文本((数值×容器))计次循环尾()文本1.内容 = 文本 另外要注意,这个涉及一个编程思路, 用属性当变量的作法大多数情况可以简化算法。所以有时候也不能一味强调用变量代替属性。 6. 避免调用很短的子程序

调用只有几行代码的子程序也是不经济的--调用子程序所花费的时间或许比执行子程序中的代码需要更长的时间。在这种情况下,你可以把子程序中的代码拷贝到原来调用子程序的地方。 但是有时候小的子程序可能会被调用很多次而不是只有两三次,这时就应该调用它。

7. 减少对子对象的引用 在易语言中,通过使用.来实现对象的引用。例如: 窗口1.编辑框1.内容 在上面的例子中,程序引用了两个对象:窗口1和编辑框1。利用这种方法引用效率很低。但遗憾的是,没有办法可以避免它。我的“多媒体模块”就有这个缺点。

8. 检查文本型数据是否为空 大多数易语言用户在检查文本型数据是否为空时会使用下面的方法: 如果 (文本1.内容 = "" ) 注释: 执行操作 结束如果 很不幸,进行字符串比较需要的处理量甚至比读取属性还要大。因此我建议大家使用下面的方法: 如果

(到数值(文本1.内容) = 0 ) 注释: 执行操作 结束如果 另一个不同的意见是:问题在于当文本字串为 "ABC"之类的非数值型时, 到数值("ABC")=0并不表示为空。文本比较的效率并不低,在底层算法中,一般会直接比较长度才会继续比较内容。 9. 使用数组,而不是多个变量 当你有多个保存类似数据的变量时,可以考虑将他们用一个数组代替。在易语言中,数组是最高效的数据结构之一。 10. 尽量使用动态数组,而不是静态数组 使用动态数组对代码的执行速度不会产生太大的影响,但是在某些情况下可以节约大量的资源。 11. 销毁对象 无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间。但遗憾的是很多用户对这一点好像并不是很在意。正确的做法是在退出程序前需要销毁程序中使用的对象。例如:关闭数据库:关闭(数据库名称)、全部关闭(),关闭打开(播放)的文件,关闭载入的图片等。 中止程序执行时应该要关闭打开的文件(包括数据库文件、图片文件等),但是窗口销毁对销毁窗口及窗口单元来说是自动的,已足够做释放用,在窗口内最好不要随意销毁窗口单元,可能会导致程序运行中的潜在的单元数据访问而崩溃.只有在图形buffer情况才需要经常销毁。 12. 尽量使用内部子程序,减少易模块的数量 因为从易语言连接到一个外部对象需要耗费大量的CPU处理能力。每当你调用接口函数的时候,都会浪费大量的系统资源。 另外只有在易模块中的接口函数或变量被调用时,易语言才将易模块加载到内存中;当易语言应用程序退出时,才会从内存中卸载这些模块。如果代码中只有一个模块,易语言就只会进行一次加载操作,这样代码的效率就得到了提高;反之如果代码中有多个模块,易语言会进行多次加载操作,代码的效率会降低。 13. 使用对象数组 当设计用户界面时,对于同样类型的控件,程序员应该尽量使用对象数组。你可以做一个实验:在窗口上添加100个图片框,每个图片框都有不同的名称,运行程序。然后创建一个新的工程,同样在窗口上添加100个图片框,不过这一次使用对象数组,运行

程序,你可以注意到两个程序加载时间上的差别。 也有人认为两者从逻辑上看效率应该差不多。 14. 使用窗口单元“移动”方法 在改变对象的位置时,有些用户喜欢使用“宽度”、“高度”、“顶边”和“左边”属性。例如: 按钮1.宽度 = 100 按钮1.高度 = 100 按钮1.顶边 = 0 按钮1.左边 = 0 实际上这样做效率很低,因为程序修改了四个属性,而且每次修改之后,窗口都会被重绘。正确的做法是使用Move方法: 按钮1.移动(0,0,100,100)

15. 减少图片的使用 图片将占用大量内存,而且处理图片也需要占用很多CPU资源。在软件中,如果可能的话,可以考虑用背景色来替代图片--当然这只是从技术人员的角度出发看这个问题。 但是如果为了优化程序界面,使用图形换来的好处可能远胜节约下的资源,否则就不会有XP,也不会有游戏的进步了。 16. 编译优化 易语言的程序编译有三个选项:“编译”、“独立编译”、“编译生成安装软件”。优先使用的次序应该是“编译生成安装软件”、“编译”、“独立编译”,因为“独立编译”会将易语言系统中所有的支持库都编译进去,而“编译生成安装软件”只选择程序中必要的支持库编译。要脱离易语言环境也可以运行,就不要使用“编译”而应用“编译生成安装软件”或“独立编译”。 总结:执行效率和程序可读性永远是对矛盾 ,两者应该通盘考虑;资源占用和程序易用性永远是对矛盾,两者也应该通盘考虑。基于此,下面探讨一些提高程序的效率的规则。 【规则1】不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率。 【规则2】以提高程序的全局效率为主,提高局部效率为辅。 【规则3】在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。 【规则4】先优化数据结构和算法,再优化执行代码。先考虑某功能是否可以用函数(命令)来实现,如果找不到这样的函数,再考虑用其他代码实现。 【规则5】有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷。例如多花费一些内存来提高性能。 【规则6】不要在什么时候都只追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。

10、试探易语言的命名规则 姑且将我所推荐的易程序命名方法称为"bb88"法,该命名规则的主要思想是"在变量和函数名中加入后缀以增进人们对程序的理解"。我认为这种命名方式适用于汉语编程,故跟英文编程的命名方式有所不同。例如对象可以命名为“有意义的对象名+对象类型”,变量可以命名为“有意义的变量名+变量类型”,比如按钮可以命名为“编辑钮”、“删除钮”、“打开钮”之类;变量可以命名为“循环容器”、“长度文本”、“结果数值”之类。“有意义的对象名”、“有意义的变量名”主要是就对象或变量的功能而言,比如某标签的作用是提示操作方法,那我们就可以将该标签起名为“提示签”,又如某个变量的作用是记录循环的次数,那我们可以将其命名为“循环容器”、“次数”、“循环次数”、“循环变量”之类。 据考察,没有一种命名规则可以让所有的用户赞同,程序设计教科书一般都不指定命名规则。命名规则对软件产品而言并不是"成败悠关"的事,我们不要化太多精力试图发明世界上最好的命名规则,而应当制定一种令大多数用户满意的命名规则,并在项目中贯彻实施。另外说一句题外话,其他编程语言一般把编程者称为程序员,而易语言编程者我们一般称为“易语言用户”、“编程用户”、“用户”之类为好。 本贴围绕探讨易程序命名的共性规则而展开,本贴论述的共性规则是被大多数用户所采纳的,我们应当在遵循这些共性规则的前提下,再扩充特定的规则。 【规则1】标识符应当直观且可以拼读,可望文知意,不必进行"解码"。 对于汉语编程来说,与英文编程相反,标识符最好采用中文词语或其组合,便于记忆和阅读。尽量不使用英文或汉语拼音来命名。程序中的中文词语一般不会太复杂,用词应当准确。例如不要把“当前值”写成“目前值”。 【规则2】标识符的长度应当符合"长度小、信息少"的原则。 在某些情况下规定名字不准超过6个汉字,但一般情况下可以不受此限制。一般来说,长名字能更好地表达含义,所以子程序名、命令名、变量名长达十几个字符不足为怪。那么名字是否越长约好?不见得! 例如变量名“最小值”就比“跟最小

值一样的数值”好用。单字符的名字也是有用的,常见的如“一”、“二”、“三”等,它们通常可用作子程序内的局部变量。 【规则3】程序中不要出现仅靠大小写区分的相似的标识符。例如:变量名: x 变量名: X ※ 变量x 与 X 容易混淆子程序名:foo 子程序名: FOO

※ 子程序foo 与FOO容易混淆 【规则4】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。 【规则5】变量的名字应当使用"名词"或"形容词+名词"或“动词+名词”等。例如:“值”、“老值”、“新值”。

【规则6】用正确的反义词组命名具有互斥意义的变量或相反动作的子程序、命令等。例如:“最大值”与“最小值”、“置长度()”与“取长度()”等。 【建议7】尽量避免名字中出现数字编号,如“值1”、“值2”、“编辑框1”、“编辑框2”等,除非逻辑上的确需要编号。这是为了防止用户偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。 【建议8】全局变量加前缀“全_"或"全局"或"全"或“全—”或“q”(quan)。如“全-播放中”或“Q播放中”,这样在编程中就不会混淆全部变量与局部变量、程序集变量的区别,易于阅读和排查错误。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1707073843a1475637.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信