Perl的面向对象接口是否有意义,如果他们不创建对象?

Geo*_*Geo 2 oop perl

我想我在某处读到某些模块只有面向对象的接口(虽然它们没有创建对象,但它们只保存了实用程序功能).有没有意义呢?

der*_*ert 8

首先,重要的是要记住,在Perl中,类是通过包以奇怪的方式实现的.包也用于一般名称空间污染预防.

package Foo;

sub new {
  my ($class) = @_;
  my $self = bless {}, $class;

  return $self;
}

1;
Run Code Online (Sandbox Code Playgroud)

这就是你如何在Perl中创建一个Foo类(可以通过调用Foo-> new或new Foo来实例化对象).使用new只是一种惯例; 它可以是任何东西.实际上,这new就是C++所谓的静态方法调用.

您可以轻松创建仅包含静态方法调用的包,我怀疑这是您所指的.这里的优点是你仍然可以使用继承等OO功能:

package Bar;

sub DoSomething {
    my ($class, $arg) = @_;
    $class->Compute($arg);
}

sub Compute {
    my ($class, $arg) = @_;
    $arg * 2;
}

1;

package Baz;
@Baz::ISA = qw(Bar);

sub Compute {
    my ($class, $arg) = @_;
    $arg * 2 - 1
}

1;
Run Code Online (Sandbox Code Playgroud)

鉴于此,那么

say Bar->DoSomething(3) # 6
say Baz->DoSomething(3) # 5
Run Code Online (Sandbox Code Playgroud)

实际上,您甚至可以使用变量作为类名,因此这些变量可以像单例一样运行:

my $obj = "Baz"; # or Baz->new could just return "Baz"
print $obj->DoSomething(3) # 5
Run Code Online (Sandbox Code Playgroud)

[代码未经测试; 错别字可能存在]


Mic*_*man 8

我怀疑这主要是作者喜欢OO和命令式编程的哲学选择.其他人已经提到建立命名空间,但它是执行该操作的包,而不是接口.OO不是必需的.

就个人而言,我认为创建从未实例化的类(即面向对象中没有对象时)的价值很小.Perl不是Java; 你不必为一切写一个班级.一些模块承认这一点.例如:File :: Spec有一个OO接口,但也通过File :: Spec :: Functions提供了一个功能接口.

File :: Spec还提供了一个示例,其中OO 用于未实例化的"实用程序"接口.从本质上讲,File :: Spec是一个抽象基类 - 没有实现的接口.当您加载File :: Spec时,它会检查您正在使用的操作系统并加载相应的实现.作为程序员,您可以使用界面(例如File::Spec->catfile),而无需担心catfile实际调用的是哪个版本(Unix,Windows,VMS等).