我不知道这是否正确。但是我想看有关使用对象而不是全局变量来存储状态的教程/文章。例如。
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};
}
这比使用全局变量更好吗?对此有何不妥?任何可能更好的方法?
感谢。
答案 0 :(得分:2)
我希望这个答案对你有用,即使这是一个非常抽象的评论,并不是非常关注你问题的具体细节。
IMO,对象最有用,因为它们提供了一种封装大量数据并将其绑定到一组行为的方法。
在代码中可以观察到一些线索,表明OOP可能是一个很好的方法:
那么,所有(或大部分)你的潜艇都有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 search,SO search,SO tags