AutoIt编码最佳实践[试译]
本帖最后由 虫子樱桃 于 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
翻译的不错啊,通俗易懂。 回复 2# lpxx
无利不起早? 回复 1# 虫子樱桃
楼主辛苦了! 没看明白例1想表达什么意思,如果函数中有重复定义变量的话,无论是在程序开始用的是dim,local还是global。重新定义后,变量的值都会改变的。 早安,各位! 楼主辛苦了! 本帖最后由 komaau3 于 2012-12-23 16:40 编辑
新手的福利 本帖最后由 虫子樱桃 于 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
是, 现在是要提升质量与编写的技巧的。谢谢分享 如果不能写出更好的东西, 就试着优化老思路吧。应该这样 必须支持下,翻译得不错~~
申明-->声明
本地-->局部
摧毁-->销毁
会不会和一般的常见翻译习惯更一致一些呢??
当然,只是一个小建议~~{:face (332):} 回复 9# 虫子樱桃
dim果然不好,幸好我从来不用dim。 谢谢楼主翻译还是规范点好 这两天练习循环,就在循环内定义变量,原来影响速度。循环是不是要先于学GUI? 循环太考验逻辑思维了,搞得我都拿笔计算排序先写谁后写谁。