现在我们收到了一个需求,要把 Excel 里的数据批量填写到网页里。我们的客户对数据的安全性非常看重,要求我们务必要能够追溯到每一条数据的执行情况,要求要有非常完善的日志记录,要求在执行完成后,能够生成任务执行报告,并将报告通过邮箱发送给相应的人,并且还要求当代码执行遇到无可挽回的错误时,也要将错误信息邮箱发送给指定的人。
你看,一个商业化的需求总是这么的冗余,我们不仅要写好需求本身,还必须在开工之前,进行大量的规划工作,这些规划一部分是为了让开发更轻松,另一部分则是为了未来更容易进行维护,商业项目总是需要维护很久,因为需求的更新和扩充,因此我们在开发之前,一定要仔细思考该怎么做,才能把事情做好,以及让未来更轻松,这也是我推出这期教程的关键原因。
不管是编译类的语言,还是脚本语言,在设计阶段多付出一点时间,都能够在未来收到巨大的回报,同时完善架构,对于个人能力的成长,也是非常有帮助的。
现在让我们一起来实现这个需求把,首先我们按照之前课程说的,把问题拆分,我们要做的事情,第一步能够拆分为3个一级流程:
Excel 操作
网页填表
发送邮件
同时我们还能够拆出来一个公用库:错误处理。
为什么错误处理要单独拆成一个库,而不是在代码内就完成了?因为代码里总是由数不清的错误要处理,我们把错误处理单独提出来,就可以实现非常有效的流程控制能力了。
现在我来画一个架构图,你们在实际做项目的时候,不需要这个步骤,只要把架构记在脑子里就可以了,我画这张图是为了方便大家理解:
在你还没有熟练的掌握【架构】这项能力之前,是很难做到从第一行代码开始写的时候,就井然有序的,认知上的偏差可能会让人觉得,代码本来就应该是写一步看一步的,但对于能够熟练掌握架构的人来说,第一行代码开始,就已经是在做布局了,像上面这张图一样,我需要多少个工作模块,我需要多少个公共模块,这些模块的层级应该是怎么布置的,输入的内容和输出的内容是什么,一切就井然有序。
架构图可以有一万种样式,我只是举个例子,关键还是你要能理解实现这个项目所需要的每一个步骤,并让代码尽可能的脱耦,所以不管你画的图是什么样的,最终功能能达到就可以了:将项目分割成数个模块,负责整体拼装的是工作流程模块,负责实现具体功能的,是通用功能模块,然后我们将这些模块组织起来,想好他们之间要怎么交换信息,最后这一切组合起来,项目就完成了。
理论性的东西就此结束,我们先不要关心按键精灵的模块化能力怎么样,在熟练的人手里,写MASM代码也是特别规整易于维护的,接下来让我们逐步实现这个项目。
第一步·实现日志组件的封装:
日志的设计指标如下:按天归类日志、日志写入时保存之前的记录、输出关于这条日志的时间、日志内容存放在 C盘 Script_Log 文件夹下。
这里我们可以利用按键精灵X的日志回调机制,用 TracePrint 命令输出日志,简单又方便,日志我们保存在一个固定的目录就行了,通过 xyApi 插件的 File_Append 命令实现日志写出,也可以用其他插件的追加写命令代替。
最终实现代码如下:
- Sub OnDebugPrint(sMsg)
- // 有调试日志输出
- Dim t = Now()
- Dim sd = Format(t, "yyyy-mm-dd")
- Dim st = Format(t, "[hh:mm:ss] ")
- File_Append("C:\\Script_Log\\" & st & ".log", st & sMsg, 0)
- End Sub
复制代码这样所有 TracePrint 命令在执行的时候,都会将日志记录在日志目录下了。
第二步·实现通用脚本错误处理:
通用脚本错误处理用来处理脚本遇到灾难性错误无法自动修复执行的情况,你可以把它当做 ExitScript 类似的命令使用,区别在于它在退出之前,会先弹出消息框告诉用户脚本必须要停止执行的原因,这样用户就不会懵逼的看着屏幕上莫名其妙不执行了的脚本在风中凌乱了。
这个实现机制其实也非常简单,代码如下:
- Sub OnError(sMag)
- TracePrint "!!! 致命错误:" & sMag
- MsgBox(sMag, "Error :", 0, 3)
- ExitScript
- End Sub
复制代码接下来我们在需要应对出错的场景,调用这个函数就可以了,并不复杂吧,这么做其实还有一个深意,就是之后我们需要在出错的时候发送邮件通知工作人员,因此我们必须提前流出响应的接口,这样相当于把整个脚本的错误处理给集中起来了。
第三步·设计数据交换接口:
首先整理我们需要交换数据的接口清单:
输入 Excel,输入格式为路径,输出格式为 Excel 获取到的数据
网页填表循环,输入格式为 Excel 全表,输出格式为执行结果列表
网页填表工作流,输入格式为单条数据,输出格式为执行结果
输出 Excel,输入格式为路径和Excel处理后的数据
发送邮件,输入格式为执行结果列表
根据接口的需要,我们可以设计交换数据的结构:
数据 = [
行号 ... = [
行数据 = "",
行数据 = "", ...
执行状态 = "成功或失败",
失败原因 = "- 或 报错内容",
重试次数 = 数字
]
]
我们输入 Excel 路径,获取如上图结构的数据,然后通过迭代器对数据进行循环处理,取每一行输入传入填表工作流,填表工作流得到数据后,将数据前段的内容填写到浏览器,将执行结果写入到后段内容中。
一切都执行完毕之后,我们可以将数据写回到Excel文件,再将这个 Excel 文件作为附件,发送给工作人员,让工作人员检查脚本的执行结果。
你看这样规划一下,我们的思路不就变的非常清晰了吗,很多时候脑袋里有一大堆想法,但感觉很难让想法变成现实,最大的原因其实是缺乏【具象化】能力,想法太过抽象了,无法把抽象的东西具象化,就很难实际做出什么东西出来,因此科研必须工程化,而架构能力,就是工程化里最关键的。
对于建筑来说,架构就是骨架,对于代码来说,架构同样是骨架,别把这东西想的太复杂,我们不是要开发一个 Windows 操作系统,我们只是开发一个简简单单的脚本,并不是说只有开发操作系统这种级别的软件才会应用到架构,任何细微的小制作,都可以用架构思维来做,不妨尝试一下,它可以给你带来的成长,是超乎想象的。
技术总结:架构就是把【抽象画】的东西变成【具象化】的东西的过程。
编程就是流程、逻辑、数据、命令。
我们学编程,命令靠死记硬背,逻辑靠大脑模拟,没这个本事也可以用调试器单步跟踪。
流程、数据,这就是框架所要管理的内容了,所谓具象化,具象化的是流程(架构图、执行流程图),具象化的是数据(全局数据管理,数据通信接口的制定)。
这一部分是干货,可以仔细想一想,你之前写过的程序是不是这样子的,有时候感觉一开始写的混乱的代码,如果重来一遍,一定能做的更好,在什么层面做的更好?是不是流程和数据管理,这是编程的核心,这方面所需要的能力,就是架构能力,架构能力越强,你的工程管理能力越强,越能进行大项目的带队开发。
今天的内容到此为止,又写了一整天,这样的教程内容比较玄乎,但实际上干货满满,写起来非常累人,下一篇教程明天发,我会写一写功能,在按键精灵X版本实现 Excel 表格的读取。