42

我对 Perl 编程还比较陌生,但我知道 Perl 5 OO 的基本工作原理。然而,我从来没有用 Perl 5 OO 创建过任何项目,所以我很确定我会遇到很多陷阱。

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

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

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

提前致谢!

4

11 回答 11

38

正如其他人指出的那样,学习如何在 Perl 中完成 OO 的基础知识将对您有所帮助,不仅适用于大多数非 moose 包,而且适用于 Moose 本身,因为 Moose 基本上只使用标准的 Perl OO 布局。基本上,一旦你感到舒服,你就会明白Moose::Manual::Unsweetend所展示的内容,你将合理地掌握 Perl 中的 OO 原则。Damian Conway 的 Object Oriented Perl 书是对面向对象时期的出色介绍,而不仅仅是 Perl 的风格。我强烈建议阅读它,或者至少阅读它的前半部分。

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

披露:我是 Moose 的核心开发人员,曾与 Mouse 一起工作过。

于 2009-06-11T16:17:29.783 回答
32

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

于 2009-06-11T12:22:35.433 回答
30

恕我直言,我会先学习 Moose。为什么?是的,大多数 Perl OO 还没有完成 Moose。是的, Moose 很慢(尽管尝试Mouse)。是的,有很多实际原因说明你最终必须学会以艰难的方式去做。但有一个压倒一切的原因。

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

关键是要学习好的 OO,而不是 Perl 的 OO。一旦您将 OO 编程理解为一个概念,您就可以将该技术应用于任何特定语言。反过来则不然。

Perl 的股票 OO 并没有给你太多。你必须自己建造所有的作品。你必须了解一切如何运作的所有小细节。它教给你一些破碎的概念,比如“对象只是魔术哈希引用”和“方法只是以 $self 作为第一个参数的子例程”和“类只是包”。简而言之,Perl OO 教你注意一切是如何工作的,这与 OO 的工作方式完全相反。

OO 是关于不关心事物如何工作的细节。一个对象的全部意义在于它是你要求做的事情,而你并不关心它是如何做到的。一个好的对象就像一个好的看门人。你让看门人打扫地板,然后你就走开了。当你回来时,地板已被清理干净。看门人是否使用拖把、牙刷、他们的舌头或撕毁整个地板并安装一个新的都没有关系。地板很干净,这才是最重要的。

此外,Perl 为您提供开箱即用的组合对象的唯一方法是继承。继承是每个人在学习 OO 及其危险和思维扭曲时首先学习的东西。OO 是面向对象的,而不是面向继承的。重要的是对象的封装,而不是可以共享代码。一个有继承的新手程序员就像给婴儿一把枪。多重继承就像给他们一个榴弹炮。新手立即跳到继承,并创造了巨大的纠结的层次结构。他们从不了解委托或组合、角色或混合,或者让对象共享和构建行为的六种更好的方法中的任何一种。

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

一旦你学会了如何正确地做 OO,那么你就可以学习 Perl 的 OO 以及如何用其他 20 种方法来做,其中有 12 种是错误的。

于 2009-06-12T04:38:26.680 回答
21

老实说,我不确定 Perl 的原始 OO 原语的知识对于编写新代码有多大价值。我已经很长时间没有在我的代码中使用@ISA 或“使用基础”或“祝福”了;我做的任何 OO 都是通过 Moose MOP。(当然,我会使用 rebless 实例,但我使用 $meta->rebless_instance 而不仅仅是“bless”。更简洁!)

无论如何,我会先自学Moose。它很容易上手并立即获得成效,随着您对 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 的你自己的实例作为第一个参数。如果你在签名中的 : 之前提供其他东西,你可以更改变量的类型和名称。我还写了“new_from_ordered_pa​​ir”,这样您就不必x => $x, y => $y每次都输入新的参数。这只是我认为很好的糖;这里没有发生任何神奇的事情。)

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

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 的可靠模块的能力。)

于 2009-06-12T02:58:30.773 回答
18

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

如果您只想使用 OO 技术编写自己的程序,那么非常值得深入研究 Moose(稍后再担心其他 OO 技术)

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

于 2009-06-11T13:36:27.300 回答
10

首先熟悉基础知识。除非你做过很多 OO JavaScript,否则 OO Perl 看起来会有点奇怪,Moose 或任何其他库所做的一些事情可能看起来很奇怪。

于 2009-06-11T12:20:50.463 回答
5

我已经开始使用 Moose 并且非常喜欢它。我同意其他帖子说您仍然应该学习如何在没有 Moose 的情况下使用 OO perl。但这往往很困难,有很多方法可以做到这一点。我认为如果您要开始一个新项目,那么 Moose 是您的最佳选择。

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

另一个注意事项,我知道 Perl 6 对象将很像 Moose 对象..所以学习 Moose 将为您准备 Perl 6。

于 2009-06-11T13:31:16.923 回答
4

这将是对 Schwern 帖子的评论,但它增长了。

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

我是“先学驼鹿”的一伙。对于我编写的那种代码(数据管理和简单的应用程序),我喜欢故意忽略 Perl OO 的细节,所以我倾向于将 Moose 用于所有事情,即使是我过去会通过程序完成的事情,因为它使编程的许多机制要容易得多

于 2009-06-12T08:53:35.663 回答
4

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

于 2011-08-05T03:20:53.817 回答
2

Moose 很有用,但您可能仍想了解 perl OO 以保护自己免受抽象泄漏问题的影响。

Perl OO 本身相当复杂,但这本书让它很容易理解:Intermediate Perl。强烈推荐。

于 2009-06-11T13:36:20.297 回答
2

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

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

于 2009-08-05T21:44:06.110 回答