本帖最后由 虫子樱桃 于 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
|