最近学习Perl OO, MetaClass 相关的模块,简单的分析一下Class::Accessor 这个模块。
功能:
自动实现字段的存取定义函数。
示例:
package Foo;
use base qw(Class::Accessor);
Foo->follow_best_practice;
Foo->mk_accessors(qw(name role salary));
#script body
use Data::Dumper;
$x = Foo->new({ name => "Marty", role => "JAPH", salary => 8000 });
$x->salary(9000);
print $x->name;
print Dumper $x
分析:
1. 用户使用函数:
mk_accessors
mk_ro_accessors
mk_wo_accessors
get/set
2. 内部调用关系
mk_accessors mk_accessor
mk_ro_accessors => _mk_accessors => mk_ro_accessor => get/set
mk_wo_accessors mk_wo_accessor
_mk_accessors 将为每个属性(name)添加如下两个函数并插入模块的符号表中,实际他们指向相同的函数,后者只是作为兼容使用而已。
1) name 闭包,读写都是这个函数调用负责get/set来完成
2) _name_accessor
如果使用follow_best_practice,则函数名字变为如下两个,分别负责读写操作,也分别对应mk_ 函数
1) get_name 对应mk_ro_accessor
2) set_name 对应mk_wo_accessor
最后调用的还是get/set函数,而对read/write 控制实际是掌握在mk_ro_accessor/mk_wo_accessor 中。
小结:
对于这个模块,只是简单的实现了字段的读取函数,虽然可以通过函数实现只读或者只写,但实际通过直接hash来提取,修改或者添加,删除属性都是可以的,认识到模块的功能和不足可以更加方便的使用之。
功能:
自动实现字段的存取定义函数。
示例:
package Foo;
use base qw(Class::Accessor);
Foo->follow_best_practice;
Foo->mk_accessors(qw(name role salary));
#script body
use Data::Dumper;
$x = Foo->new({ name => "Marty", role => "JAPH", salary => 8000 });
$x->salary(9000);
print $x->name;
print Dumper $x
分析:
1. 用户使用函数:
mk_accessors
mk_ro_accessors
mk_wo_accessors
get/set
2. 内部调用关系
mk_accessors mk_accessor
mk_ro_accessors => _mk_accessors => mk_ro_accessor => get/set
mk_wo_accessors mk_wo_accessor
_mk_accessors 将为每个属性(name)添加如下两个函数并插入模块的符号表中,实际他们指向相同的函数,后者只是作为兼容使用而已。
1) name 闭包,读写都是这个函数调用负责get/set来完成
2) _name_accessor
如果使用follow_best_practice,则函数名字变为如下两个,分别负责读写操作,也分别对应mk_ 函数
1) get_name 对应mk_ro_accessor
2) set_name 对应mk_wo_accessor
最后调用的还是get/set函数,而对read/write 控制实际是掌握在mk_ro_accessor/mk_wo_accessor 中。
小结:
对于这个模块,只是简单的实现了字段的读取函数,虽然可以通过函数实现只读或者只写,但实际通过直接hash来提取,修改或者添加,删除属性都是可以的,认识到模块的功能和不足可以更加方便的使用之。