从另一个对象访问对象

时间:2016-11-13 20:56:21

标签: perl oop parameter-passing encapsulation

我希望您分享一下您使用库(或应用程序)的不同组件使用某些公共对象的经验。我想明白,哪种做法更好,哪种方式更具生态性#34;

让我们想象一下,我们有一些由一堆类组成的复杂库:LibraryLibrary::FooLibrary::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;

嗯,真的很糟糕,我知道...... :)。

...

那么,您怎么看?哪种方式似乎更好?你会提出什么替代方案?你如何为自己解决这个问题?你会把数据传递给"孩子"手动或您是否允许它从"父母"?

获取数据

非常感谢提前!

1 个答案:

答案 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 乔治