我应该先学习Perl 5 OO还是Moose?
我还是比较新的Perl编程,但我知道Perl 5 OO基本上是如何工作的。 不过,我从来没有用Perl 5 OO创build任何项目,所以我很肯定我会遇到很多陷阱。
最近我发现了关于Moose模块的宣传。 我查阅了CPAN上的一些文档,发现它非常有趣,帮助我成为开发者。 此外,它似乎非常稳定和可靠。
我是否应该更加努力地使用基本的Perl 5 OO语法,直到我对它非常熟悉(要知道阶段背后发生了什么),还是您认为我应该继续使用Moose直接开始开发应用程序? 还是应该给老鼠一个尝试?
任何想法和经验,在此表示赞赏。
提前致谢!
正如其他人已经指出的那样,学习Perl中OO的基本知识将会帮助你,不仅在大多数非Moose包中,而且在Moose本身,因为内在的Moose基本上只是使用标准的Perl OO布局。 基本上,一旦你感到舒服,你就会明白Moose :: Manual :: Unsweetend显示了你对Perl中OO原理的合理掌握。 Damian Conway的面向对象的Perl书籍不仅是Perl的风格,而且是面向对象时期的绝佳介绍。 我强烈build议阅读它,或者至less是上半年。
最后没有理由使用鼠标 (Moose的替代品),除非你分为两个非常具体的类别,你很难启动时间限制或硬依赖性要求。 如果你不落在这两个地方,驼鹿几乎总是一个更好的答案。
披露:我是一个核心驼鹿开发者,并与鼠标工作。
大部分的Perl世界不是Moose,所以你仍然需要使用所有其他模块的基础知识。
恕我直言,我会首先学习穆斯。 为什么? 是的,大多数Perl OO没有做Moose。 是的,驼鹿很慢(尽pipe尝试鼠标 )。 是的,有很多实际的原因,为什么你将不得不最终学会如何做到这一点。 但是有一个压倒一切的原因。
因为Perl做OO的方式扭曲了你的大脑。
关键是要学好OO,而不是Perl的OO。 一旦你将OO编程理解为一个概念,你就可以将这个技术应用于任何特定的语言。 反过来并不是那么真实。
Perl的股票OO并没有给你太多的东西。 你必须自己制作所有的作品。 你必须学习一切工作的所有细节。 它教你破碎的概念,如“对象只是魔术哈希引用”和“方法只是$ self作为第一个参数的子例程”和“类只是包”。 简而言之,Perl OO教导你要注意如何运作,这是OO如何工作的真正对手。
面向对象不关心事情的工作细节。 一个客体的全部要点是你要做的工作,而不关心它是如何做的。 一个好的对象就像一个好的看门人。 你要求看门人打扫地板,然后走开。 当你回来时,地板被清理干净。 看门人是用拖把,牙刷,舌头还是撕掉了整个地板,并安装了一个新的。 地板很干净,而这一切都很重要。
此外,关于Perl给你开箱的唯一方法是inheritance。 inheritance是每个人在学习面向对象及其危险和头脑翘曲时首先学习的东西。 OO是面向对象的,而不是面向inheritance的。 重要的是对象的封装,而不是你可以共享代码。 一个有着inheritancefunction的新手程序员就像是给宝宝一把枪。 多inheritance就像给他们一个榴弹炮。 新手马上跳到inheritance,创造了很大的纠结的层次结构。 他们从来不知道授权或组成或angular色或混合或任何让对象分享和build立行为的更好的方法。
Moose给你提供了所有这些,所以你可以专注于写对象,而不是写OO系统。
一旦你已经学会了如何做OO,那么你可以学习Perl的OO,以及如何做其他十二种,其中十二种是错误的。
老实说,我不确定Perl的原始OO原语对于编写新代码有多宝贵的知识。 我很久没有在代码中使用@ISA或“使用基础”或“祝福” 我做的任何OO都是通过驼鹿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/xy/] => ( 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的实例作为第一个参数,如果你在签名之前提供了另一个:可以改变variables的types和名称,我也写了“new_from_ordered_pair”,这样你就不用每次都inputx => $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
你可以免费获得所有这一切,并且使你的程序更容易debugging。 没有理由避免它,它确实使编程更愉快(它使您的程序更可靠…免费!)
哦,还有一件事。 用麋,你可以反思你的课程。 这可能不是很重要,但它可以很好。 打开Devel :: REPL,input'do“test.pl”'加载Point类,然后说出如下所示的内容:
map { $_->name } Point->meta->get_all_attributes;
结果是['x', 'y']
。 没有源代码,你可以找出这个类有什么属性。 试试用“普通”的Perl OO来做到这一点。 (这种事情是使得丰富的MooseX :: namespace成为可能,你可能不需要自省,但是你可以享受使用CPAN可靠模块的能力。)
驼鹿是好的,但关于学习的决定取决于你的目标是什么。
如果你只是想用自己的OO技术来编写自己的程序,那么可以非常值得深入研究Moose(后来担心其他的OO技术)
如果你想成为“Perl程序员”,那么你会遇到更多的非Moose OO代码,然后Moose OO代码,所以你应该学会先处理没有Moose的编码。 我build议Damian Conway将Object Oriented Perl作为一个很好的起点。
先熟悉基础知识。 除非你做了很多的OO JavaScript,否则OO Perl会显得有点奇怪,而Moose或其他任何一个库的一些东西可能看起来更奇怪。
我已经开始使用Moose,并且喜欢它。 我同意其他职位说,你应该仍然学习如何做OO perl没有穆斯。 但这往往是困难的,有很多方法可以去做这件事。 我想如果你开始一个新的项目,那么穆斯是要走的路。
我还使用了Object :: InsideOut,这很像Moose,也有助于保护对象variables不被篡改。
另外需要注意的是,我知道Perl 6的对象和Moose对象很相似,所以学习Moose会为你准备好Perl 6。
在Moose之前学习Perl附带的OOP。 从长远来看,这会让你更容易。
这将是Schwern的职位的评论,但它增长。
我会说,驼鹿比“普通的”Perl OO慢,但首先这对于大多数代码(过早优化)来说不是非常重要,其次如果你做了__PACKAGE__->make_immutable
那么很多运行时开销都会被删除。
我与“学习驼鹿第一”的团伙。 我喜欢对Perl编写的代码细节(数据pipe理和简单的应用程序)保持任意的愚蠢,所以我倾向于使用Moose来处理所有的事情,甚至是过去我会做的事情,因为它使得很多编程的机制都比较容易
驼鹿是有用的,但你可能仍然想了解perl的OO适当,以保护自己泄漏的抽象问题 。
Perl OO本身是相当多毛的,但是这本书使得它很容易消化: 中级Perl 。 强烈推荐。
上面有很多有用的答案。 我唯一可以补充的是,Moose手册现在可以作为一本书或PDF购买。 如果您正在学习或者仅仅使用Moose,那么这是一本非常有用的参考指南,并且以漂亮的版式印刷。
- 驼鹿手册 – 印刷的书
披露:我们创造了这本书(猴先生),虽然我们没有写(Dave Rolsky和Stevan Little)。