我希望您分享一下您使用库(或应用程序)的不同组件使用某些公共对象的经验。我想明白,哪种做法更好,哪种方式更具生态性#34;
让我们想象一下,我们有一些由一堆类组成的复杂库:Library
,Library::Foo
,Library::Foo::Bar
和许多其他类。使用该库的应用程序初始化一个Library
- 被分类的对象,在某个阶段,该对象初始化一些数量的Library::Foo
- 被分类的对象,它们初始化Library::Foo::Bar
- 被分类的对象,等等。 / p>
现在让我们想象所有组件都在使用Library::Logger
类。它只被Library
类的构造函数初始化一次,所有其他子类都需要它来进行日志记录。
问题是:如何让他们都有这个对象的引用?
我看到以下方法来实现它:
当基于Library
的对象初始化Library::Foo
- 对象时,它会将对记录器的引用作为参数传递给新创建的对象:
$self->_set_logger(Library::Logger->new());
my $logger = $self->_get_logger;
my $foo = Library::Foo->new(logger => $logger);
因此,Library::Foo
- 被分类的对象可以获取记录器,甚至在需要时将其传递给Library::Foo::Bar
分类对象:
my $logger = $self->_get_logger;
my $bar = Library::Foo::Bar(logger => $logger);
当基于Library
的对象初始化基于Library :: Foo的对象时,它会将引用传递给自己到新创建的对象:
$self->_set_logger(Library::Logger->new());
my $foo = Library::Foo->new(papa => $self);
所以基于Library::Foo
的对象可以这样访问记录器:
$my logger = $self->_get_papa->_get_logger;
my $bar = Library::Foo::Bar(papa => $self);
它破坏了封装,但它也允许基于Library::Foo
的对象从其" papa"中获取其他数据。
此外,我们可以将记录器的引用存储在某个全局变量中,因此任何其他对象都可以通过这种方式访问它:
$logger = $Library::_LOGGER;
嗯,真的很糟糕,我知道...... :)。
那么,您怎么看?哪种方式似乎更好?你会提出什么替代方案?你如何为自己解决这个问题?你会把数据传递给"孩子"手动或您是否允许它从"父母"?
获取数据非常感谢提前!
答案 0 :(得分:0)
您的问题没有答案。它实际上取决于您的确切用例。如果(只是猜测)你只想在你的库中只有一个Logger,我认为使用“singleton”的软件模式可能完全适合。 E.g。
package Library::Logger;
use strict;
my $logger;
sub new {
unless ($logger) {
.... initializing $logger ...
}
return $logger;
}
并在每个子类中,您可以通过
访问它Library::Logger->new()->...
HTH 乔治