perl - 修补一个类以计算创建对象的数量

标签 perl oop testing memory

我有一个 Perl 库,它在运行期间使用一些(大约 3 或 4 个)类的许多对象。

在测试代码中,我想确保它不会太多(我不是在谈论内存泄漏,我知道如何检查)。为此,我想我可以计算每个使用的对象并检查测试数据运行期间使用的最大值。然后,我会将获得的数字与一些关于库应该使用多少对象的猜测进行比较。

但是,我在实现时遇到了问题。我想到了两种可能的方式:

  • 拦截 Package::newPackage::DESTROY。但是,这有一个小问题,即在那个包中,new 并不总是返回一个新对象。有时,它会使用一个预先存在的对象(对象用作不可变对象(immutable对象),因此应该无关紧要)。所以我必须跟踪每个单独的对象以查看它之前是否存在。

  • 拦截 Package::blessPackage::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/

相关文章:

perl - Cannot 'cleartool setview' 在使用 Perl IPC::open2 打开的 shell 进程中

ios - 如何在子类中重新实现属性 getter 方法?

oop - 单元测试不同的类层次结构

c# - 在 C# 中使用 FakeItEasy 伪造 INI 配置文件设置

java - 如何将 @SpringBootTest(webEnvironment) 与 @DataJpaTest 一起使用?

linux - perl one liner + 如何在 perl line liner 上给出标准输出

perl - 在 Perl 中处理时间数学的最佳方法是什么?

perl - "Invalid argument"在 perl 中使用 3 部分打开时

java - 新的 Obj,总是还是有时?

php - 在实现 API 时应该信任其他开发人员吗?