Perl面向对象与面向过程的思考

应用介绍

在IC验证中,需要对每个模块输入若干测试向量,来验证电路功能。手写的测试向量不足以代表所有的输入组合,而自动测试向量生成又会产生过多测试向量,因此采用了一种折衷的方法,通过种子随机生成测试向量。不断跑不同种子的testcase的工作称为regression,目的是发现不常见的bug。

实现方法

脚本结构

我实现的Perl脚本功能分为两块,一个是代码版本更新与编译检查。虽然team中用git实现了版本控制,但是由于某些原因,某个版本的代码可能会不工作,会有编译错误或明显仿真错误,因此在代码更新后需要跑sample test检查,如果有错误,要将代码退回到上一版本。另一个功能是对各个模块一次跑regression,检查结果并对出错的testcase重新跑仿真下载波形。具体跑regression的脚本已有他人完成,我只是对它进行调用。脚本结构如图所示,脚本按照功能分成两块,分别是revision和regression,对应代码版本维护和跑regression。

灰色框为实现的脚本。其中regr_sub用来保存两个功能中公用的函数,虚线以下部分为封装的调用他人脚本的脚本,而虚线以上部分脚本实现了控制、执行、检查、逻辑判断等等功能。

实现过程中的思考

一开始写的脚本结构并不是这样,最初要求简单,我按照要求一一实现了脚本。后来加入新的要求,新实现的功能和之前功能有类似也有不同,还与某些功能有依赖关系。(比如仿真需要很长时间,而检查仿真结果必须等待仿真结束,因此在仿真结束前,脚本也就是进程需要挂起。)最后结果功能越加越多,导致脚本越来越长,维护与扩展都成了问题。于是我开始思考用面向对象的方法写脚本。

面向对象与面向过程方法有什么区别呢?回归它们的本质,面向过程容易理解,将一件事情第一二三步按过程实现,那面向过程呢?我觉得它是人看待问题的一种方法,将事情按对象来处理,处理这个对象的若干功能作为对象的成员函数。有人这样归纳面向对象的方法,用自己的语言描述一件事情,名词是对象,与名词有关的动词是这个对象的成员函数。我觉得这种理解有点道理,这样就能把处理一件事情转化成处理多干个对象,按照对象来将功能分类,这样提高了代码可维护性与可扩展性。

在我们的传统观念中,脚本都是面向过程的,脚本实现的功能是简单重复性的,有人甚至按照代码行数来决定功能是用脚本实现还是用程序实现(这里指C,C++,JAVA等),100行以下的代码归为脚本领域。我觉得这个理解是片面的,脚本也可以实现很复杂的功能,因此在脚本中使用面向对象的方法有一定价值。况且现在的一些脚本语言如Perl,Python都支持面向对象的语法,而Python更进一步,打破了脚本和编程语言的明确界限,在各领域都被广泛使用。

按面向对象的方法划分结构,面向过程的方法实现细节,个人觉得是比较好又简单的方法。我的脚本也是这么实现的,将功能分为两个对象,分别是revision和regression,即上图中圆框内名字,这两个名字代表的实际对象是代码和testcase。revision实现了代码的更新和检查,regression实现了testcase的仿真、结果验证、下载错误波形和生成报告。

你可能感兴趣的:(Perl面向对象与面向过程的思考)