gpt4 book ai didi

perl - 如何在 Perl 和 Moose 中编写工厂代码?

转载 作者:行者123 更新时间:2023-12-04 01:33:06 24 4
gpt4 key购买 nike

有没有更简单或更好(=>更容易维护)的方式来使用 Perl 和 Moose 实例化基于传入数据的类?

以下代码是我正在处理的项目中的精简示例。

package FooBar;
use Moose;
has 'SUBCLASS' =>('isa'=>'Str',required=>'1',is=>'ro');
has 'MSG' =>('isa'=>'Str',required=>'1',is=>'ro');

sub BUILD {
my $self = shift;
my ($a)=@_;
bless($self,$a->{SUBCLASS})
}
sub Hi {
my $self=shift;
print "Hi, I'm a " . ref($self) ." and I say [". $self->MSG()."]\n";
}

package Foo;
use Moose;
extends ("FooBar");

package Bar;
use Moose;
extends ("FooBar");

package main;
use strict;
use warnings;

for my $line (<DATA>) {
my ($case,$msg)=split(/[\n\r,]\s*/,$line);
FooBar->new(SUBCLASS=>$case,MSG=>$msg)->Hi();
}
__DATA__
Foo, First Case
Bar, Second Case

编辑 : 当你调用 DBI 时,这让我很震惊。根据您传递的参数,它将使用完全不同的代码,同时保持(大部分)一致的界面

最佳答案

伊克。 Stevan 有一个非常有说服力的论点:new应该总是只
返回一个类的实例。其他任何事情都会让新人学习感到困惑
系统。

你可能想看看
MooseX::AbstractFactory .
如果这对您不起作用,那么:

package FooBar;
use Moose;

has [qw(SUBCLASS MSG)] => ( is => 'ro', required => 1);

sub create_instance {
return $self->package->new(message => $self->msg);
}

package FooBar::Object;
use Moose;

has msg => ( is => 'ro', required => 1);

sub Hi {
my $self = shift;
print "Hi, I'm a " . ref($self) ." and I say [". $self->MSG()."]\n";
}

package Foo;
use Moose;
extends qw(FooBar::Object);

package Bar;
use Moose;
extends qw(FooBar::Object);


package main;
or my $line (<DATA>) {
my ($case,$msg)=split(/[\n\r,]\s*/,$line);
FooBar->new(SUBCLASS=>$case,MSG=>$msg)->create_instance->Hi
}

__DATA__
Foo, First Case
Bar, Second Case

当然,还有许多其他方法可以在 Moose 中实现相同的概念。在不了解您的域问题的具体情况的情况下,很难说出 MooseX::Traits 之类的内容。不会更好:
package Foo;
use Moose;
with qw(MooseX::Traits);

package Bar;
use Moose;
with qw(MooseX::Traits);

package Messaging;
use Moose::Role;

has msg => ( is => 'ro', required => 1);

sub Hi {
my $self = shift;
print "Hi, I'm a " . ref($self) ." and I say [". $self->MSG()."]\n";
}

package main;
use strict;
Foo->with_traits('Messaging')->new( msg => 'First Case')->Hi;

这大致就是另一张海报关于使用基于角色的解决方案的意思。

关于perl - 如何在 Perl 和 Moose 中编写工厂代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1244228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com