Moose OOP还是标准Perl?

时间:2011-06-17 22:14:27

标签: perl moose oop

我正在为一个网站编写一些抓取工具,我的想法是该网站将使用一些后端Perl脚本从其他网站获取数据,我的设计(以非常抽象的方式......)将写一个包,让我们说:

package MyApp::Crawler::SiteName

其中网站名称将是用于抓取特定网站的模块/包,我显然会有其他软件包在不同模块之间共享,但这里不相关。

无论如何,长话短说,我的问题是:为什么(或者为什么不......)我应该更喜欢Moose而不是Standard OO Perl?

谢谢,

5 个答案:

答案 0 :(得分:23)

虽然我不同意Flimzy的介绍(“我没有使用过Moose,但我使用了这个使用Moose的东西”),但我同意他的前提。

使用您认为可以产生最佳效果的内容。如果(或)目标是学习如何有效地使用Moose,那么使用Moose 。如果目标是产生良好的代码并且 学习Moose会分散注意力 ,那么就不要使用Moose。

然而,你的问题是开放性的(正如其他人指出的那样)。没有答案会被普遍接受为真,否则穆斯的采用率将会高得多,我不会回答这个问题。我真的只能解释为什么每次开始一个新项目时我选择使用Moose。

正如Sid引用Moose文档所述。 Moose的核心目标是成为一种更清晰,标准化的方式来完成自Perl 5.0发布以来面向对象的Perl程序员所做的事情。它提供了一些快捷方式,使做正确的事情比做错事更简单。在我看来,缺少标准Perl的东西。它提供了新的工具,可以将您的问题抽象为更简单,更容易解决的问题,并且它提供了一个强大的内省和元编程API,试图规范化从Perl空间攻击Perl内部的beastiary(即我曾经指的是作为符号表Witchery)。

自从我开始使用Moose [^ 1]以来,我发现自然感觉代码“太多”已经减少了66%。我发现我更容易遵循良好的设计原则,如封装和信息隐藏,因为Moose提供的工具使其更容易。因为Moose会自动生成我通常不得不写出的大部分样板(例如访问器方法,委托方法和其他类似的东西),我发现更容易快速掌握我六个月的工作速度前。我也发现自己编写的代码远不如几年前的几个键盘。

可以编写干净,健壮,优雅的Object Oriented Perl,它不使用Moose [^ 2]。根据我的经验,它需要更多的努力和自我控制。我发现在项目要求我不能使用Moose的那些场合,我的常规面向对象代码已经从我从Moose那里学到的习惯中受益。我想的就像我想用Moose编写它然后键入三倍的代码,因为我写下了我期望Moose会为我生成的[^ 3]。

所以我使用Moose是因为我发现它让我成为更好的程序员,因此我编写了更好的程序。如果你没有发现这对你来说也是如此,那么穆斯就不是正确的答案。

[^ 1]:当我在一个模块中达到~300行代码时,我常常开始考虑我的设计。现在我开始对~100行感到不安。

[^ 2]:Miyagawa在Twiggy的代码就是我今天读到的一个很好的例子。

[^ 3]:这不普遍。关于那些通过过度使用Moose提供的工具编写较少可维护,可怕代码的人,有几个故事。糟糕的程序员可以在任何地方写错代码。

答案 1 :(得分:10)

您可以在文档中找到使用Moose的答案。

  

Moose的主要目标是使Perl 5面向对象编程更容易,更一致,更少乏味。使用Moose,您可以更多地考虑您想要做什么,而不是考虑OOP的机制。

根据我的经验,可能其他人会告诉你同样的事情。 Moose极大地减少了你的代码大小,它有很多功能,只有标准功能,如验证,强制创建对象的值,延迟验证,默认值等等都是如此简单易读,你永远不会想念Moose。

答案 2 :(得分:3)

使用Moose。这是我昨晚写的(在这种情况下使用Mouse)。应该非常明显它的作用,它的验证以及它的设置。现在想象一下编写等效的原始OO。这并不是很难,但它确实开始变得更难以阅读,而不仅仅是代码本身,而是在阅读之前或之前没有见过的代码时最重要的部分意图。

has "io" =>
    is => "ro",
    isa => "FileHandle",
    required => 1,
    handles => [qw( sysread )],
    trigger => sub { binmode +shift->{io}, ":bytes" },
    ;

我去年写了一个大型测试类,它还使用handles功能将大量方法重新发送到底层Selenium / WWWMech对象。消失这种样板文件确实有助于提高可读性和维护性。

答案 3 :(得分:1)

我从未使用过Moose,但我使用过Catalyst,并且在使用OO Perl和非OO Perl方面拥有丰富的经验。我的经验告诉我,最好的方法是使用最方便的方法。

对我而言,这种方法已成为“催化剂以外的任何东西”:)(这并不是说那些喜欢和发誓催化剂的人都错了 - 这只是我的口味。)

如果您已经拥有可以构建的爬虫应用程序的核心,请使用它所写的任何内容。如果您从头开始,请使用您最有经验的任何内容 - 除非您有机会进行分支出去尝试新事物,然后通过各种方式完成你的任务,同时学习新东西。

我认为这只是“哪种语言最好?”的另一个例子。除了个人之外,它永远无法回答。

答案 4 :(得分:1)

当我在Perl中学习对象时,我首先想到的是,当Perl通常试图保持简单时,它是如此复杂。

使用Moose,我发现在Perl中可以实现简单的OOP。它将Perl的OOP恢复到可管理的水平。

(是的,我承认,我不喜欢perl的对象设计。)

相关问题