GWA2-Perl的面向对象方法中数组或哈希列表参数传递问题

最近基于 GWA2-Perl 生造了一个机器学习中的线性回归的轮子,纯手工地模拟了一个预测模型的各个模块和步骤。

GWA2的Perl版本继承和实现了GWA2的设计规范和风格,在充分利用Perl的面向对象设计思想及实现时,有些颇为吊诡的地方,应该引起注意,其中方法的参数传值问题就容易引起误解,我们在此前一篇的Blog中曾经谈到按引用传参和按值传参:

GWA2-Perl Warning: Reference found where even-sized list expected, -R/32SJ 。

 

如下是一个具体使用GWA2的Perl版本进行软件编程时,使用Array 或者 Hash进行传值时的正确写法的实例,供后续编程者参考。

正确的做法示例如下。
(A) ctrl/myctrl.pl:
….
my $obj = mod::MyModule->new();
my @arr = (1..5); # array original
my $i = 2;
my $rtn = $obj->getNumberByIndex(\@arr, $i); # pass by reference
….

(B) mod/MyModule.pm:
….
sub getNumberByIndex {
    my $self = $_[0];
    my @arr = @{$_[1]}; # de reference, restore array
    my $i = $_[2];
    ….

}

另外值得注意的是,按引用传递参数,其本身的设计与OOP思想是不相兼容的,在GWA2架构设计中并未充分考虑到,某一变量经由方法传递参数时,其默认行为是参数为局部变量,是按传值进行,也即,所传入的参数在当前方法体内可能产生变化。此时,如果是当做局部的按值传递的,不会影响到方法体外部,而理论上也不应该影响到方法体外部;然而,如果是按引用传递参数,在方法体内修改了引用所指向的参数,则该参数就会发生变化,如果在方法体外的某处有同时引用行为,则系统就可能出现异常、非预期情况。

这一问题,有望在Perl的后续版本中得到解决。目前,在OOP的架构设计中,如果不按引用进行参数传递,而是按照数值进行传递,如上面的代码修改为如下:

my $rtn = $obj->getNumberByIndex(@arr, $i); # pass by value, ERROR!

则可能导致,在 mod/MyModule.pm 中收到参数是一个将 @arr 的元素和 $i 混装的 list 列表,从而导致无法确切区分出第一个参数是一个 @arr , 而第二个参数是一个 $i . 后续也可能出现异常、非预期的情况。其他对Perl的OOP封装的框架是否很好解决这个问题,有待继续探索。

 

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

 

此条目发表在-GWA2, 编程技术, 计算机技术分类目录,贴了, , , , , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code