虫子樱桃 发表于 2012-12-23 02:23:24

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

lpxx 发表于 2012-12-23 04:47:02

翻译的不错啊,通俗易懂。

楼上风云 发表于 2012-12-23 05:44:03

回复 2# lpxx

无利不起早?

楼上风云 发表于 2012-12-23 05:48:44

回复 1# 虫子樱桃

楼主辛苦了!

haijie1223 发表于 2012-12-23 07:57:32

没看明白例1想表达什么意思,如果函数中有重复定义变量的话,无论是在程序开始用的是dim,local还是global。重新定义后,变量的值都会改变的。

user3000 发表于 2012-12-23 07:58:05

早安,各位!

auhj887 发表于 2012-12-23 11:17:39

楼主辛苦了!

komaau3 发表于 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





chenronting 发表于 2012-12-23 17:42:13

是, 现在是要提升质量与编写的技巧的。谢谢分享

chenronting 发表于 2012-12-23 17:42:56

如果不能写出更好的东西, 就试着优化老思路吧。应该这样

annybaby 发表于 2012-12-23 18:12:21

必须支持下,翻译得不错~~

申明-->声明
本地-->局部
摧毁-->销毁
会不会和一般的常见翻译习惯更一致一些呢??
当然,只是一个小建议~~{:face (332):}

xms77 发表于 2012-12-25 00:35:12

回复 9# 虫子樱桃
dim果然不好,幸好我从来不用dim。

fangbaiyu 发表于 2012-12-26 16:13:05

谢谢楼主翻译还是规范点好

moyi20 发表于 2012-12-27 00:30:00

这两天练习循环,就在循环内定义变量,原来影响速度。循环是不是要先于学GUI?   循环太考验逻辑思维了,搞得我都拿笔计算排序先写谁后写谁。
页: [1] 2 3
查看完整版本: AutoIt编码最佳实践[试译]