发表回复 
我的AutoHotkey编程思想(一)
2012-07-10, 14 : 54 (这个帖子最后修改于: 2015-06-23 08 : 07 by robertL.)
我的AutoHotkey编程思想(一)
[i=s] 本帖最后由 nepter 于 2012-7-11 13:25 编辑 [/i]

近期着手准备写一点有关Autohotkey的通俗教程,苦于没有写教程的经验,四处寻找借鉴。几日闲逛论坛后,我感到可能一个好的AHK编程思想的介绍比好的编程教程更​具有现实意义。如果你是程序员,可直接跳过本章内容,如果不是程序员,能够写点小程序又想深入学习AHK的,还是有必要了解一下我对AHK的理解,对AHK编程总会有点帮​助的。

平时看的多是英文文献,写教程的时候也可能较多次数出现ABC,不是我有意增加阅读的难度,是有些单词实在难以用中文代替,英文单词或许更能准确表达真实意思。我会尽量用​中文代替,不过可能你曾经把学英语的时间花在泡隔壁小MM上了,现在还想编点小程序显的自己倍NB,但毕竟一箭双雕的好事不常见,如果看的云里雾里挠头搔耳,也不能说我写​的不到位吧。

* Autohotkey的生命力

不同编程语言可能有各种各样的特性,AHK上手快,源生支持热键功能,能够快速满足,但判断一门编程语言是否有长久生命力的最主要的标准是对模块化和平行化的支持力度,对​于脚本编程语言,平行化并不显得重要,而反观模块化对于脚本语言是相当重要。模块化通俗的讲,就是“数据重用,代码重用,混合重用”。

代码重用最简单的方法是函数化。数据重用一个基本的方法是结构化数据类型,但现在问题是,AHK仅仅用 class 部分实现了使数据结构化,虽然AHK官方论坛上有 struct 类库,但效率和C语言的 struct 等源生支持的数据结构相比那是差之千里,希望未来的AHK版本能够支持。

数据和代码混合重用是AutohotkeyL用 class 才实现的功能,但局限多,需要事先声明,无法动态扩展等问题造成了编程的局限性,不过据了解,在未来的版本中将会有所改善。
很多人对class的理解不一,我的观点是AHK的class可以说是实现AHK模块化最重要环节,在后续教程中我会多次用到class,一个模块化的思维对编程有着极大​帮助。

综上所述,AHK持续生命力是有待观察的,一个编程语言的开发需要一个团队的辛勤努力,希望AHK的继任作者能够给力。

* Autohotkey的特点

对于多数人来讲,AHK仅仅是热键软件,但它能实现的功能不仅如此。对于编程来说,最重要的因素是信息的传递,以何种方式传递、传递效率怎样、反馈通道等。人和程序之间信息传递最基本的方法还是键盘和鼠标的键入和显示屏的反馈,这真是AHK的强项,也是我开始研究AHK的初衷。​

一门编程语言,实际上是某个角度对现实生活的某种映射,那么AHK是怎样的一种映射呢,从我对AHK的理解和AHK的编程经验来说,AHK是鼠标键盘屏幕对于现实生活的某种映射。或许这句话不易理解,我会在之后用例子详细阐​述。

* Autohotkey的编程思维之构建概念

除了热键、热字符串等直观化的脚本,AHK的数据结构和语法结构也是清晰的,也很重要。接下来我将介绍如何用AHK来构建我们的幸福生活。
什么是数据结构,我们来看几个例子:

1、用数据结构来构造三角恋关系
首先我们要构造一个人,它拥有姓名、性别、喜欢的人属性
代码: (全选)
class person
{
  __New(name,sex,like)
  {
    this.name := name
    this.sex := sex
    this.like := like
  }
}
定义一个三角关系,包含三个人,并分别赋值
代码: (全选)
class Love
{
  __New()
  {
    this.person[1] := New person("谢","男","陈")
    this.person[2] := New person("陈","男","张")
    this.person[3] := New person("张","女","谢")
  }
}
这样我们成功构建了一个闭合三角关系,如果三角关系发生变化怎么办,比如
代码: (全选)
关系 := new love
关系.person[4] := New person("卢","男","")
关系.person[3].like := "卢"
这样我们创建了一个开口的四角恋。
如果我们想知道谁喜欢“张”,怎么写呢
代码: (全选)
关系 := new love
for k,v in 关系.person
{
  if ( v.like = "张" )
    msgbox % v.name
}
最后,我们知道“陈”喜欢张

2、怎么用数据结构表达,康哥送玫瑰花追隔壁家的小薇
首先我们要构造一个人,它拥有姓名、玫瑰花、喜欢的人属性
代码: (全选)
class person
{
  __New(name,rose,like)
  {
    this.name := name
    this.rose := rose
    this.like := like
  }
}
定义一个追求过程和送花的行为
康哥刚开始有99朵,每送一朵花,康哥的花少一朵,小薇的花多一朵,小薇收集到1000朵花时才喜欢康哥,康哥没有花了就重新买99朵。
代码: (全选)
class FindLove
{
  __New()
  {
    this.person1 := new person("康",99,"薇")
    this.person2 := new person("薇",0,"")
  }
  Flowers()
  {
    this.person1.rose --
    this.person2.rose ++
    if this.person2.rose =1000
      this.person2.like := "康"
    if this.person1.rose = 0
      this.person1.rose := 99
  }
}
如果我想知道康哥为了追小薇买了几次花,该怎么写呢
代码: (全选)
追求 := new FindLove
while (追求.person2.like != "康")
{
  追求.Flowers()
  if (追求.person1.rose = 99)
    BuyFlowers ++
}
msgbox % BuyFlowers
最后得到康哥共买了10次花

以上展示的是如何利用AHK的class来实现代码重用和数据重用,使得代码更直观、更简介。我想,在想深入学习AHK之前,必须得有一定的编程基础,有一定的编程思维,​这也才不会让你过于痛苦的学习AHK。人的逻辑和编程的逻辑是紧密联系在一起的,只有严密的逻辑思维,写出来的代码才更优雅,更可读。

有人说AHK不适合大型编程,界面设计。我想说,如果能有效解决我之前谈的数据结构、class的动态扩充、消息通道处理、增加平行化支持、interface以及错误处​理等(这些看似不难解决),AHK绝对会吸引更多人来参与AHK的建设,人多了才能出产大型软件,不是吗。

最后希望有更多的高手能够加入AHK的阵营。

二楼将增加更多实例
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢nepter
2012-07-10, 14 : 57
 
回帖占楼!
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-07-10, 19 : 39
 
对类的介绍有深度,建议发到[中文工具和资料]部分。

AutoHotkey 学习指南 我的帖子
我不生产代码,我只是 AutoHotkey 的搬运工:从官方到中文;从其他语言到 AutoHotkey;有时则把 AutoHotkey 搬运到普通用户面前。
访问这个用户的网站 查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-07-10, 20 : 56
 
发完又看了几遍,还是有几个地方没说清楚,可能我并未完全想明白。

我一开始就用类,是因为类并不是复杂的概念,类相当于一个概念的集合体,每个概念又是许多概念的集合。它反映了我们对事物的认知过程,是对世界最基础的认识。习惯于类的编​程,能够使代码非常优雅,因为他最贴近于人的思维过程的。

当然要学好也是非常不容易的,过几天我将写编程思想(二)来一步步阐述如何利用类,这个AHK唯一能够实现高度模块化的工具,来构建一个应用程序的。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-07-12, 00 : 18
 
我就怕ahk_l后继开发无力啊,原本以为ahk_l是众望所归的后继版本,结果论坛易主后继任者并不认同ahk_l。现在官方论坛已经2个多月没发布新版本了,论坛新脚​本也少了。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-07-12, 08 : 39
 
现在AHKL到了一个比较重要的时间节点,对象概念的引入使得命令式语言AHK发生根本性的改变,现在面向对象范式的争论比较激烈,选择怎样的一个路径或者说向哪门语言看​齐是一个重大选择,万一走错了道路,返回原来的样子是非常复杂的事情。我倒觉得,继任者并没有对AHK的发展路径有太大分歧,可能他们对AHK的定位不同,但最后理念都会​趋同,如果出现一款由AHK编写的面向对象设计的经典之作出现的话,AHKL的发展方向会更加明确。

可以看出,AHKL吸收了不少其他语言的优点,python,com,oc等,不少新语言也不断兴起,我觉得AHKL应该紧随现代编程语言的发展。AHKL已经给了我们一​定的可操作性,虽然一些面向对象的最前沿的特性还未引入AHKL,但用现有的功能已经可以一定程度上模拟了。我虽然谈不上很精通,但也有一定的理解,未来我将写一点基于c​lass的新范式。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-07-12, 10 : 11
 
对于生命力,我想不用担心,开源的东西,东边不亮西边亮。
更主要的问题是以后如何发展,细节而言,对于现有的用户,他们还需要什么?对于开发者,他如何定位 AutoHotkey 呢?
从某种角度看,AutoHotkey Basic 已经实现了 Chris 最初的目标,对于我们,这个分支非常大的一个遗憾是 Unicode 支持。这是我使用 AutoHotkey_L 的出发点,对于 COM、对象和其他东西,对于我是可选的。

对于 AutoHotkey 以后,可能是 AutoHotkey_L 后续版本或者是其他其他分支。沉默之后,可能是灭亡,可能是爆发,大家一起期待吧。

AutoHotkey 学习指南 我的帖子
我不生产代码,我只是 AutoHotkey 的搬运工:从官方到中文;从其他语言到 AutoHotkey;有时则把 AutoHotkey 搬运到普通用户面前。
访问这个用户的网站 查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-08-12, 17 : 58
 
有句粗俗点的话叫做:“杀猪杀屁股,各有各的杀法”
不同的语言有不同的应用环境,AHK虽然简单,但很强大,争论的无非是是否将该语言大型化、复杂话,但同时带来的问题就是入门难的问题,这会影响AHK的用户受众
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2012-11-22, 17 : 13
 
期待更新2楼。。
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2013-05-07, 03 : 32
 
我表示我只看懂了谢是一个同性恋

认真学习
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2014-06-28, 12 : 13 (这个帖子最后修改于: 2014-07-01 16 : 59 by robertL.)
RE: 我的AutoHotkey编程思想(一)
(2012-08-12 17 : 58)dogpaw 提到:  有句粗俗点的话叫做:“杀猪杀屁股,各有各的杀法”
不同的语言有不同的应用环境,AHK虽然简单,但很强大,争论的无非是是否将该语言大型化、复杂话,但同时带来的问题就是入门难的问题,这会影响AHK的用户受众
学习需要循序渐进,需要好的深入浅出的教程,
并且支持多个层面的应用(简单的热键、作为脚本粘合其他控件/语言、开发应用程序)。

语法是形式,不会有多复杂;编程思想是本质,才是深不可测,见仁见智。


To Nepter 1#
结构化数据类型,对象就是结构化的吧?
AHK作为动态语言,有数据,无数据类型(内部自动维护),结构类型是靠用户自定义/自约束。

class"无法动态扩展",指什么?当前仍存在此问题吗?

其他写得很好,有见解,空了讨论,感谢分享~

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2014-07-01, 13 : 18
RE: 我的AutoHotkey编程思想(一)
如果我们想知道谁喜欢“张”,怎么写呢
代码:
关系 := new love
for k,v in 关系.person
{
if ( v.like = "张" )
msgbox % v.name
}
最后,我们知道“陈”喜欢张
-----------------------------
请问这里的k,v怎么理解???为什么是v.like = "张"??v不是值吗??这里的键和值分别是怎么的??
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2014-07-01, 13 : 29 (这个帖子最后修改于: 2014-07-01 13 : 33 by robertL.)
RE: 我的AutoHotkey编程思想(一)
(2014-07-01 13 : 18)td3zz 提到:  请问这里的k,v怎么理解???为什么是v.like = "张"??v不是值吗??这里的键和值分别是怎么的??
的概念是基于对象范围的。
  如,k-v是对象o的键-值,但v自身可以是对象..

对for k,v in o。
  1. 先考察o的结构,o=[{..a..},{..b..}],所以k对应索引1、2、..,v对应数组值{..a..}、{..b..}、..;
  2. 再考察{..}的结构,{love="某某"}。

先熟悉了语言语法,再了解编程思想
前者是死板的,后者是见仁见智。

One for all, but man for himself

帮推广:AHK知乎专栏
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
2017-03-29, 01 : 11 (这个帖子最后修改于: 2017-03-29 01 : 12 by bootislands1.)
RE: 我的AutoHotkey编程思想(一)
第二篇还没出炉?
想写个大点的脚本,所以了解了之前没碰过的AutoHotkey中的面向对象,发现class语法和Java很像嘛,但帮助文档又长又啰嗦……
有没给程序员读的、一张图讲清楚:AutoHotkey中的面向对象语法,有何特殊之处(和Java/C++其他语言一样的,就甭说了,只讲不同)?看下就快速上手了
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合