加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

对于不再在Perl中使用的对象,我该怎么办?

发布时间:2020-12-15 23:24:46 所属栏目:大数据 来源:网络整理
导读:我正在编写一个链接到外部资源的类.其中一种方法是破坏外部资源的删除方法.不应该对该对象进行进一步的方法调用.如果设置了标志,我想在所有方法中设置一个标志和死亡,但是有更好,更简单的方法吗?可能涉及DESTROY的东西? 到目前为止,我真的很喜欢Axeman的建
我正在编写一个链接到外部资源的类.其中一种方法是破坏外部资源的删除方法.不应该对该对象进行进一步的方法调用.如果设置了标志,我想在所有方法中设置一个标志和死亡,但是有更好,更简单的方法吗?可能涉及DESTROY的东西?

到目前为止,我真的很喜欢Axeman的建议,但使用AUTOLOAD是因为我懒得重新创建所有方法:

#!/usr/bin/perl

use strict;
use warnings;

my $er = ExternalResource->new;

$er->meth1;
$er->meth2;

$er->delete;

$er->meth1;
$er->meth2;

$er->undelete;

$er->meth1;
$er->meth2;

$er->delete;

$er->meth1;
$er->meth2;
$er->meth3;

package ExternalResource;

use strict;
use warnings;

sub new {
    my $class = shift;
    return bless {},$class;
}

sub meth1 {
    my $self = shift;
    print "in meth1n";
}

sub meth2 {
    my $self = shift;
    print "in meth2n";
}

sub delete {
    my $self = shift;
    $self->{orig_class} = ref $self;
    return bless $self,"ExternalResource::Dead";
}

package ExternalResource::Dead;

use strict;
use Carp;

our $AUTOLOAD;
BEGIN {
our %methods = map { $_ => 1 } qw/meth1 meth2 delete new/;
}
our %methods;

sub undelete {
    my $self = shift;
    #do whatever needs to be done to undelete resource
    return bless $self,$self->{orig_class};
}

sub AUTOLOAD {
    my $meth = (split /::/,$AUTOLOAD)[-1];
    croak "$meth is not a method for this object"
        unless $methods{$meth};
    carp "can't call $meth on object because it has been deleted";
    return 0;
}

解决方法

简单地将对象视为无效状态是否存在问题.如果用户坚持下去,那不就是他们的问题吗?

以下是一些注意事项:

>你已经决定是否值得死了吗?
>如果你有一个足够封装的函数,你可能真的不希望让用户解析你的代码.为此,你可能不想使用我称之为Go-ahead-and-it-it-fail模式. ‘无法调用方法“do_your_stuff”对于未定义的值’可能无法用于封装目的.除非你告诉他们“嘿你删除了对象!

以下是一些建议:

>您可以将对象重新编入一个类,其唯一的工作是指示无效状态.它具有相同的基本形式,但表中的所有符号都指向一个只是说“抱歉不能这样做,我已经关闭(你关闭我,记得吗?)”的子.
>您可以在删除中取消$_ [0].然后他们从代码中的一行得到一个很好的“无法调用方法”read_from_thing“on undefined value” – 前提是他们没有经过精心设计的装饰或委托过程.但正如混乱所指出的那样,这并没有清除多个参考文献(因为我已经通过下面的示例代码进行了调整以显示).

一些概念证据:

use feature 'say';

package A;

sub speak { say 'Meow!'; }

sub done { undef $_[0]; }

package B;

sub new { return bless {},shift; }

sub speak { say 'Ruff!' }

sub done { bless shift,'A'; }

package main;

my $a = B->new();
my $b = $a;

$a->speak(); # Ruff!
$b->speak(); # Ruff!
$a->done();
$a->speak(); # Meow!
$b->speak(); # Meow! <- $b made the switch
$a->done();
$b->speak(); # Meow!
$a->speak(); # Can't call method "speak" on an undefined value at - line 28

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读