【问题标题】:What is the right way to write a wrapper module for conditional OO module loading?为条件 OO 模块加载编写包装器模块的正确方法是什么?
【发布时间】:2014-03-17 21:41:42
【问题描述】:

我应该使用哪种方式?

package My_Module;

# way one
my $package = $^O eq 'MSWin32' ? 'My_Module::Win32' : 'My_Module::Linux';
sub new {
    my $class = shift;
    return $package->new( @_ );
}

# way two
use parent $^O eq 'MSWin32' ? 'My_Module::Win32' : 'My_Module::Linux';

【问题讨论】:

  • 两者都不是。 My_Module 对象应包含 My_Module::Win32 或 My_Module::Linux 对象。

标签: perl oop portability perl-module overhead


【解决方案1】:

我个人会采用第一种技术。创建一个有时从一个父级继承,有时从另一个父级继承的类,对我来说似乎有点脏。它肯定会工作,但它会混淆类分析工具(如Pod::Coverage::CountParents)。

也就是说,我可能会将sub new 重命名为new_by_platform。强烈期望My_Module->new 将返回My_Module 类型的对象。让它返回另一个类的对象可能会使人们感到困惑。 (虽然如果My_Module::Win32My_Module::Linux 继承自My_Module,那么将其命名为new 似乎就不那么糟糕了。)

【讨论】:

    【解决方案2】:

    2 - 使用 parent 是更好的方法。

    http://lo-f.at/glahn/2009/08/useBaseAnduseParent.html

    【讨论】:

    • use parent 不像use base 那样笨拙,当然,但这根本不能回答问题。这个问题没有提到use base。问题是将使用“工厂类”与使用继承进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多