对象而不是Perl中的全局变量

时间:2011-01-17 04:24:17

标签: perl oop

我不知道这是否正确。但是我想看有关使用对象而不是全局变量来存储状态的教程/文章。例如。

package something
# some code here... 
# that generates errors and uses
# something::errors to track errors. 


package something::errors
sub new {
    my ($this) = @_;
    bless $this;
    return $this; 
}
sub setErrors{ 
    my ($this, @errors) = @_;
    $this->{errors} = \@errors;
}
sub getErrors{
    my ($this) = @_;
    return $this->{errors};         
} 

这比使用全局变量更好吗?对此有何不妥?任何可能更好的方法?

感谢。

4 个答案:

答案 0 :(得分:2)

我希望这个答案对你有用,即使这是一个非常抽象的评论,并不是非常关注你问题的具体细节。

IMO,对象最有用,因为它们提供了一种封装大量数据并将其绑定到一组行为的方法。

在代码中可以观察到一些线索,表明OOP可能是一个很好的方法:

  1. 许多采用同一组参数的子程序。
  2. 您正在处理3个或更多级别的非同质数据结构。
  3. 那么,所有(或大部分)你的潜艇都有3个或4个共同的参数吗?

    sub whiz {
        my ($foo, $bar, $baz, $pogo) = @_;
        # blah
    }
    
    sub bang {
        my ($foo, $bar, $baz, $whibble) = @_;
        # blah
    }
    
    sub fiz {
        my ($foo, $bar, $baz, $smot) = @_;
        # blah
    }
    

    如果您发现代码看起来像那样,那么$foo$bar$baz可能需要成为一个对象的一部分,该对象将所有混乱的东西组合在一个地方。

    也许你有一个看起来像这样的大数据或状态对象:

    {   Foo => [ { a => 1, z => 3 }, [qw( milk milk lemonade)], ],
        quack => { round => 'the', corner => [qw( fudge is made )] },
    ...
    }
    

    考虑将此结构分解为较小的相关,可命名的单位。这些是你的对象。

    看看这个结构:

    {   teacher => $miss_jones,
        students => [ $bobby, $suzy, $joseph, $jenny ],
        principal => $mr_goodcop,
        vice_principal => $mr_badcop,
        custodian => $mr_mopitup,
    }
    

    想象一下,每个变量都被扩展为自己拥有的变量。一些存在于所有变量中,另一些存在于某些条目子集中。但如果$ miss_jones在班级$老师中,我们可以拨打$miss_jones->add_student( $bobby ),而不必担心老师如何存储学生。

    这些是我用来确定何时使用OOP的原则。

答案 1 :(得分:2)

你需要一个教程吗?你知道Perl有一堆乱七八糟的教程而不是你可以动摇一下吗?

输入此命令:

$ perldoc perl
[... a bunch of stuff]
Tutorials

    perlboot            Perl OO tutorial for beginners
    perltoot            Perl OO tutorial, part 1
    perltooc            Perl OO tutorial, part 2
    perlbot             Perl OO tricks and examples

妙的?

您只需要运行:

$ perldoc perlboot

查看特定教程。如果您希望通过网页结帐,请在线Perl documentation

而且,他们说Perl很难。毕竟,Unix带有内置文档,有多难?

顺便说一句,Perl对象并不是那么难以使用或理解。而且,它们确实有助于清理代码。如果您正在使用散列哈希值,数组数组或散列哈希值或哈希数组的散列数组,那么您应该使用面向对象的Perl。


提示!

查看state variables上的最新Perl文档。它完全符合您的要求。

答案 2 :(得分:1)

好吧,你的软件包仍然需要某种(可能是全局的)变量来祝福并在将来的方法调用中用作参数#1,所以我不知道这在这方面如何改进。 IOW您需要一个全局变量,无论您是将错误存储在普通全局数组中还是使用something::errors对象来保存它们。

虽然使用该对象不会影响您是否需要保持全局状态,但它确实意味着您可以控制哪些操作可以更精细地执行,这对维护很有帮助。 (维护是关于将任何给定代码段的可能行为限制为可管理的大小。)

我认为重要的问题是:“这个错误列表是否会与普通数组完全不同,以证明使用特殊类型?”如果您所拥有的唯一操作是setErrors()getErrors(),并且您预计在setErrors()通话期间不会进行任何过滤/处理,那么我会说“不”,因为这些操作它们足够强大,可以让你做任何你可以用普通阵列做的事情,所以它们不提供任何“安全”。另一方面,如果您希望避免从列表中意外删除错误的可能性,则可以使用addErrors()方法而不是setErrors()方法,您现在可以更有说服力地争辩说有使用单独的类型有一些好处。

答案 3 :(得分:1)

  

任何可能更好的方法?

参见Perl Best Practices第13章为何以及如何使用适当的例外情况。此主题也反复出现在Stack Overflow上:Google searchSO searchSO tags