我有一个 Perl 库,它在运行期间使用一些(大约 3 或 4 个)类的许多对象。
在测试代码中,我想确保它不会太多(我不是在谈论内存泄漏,我知道如何检查)。为此,我想我可以计算每个使用的对象并检查测试数据运行期间使用的最大值。然后,我会将获得的数字与一些关于库应该使用多少对象的猜测进行比较。
但是,我在实现时遇到了问题。我想到了两种可能的方式:
拦截
Package::new
和Package::DESTROY
。但是,这有一个小问题,即在那个包中,new
并不总是返回一个新对象。有时,它会使用一个预先存在的对象(对象用作不可变对象(immutable对象),因此应该无关紧要)。所以我必须跟踪每个单独的对象以查看它之前是否存在。拦截
Package::bless
和Package::DESTROY
。这应该可行,但似乎有点不正统。
问题是,这些方法中哪一种更有可能成功(可能是在类似情况下常用的方法),其次,我什至如何实现第二种方法(我是否必须重写 Package::祝福
所有有问题的包或只有基类等)。
最佳答案
尝试这样的事情(未测试):
my $Package_objects = {};
my $override_new = *Package::new{CODE};
*Package::new = sub {
my $self = $override_new->(@_);
# Interpolate $self as string to get "HASH(0x12345)"; save package name
$Package_objects->{ "$self" } = 'Package';
return $self;
};
my $override_dest = *Package::DESTROY{CODE};
*Package::DESTROY = sub {
delete $Package_objects->{ "$_[0]" };
$override_dest->(@_);
};
可能这是最野蛮的方法,但必须在没有第 3 方模块的情况下工作;)
关于perl - 修补一个类以计算创建对象的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215071/