Perl Class::Accessor 分析

最近學習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來提取,修改或者添加,刪除屬性都是可以的,認識到模塊的功能和不足可以更加方便的使用之。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章