找回密码
 加入
搜索
查看: 17750|回复: 34

[原创] AutoIt编码最佳实践[试译]

 火... [复制链接]
发表于 2012-12-23 02:23:24 | 显示全部楼层 |阅读模式
本帖最后由 虫子樱桃 于 2012-12-23 02:24 编辑

AutoIt编码最佳实践
译自:http://www.autoitscript.com/forum/topic/146866-best-coding-practices-in-autoit/
翻译:虫子樱桃
时间:2012年12月23日星期日


   我们看到很多人将他们的AutoIt代码例子提交上来,但是我们却很少看到关于如何进行更好编码、对编码进行规范的文章。如果您有AutoIt编码”好的”和“不好的”编码例子,欢迎回帖。
为什么使用Dim多过Local/Global不是一个好的选择

Dim $vVariableThatIsGlobal = 'This is a variable that has ''File Scope'' aka Global.'

MsgBox(4096, '', 'An example of why Dim can cause more problems than solve them.')

Example()

Func Example()
    MsgBox(4096, '', $vVariableThatIsGlobal) 
    ;这对我而言,好像是完全正确的。因为它显示了如下的内容:This is a variable that has 'File Scope' aka Global.
    Local $vReturn = SomeFunc() ; 调用某些函数

    MsgBox(4096, $vReturn, $vVariableThatIsGlobal) 
        ;全局变量$vVariableThatIsGlobal在这里发生了改变,因为我忘记我在SomeFunc中已经有一个重复的变量名
EndFunc   ;==>Example

Func SomeFunc()
        ;如果变量名不存在,下面的代码将创建一个本地变量
        ;因为参数的缘故,我几乎忘记我已经申明了一个同名的变量
        ;但是我只想这个变量在这个函数里面被改变,而不是脚本顶部的那个变量
        ;现在这样可以吗?请思酌
    Dim $vVariableThatIsGlobal = ''

    For $i = 1 To 10
        $vVariableThatIsGlobal &= $i 
                ;此时将返回12345678910,先前定义的变量$vVariableThatIsGlobal.的值将被完全清除
    Next
    Return $vVariableThatIsGlobal
EndFunc   ;==>SomeFunc

在一个函数中申明全局变量绝不是一个好主意

;先调用Example()函数,将初始化全局变量$vVariableThatIsGlobal,因此再调用SomeFunc()函数时,不会有任何错误
;下面来看看例子2
Example()

Func Example()
        ;在函数中申明变量会引起很严重的问题,故全局变量都应该在脚本开头进行申明
    Global $vVariableThatIsGlobal = 'This is a variable that has ''File Scope'' aka Global.'
    SomeFunc()
EndFunc   ;==>Example

Func SomeFunc()
    MsgBox(4096, '', $vVariableThatIsGlobal) 
        ;因为变量未被初始化,所以这里会报错
EndFunc   ;==>SomeFunc


例子2

;先调用函数SomeFunc()时,函数将不会对全局变量$vVariableThatIsGlobal进行初始化,因此AutoIt会无法对变量$vVariableThatIsGlobal的值进行判断处理
SomeFunc()

Func Example()
    ; ;在函数中申明变量会引起很严重的问题,故全局变量都应该在脚本开头进行申明
    Global $vVariableThatIsGlobal = 'This is a variable that has ''File Scope'' aka Global.'
    SomeFunc()
EndFunc   ;==>Example

Func SomeFunc()
    MsgBox(4096, '', $vVariableThatIsGlobal) 
        ;;因为变量未被初始化,所以这里会报错
EndFunc   ;==>SomeFunc

问题:如果一个变量从函数中一返回值,我就想保留该值,并只在指定函数中使用,那这个变量可以被申明为全局变量吗?
答:将变量申明为静态(static)变量

Example()

Func Example()
    SomeFunc() ; 这里将显示一个1,1的对话框
    SomeFunc() ; 这里将显示一个1,2的对话框
    SomeFunc() ; 这里将显示一个1,3的对话框
EndFunc   ;==>Example

Func SomeFunc()
        ;当变量在本地范围(函数内部)进行申明时,一个本地的静态变量就被初始化
        ;该变量在函数执行结束和Return值时自动摧毁。这不是一个静态变量的例子。该变量除了在其被申明的函数内,脚本中的其他地方都不可访问
    Local Static $vVariableThatIsStatic = 0
    Local $vVariableThatIsLocal = 0
    $vVariableThatIsLocal += 1 ; 此处变量将始终为1,因为一旦调用SomeFunc()函数,变量将被摧毁
    $vVariableThatIsStatic += 1 ; 此处变量将以此递增1
    MsgBox(4096, $vVariableThatIsLocal, $vVariableThatIsStatic)
EndFunc   ;==>SomeFunc



在循环中(for、while、do等循环)申明变量可能影响脚本的执行效率



;应避免在循环中申明变量,因为变量将在每次循环中被重新申明
For $i = 1 To 10 ; $i 在循环中被申明
    Local $iInt = $i
Next
MsgBox(4096, '', $iInt) ; 将显示10



;在比较长时间的循环中,在循环外申明变量将会更加高效
Local $iInt = 0
For $i = 1 To 10 ; $i 在循环中'
    $iInt = $i
Next
MsgBox(4096, '', $iInt) ; 将显示10
发表于 2012-12-23 04:47:02 | 显示全部楼层
翻译的不错啊,通俗易懂。
发表于 2012-12-23 05:44:03 | 显示全部楼层
回复 2# lpxx

无利不起早?
发表于 2012-12-23 05:48:44 | 显示全部楼层
回复 1# 虫子樱桃

楼主辛苦了!
发表于 2012-12-23 07:57:32 | 显示全部楼层
没看明白例1想表达什么意思,如果函数中有重复定义变量的话,无论是在程序开始用的是dim,local还是global。重新定义后,变量的值都会改变的。
发表于 2012-12-23 07:58:05 | 显示全部楼层
早安,各位!
发表于 2012-12-23 11:17:39 | 显示全部楼层
楼主辛苦了!
发表于 2012-12-23 16:37:48 | 显示全部楼层
本帖最后由 komaau3 于 2012-12-23 16:40 编辑

新手的福利
 楼主| 发表于 2012-12-23 17:23:08 | 显示全部楼层
本帖最后由 虫子樱桃 于 2012-12-23 17:25 编辑

回复 5# haijie1223


   其实就是作用域的问题

看下面两个例子

Dim $a='我是a,我被dim申明'
test()
MsgBox(0,'',$a)

Func test()
        Local $a='我是$a,我被local申明,在函数内部'
        MsgBox(0,'',$a)
EndFunc




Dim $a='我是a,我被dim申明'
test()
MsgBox(0,'',$a)

Func test()
        Dim $a='我是$a,我被Dim申明,在函数内部'
        MsgBox(0,'',$a)
EndFunc





评分

参与人数 1金钱 +10 收起 理由
haijie1223 + 10 不错~

查看全部评分

发表于 2012-12-23 17:42:13 | 显示全部楼层
是, 现在是要提升质量与编写的技巧的。谢谢分享
发表于 2012-12-23 17:42:56 | 显示全部楼层
如果不能写出更好的东西, 就试着优化老思路吧。应该这样
发表于 2012-12-23 18:12:21 | 显示全部楼层
必须支持下,翻译得不错~~

申明-->声明
本地-->局部
摧毁-->销毁
会不会和一般的常见翻译习惯更一致一些呢??
当然,只是一个小建议~~
发表于 2012-12-25 00:35:12 | 显示全部楼层
回复 9# 虫子樱桃
dim果然不好,幸好我从来不用dim。
发表于 2012-12-26 16:13:05 | 显示全部楼层
谢谢楼主翻译  还是规范点好
发表于 2012-12-27 00:30:00 | 显示全部楼层
这两天练习循环,就在循环内定义变量,原来影响速度。循环是不是要先于学GUI?   循环太考验逻辑思维了,搞得我都拿笔计算排序先写谁后写谁。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-26 00:24 , Processed in 0.081612 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表