我应该先学习Perl 5 OO还是Moose?

时间:2009-06-11 12:13:08

标签: perl oop moose perl-mouse

我仍然是Perl Programming的新手,但我知道Perl 5 OO基本上是如何工作的。但是,我从未使用Perl 5 OO创建任何项目,所以我很确定我会遇到很多陷阱。

最近我发现了关于Moose模块的炒作。我查看了一些关于CPAN的文档,我发现它非常有趣并且帮助我作为开发人员。此外,它似乎非常稳定和可靠。

我是否应该加强使用基本的Perl 5 OO语法,直到我对它非常熟悉(知道阶段背后发生了什么),或者您认为我应该继续使用Moose直接开始开发应用程序?或者我应该试试鼠标吗?

对此有任何想法和经验表示赞赏。

提前致谢!

11 个答案:

答案 0 :(得分:37)

正如其他所有人都指出的那样,学习Perl中OO的基础知识将有助于你,不仅是大多数非驼鹿包,而且还有Moose本身,因为内心深处Moose基本上只使用标准的Perl OO布局。基本上,一旦你感到舒服,你就会明白Moose::Manual::Unsweetend所展示的内容,你将对Perl中的面向对象原则有一个合理的把握。 Damian Conway的面向对象Perl书籍是对象定位时期的精彩介绍,而不仅仅是Perl的风格。我强烈建议阅读它,或者至少是它的前半部分。

最后没有理由使用鼠标(Moose的替代品),除非你分为两个非常具体的类别,你有硬启动时间限制或硬依赖要求。如果你不属于这两个地方,穆斯几乎总是一个更好的答案。

披露:我是Moose的核心开发人员,并与Mouse合作过。

答案 1 :(得分:32)

Perl世界的大部分都不是Moose,所以你仍然需要使用所有其他模块的基础知识。

答案 2 :(得分:28)

恕我直言,我会先学习穆斯。为什么?是的,大多数Perl OO都没有完成Moose。是的,穆斯很慢(尽管尝试Mouse)。是的,有很多实际的原因可以解释为什么你最终必须学会以艰难的方式去做。但有一个最重要的原因。

因为Perl做OO的方式会扭曲你的大脑。

重点是要学习优秀的OO,而不是Perl的OO。一旦您将OO编程理解为概念,您就可以将该技术应用于任何特定语言。相反的情况并非如此。

Perl的股票OO并没有给你太多的帮助。你必须自己制作所有作品。你必须学习一切如何运作的所有细节。它教你破碎的概念,如“对象只是魔术哈希引用”和“方法只是子程序,其中$ self作为第一个参数”,“类只是包”。简而言之,Perl OO教你注意一切是如何工作的,这是OO应该如何工作的完全对立。

OO并不关心事情如何运作的细节。一个对象的重点是你要求做的事情,而你不关心它是如何做到的。一个好的对象就像一个好的看门人。你让看门人打扫地板,然后走开。当你回来时,地板被清理干净。如果看门人使用拖把,牙刷,舌头或撕毁整个地板并安装新的地板并不重要。地板很干净,这一切都很重要。

此外,关于构建Perl为您提供开箱即用的对象的唯一方法是继承。继承是每个人在学习面向对象及其危险和心灵翘曲时首先学到的东西。 OO是面向对象的,而不是面向继承的。重要的是对象的封装,而不是你可以共享代码。一个有继承的新手程序员就像给宝宝开枪一样。多重继承就像给他们一个榴弹炮。新手立即跳跃到继承并创造了纠结的层次结构。他们从不了解授权或组合或角色或混合或任何更好的方法让对象分享和建立行为。

Moose为您提供开箱即用的所有功能,因此您可以专注于编写对象,而不是编写OO系统。

一旦你学会了如何做OO,你就可以学习Perl的OO以及如何做到其他二十种方式,其中十二种错误。

答案 3 :(得分:21)

老实说,我不确定Perl的原始OO原语对于编写新代码有多么宝贵的知识。我很长时间没有在代码中使用@ISA或“使用base”或“bless”;我做的任何OO都是通过Moose MOP。 (当然,我确实对实例进行了报复,但我使用$ meta-> rebless_instance而不仅仅是“祝福”。更清洁!)

无论如何,我会首先自学穆斯。它很容易上手并立即提高工作效率,随着您对Perl和一般编程的熟练程度的提高,您可以了解详细信息。

举个例子:

#!/usr/bin/env perl

use strict;
use warnings;
use feature ':5.10'; # for 'say'

use MooseX::Declare;

class Point {
    has [qw/x y/] => ( is => 'ro', isa => 'Num', required => 1 );

    method new_from_ordered_pair(ClassName $class: Num $x, Num $y){
        return $class->new( x => $x, y => $y );
    }

    method distance(Point $a: Point $b){
        return sqrt( ($a->x - $b->x)**2 + ($a->y - $b->y)**2 );
    }

}

my $origin = Point->new_from_ordered_pair(0,0);
my $point  = Point->new_from_ordered_pair(3,4);

say '(3,4) is '. $point->distance($origin). ' units away from the origin.';

请注意,Perl的实施细节不再有争议。您可以轻松担心程序的细节,而不是如何在Perl中执行OO。您甚至不必创建“Point.pm”文件,您可以将类定义内联。

我也认为几乎所有程序员都可以理解这段代码 - 甚至是那些不熟悉Perl或Moose(或MooseX :: Declare)细节的程序员。

(顺便说一句,这个例子在方法签名中使用了“:”语法有点奇怪。通常,你得到一个自己的实例,称为$ self作为第一个arg。如果你在a:之前提供其他东西签名,你可以改变变量的类型和名称。我还写了“new_from_ordered_pa​​ir”,这样你就不必每次都输入x => $x, y => $y作为new的参数。这只是我觉得很好的糖;这里没有任何神奇的事情发生。)

最后,你在这里“免费”获得了很多。试试这些,并注意有用的错误消息:

Point->new; # x is required
Point->new_from_ordered_pair('foo', 'bar'); # x needs to be a number
$point->distance('some string'); # $b needs to be a Point

您可以免费获得所有这些,并且可以更轻松地调试您的程序。没有理由避免它,它确实使编程更加愉快(它使你的程序更可靠......免费!)

哦,还有一件事。使用Moose,您可以反省您的课程。这可能并不重要,但它可能很好。打开Devel :: REPL,输入'do“test.pl”'加载Point类,然后说出类似的内容:

map { $_->name } Point->meta->get_all_attributes;

结果是['x', 'y']。没有源代码,您可以找出该类具有的属性。尝试使用“普通”Perl OO。 (这种情况使得富有的MooseX ::命名空间成为可能。您可能不需要内省,但享受使用CPAN中可靠模块的能力。)

答案 4 :(得分:18)

穆斯很好,但是关于学习它的决定取决于你的目标是什么。

如果您只是想使用OO技术编写自己的程序,那么很有可能值得深入了解Moose(以后担心其他OO技术)

如果你想成为“Perl程序员”,那么你会遇到更多的非Moose OO代码,然后是Moose OO代码,所以你应该学会在没有Moose的情况下处理编码。我建议Damian Conway的Object Oriented Perl作为一个很好的起点。

答案 5 :(得分:10)

首先要熟悉基础知识。除非你已经完成了很多OO JavaScript,否则OO Perl看起来有点奇怪,而且Moose或其他任何库所做的一些事情看起来都很奇怪。

答案 6 :(得分:5)

我开始使用Moose并且喜欢它。我同意其他帖子说你还应该学习如何做OO perl w / o Moose。但这往往很困难,你可以通过很多方式去做。我想如果你要开始一个新项目,那么Moose就是你要走的路。

我还使用了Object :: InsideOut,它与Moose很像,也有助于保护你的对象变量不被篡改。

另外一点,我知道Perl 6对象会像Moose对象一样..所以学习Moose会让你为Perl 6做准备。

答案 7 :(得分:4)

这将是对Schwern职位的评论,但它的成长。

我会说moose比“普通”Perl OO慢,但首先这对大多数代码来说并不是非常重要(过早优化),其次如果你做__PACKAGE__->make_immutable那么就会删除很多运行时开销反正。

我和“学习麋鹿第一”团伙在一起。我喜欢对我编写的代码(数据管理和简单应用程序)的Perl OO细节一直无知,所以我倾向于使用Moose来处理所有事情,甚至过去我会在程序上做的事情,因为它使得很多编程的机制更容易

答案 8 :(得分:4)

在Moose之前了解Perl附带的OOP。从长远来看,这将使您更容易。

答案 9 :(得分:2)

Moose非常有用,但您可能仍希望了解perl OO,以保护自己免受leaky abstraction problem的攻击。<​​/ p>

Perl OO本身相当毛茸茸,但这本书很容易消化:Intermediate Perl。强烈推荐。

答案 10 :(得分:2)

上面有很多有用的答案。我唯一可以添加的是Moose手册现在可以作为书籍或PDF购买。如果您正在学习或只是使用Moose,它是一本有用的参考指南,并以漂亮的字体印刷。

披露:我们创作了这本书(猴子先生),虽然我们没有写它(那是Dave Rolsky 和Stevan Little)。