Sim*_*mon 41 oop perl moose perl-mouse
我仍然是Perl Programming的新手,但我知道Perl 5 OO是如何工作的.但是,我从未用Perl 5 OO创建任何项目,所以我很确定我会遇到很多陷阱.
最近我发现了关于Moose模块的炒作.我查看了一些关于CPAN的文档,我发现它非常有趣并且帮助我作为开发人员.此外,它似乎非常稳定和可靠.
我是否应该加强使用基本的Perl 5 OO语法,直到我对它非常熟悉(知道阶段背后发生了什么),或者您认为我应该继续使用Moose直接开始开发应用程序?或者我应该试试鼠标吗?
对此有任何想法和经验表示赞赏.
提前致谢!
per*_*rin 37
正如其他人已经指出的那样,学习Perl中的OO如何完成的基础知识将帮助你,不仅是大多数非驼鹿包,而且还有Moose本身,因为内心深处Moose基本上只使用标准的Perl OO布局.基本上一旦你感到舒服,你就会明白Moose :: Manual :: Unsweetend显示你将对Perl中的面向对象原则有一个合理的把握.Damian Conway的面向对象Perl书籍是对象定位时期的精彩介绍,而不仅仅是Perl的风格.我强烈建议阅读它,或者至少是它的前半部分.
最后没有理由使用Mouse(Moose的替代品),除非你分为两个非常具体的类别,你有硬启动时间限制或硬依赖要求.如果你不属于这两个地方,穆斯几乎总是一个更好的答案.
披露:我是Moose的核心开发人员,并与Mouse合作过.
bri*_*foy 32
Perl世界的大部分都不是Moose,因此您仍然需要使用所有其他模块的基础知识.
Sch*_*ern 28
恕我直言,我会先学习穆斯.为什么?是的,大多数Perl OO都没有完成Moose.是的,穆斯很慢(虽然尝试鼠标).是的,有很多实际的原因可以解释为什么你最终必须学会以艰难的方式去做.但有一个最重要的原因.
因为Perl做OO的方式会扭曲你的大脑.
重点是要学习优秀的OO,而不是Perl的OO.一旦您将OO编程理解为概念,您就可以将该技术应用于任何特定语言.相反的情况并非如此.
Perl的股票OO并没有给你太多的帮助.你必须自己制作所有作品.你必须学习一切如何运作的所有细节.它教你破碎的概念,如"对象只是魔术哈希引用"和"方法只是子程序,其中$ self作为第一个参数","类只是包".简而言之,Perl OO教你注意一切是如何工作的,这是OO应该如何工作的完全对立面.
OO并不关心事情如何运作的细节.一个对象的重点是你要求做的事情,而你不关心它是如何做到的.一个好的对象就像一个好的看门人.你让看门人打扫地板,然后走开.当你回来时,地板被清理干净.如果看门人使用拖把,牙刷,舌头或撕毁整个地板并安装新的地板并不重要.地板很干净,这一切都很重要.
此外,关于构建Perl为您提供开箱即用的对象的唯一方法是继承.继承是每个人在学习面向对象及其危险和心灵翘曲时首先学到的东西.OO是面向对象的,而不是面向继承的.重要的是对象的封装,而不是你可以共享代码.一个有继承的新手程序员就像给宝宝开枪一样.多重继承就像给他们一个榴弹炮.新手立即跳跃到继承并创造了纠结的层次结构.他们从不了解委托或组合或角色或混合或任何半打更好的方式让对象共享和构建行为.
Moose为您提供开箱即用的所有功能,因此您可以专注于编写对象而不是编写OO系统.
一旦你学会了如何做OO,你就可以学习Perl的OO以及如何做到其他二十种方式,其中十二种错误.
jro*_*way 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.';
Run Code Online (Sandbox Code Playgroud)
请注意,Perl的实现细节不再有争议.您可以轻松担心程序的细节,而不是如何在Perl中执行OO.您甚至不必创建"Point.pm"文件,您可以将类定义内联.
我也认为几乎所有程序员都可以理解这段代码 - 即使是那些不熟悉Perl或Moose(或MooseX :: Declare)细节的程序员.
(顺便说一句,这个例子在方法签名中使用了":"语法有点奇怪.通常,你得到一个自己的实例,称为$ self作为第一个arg.如果你在签名之前提供其他东西:可以改变变量的类型和名称.我还写了"new_from_ordered_pair",这样你就不必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
Run Code Online (Sandbox Code Playgroud)
您可以免费获得所有这些,并且可以更轻松地调试程序.没有理由避免它,它真的让编程更加愉快(它使你的程序更可靠......免费!)
哦,还有一件事.使用Moose,您可以反省您的课程.这可能并不重要,但它可能很好.打开Devel :: REPL,输入'do"test.pl"'加载Point类,然后说出类似:
map { $_->name } Point->meta->get_all_attributes;
Run Code Online (Sandbox Code Playgroud)
结果是['x', 'y'].没有源代码,您可以找出该类具有的属性.尝试使用"普通"Perl OO.(这种东西使得富有的MooseX ::命名空间成为可能.你可能不需要内省,但你将享受使用CPAN可靠模块的能力.)
Que*_*tin 18
穆斯很好,但是关于学习它的决定取决于你的目标是什么.
如果你只是想用OO技术编写你自己的程序,那么很有可能值得深入了解Moose(后来担心其他的OO技术)
如果你想成为"Perl程序员",那么你会遇到更多的非Moose OO代码,然后是Moose OO代码,所以你应该学会在没有Moose的情况下处理编码.我建议Damian Conway的Object Oriented Perl作为一个很好的起点.
ste*_*own 10
首先要熟悉基础知识.除非你已经完成了很多OO JavaScript,否则OO Perl看起来有点奇怪,而Moose或其他任何库所做的一些事情看起来都很奇怪.
我已经开始使用Moose并且喜欢它.我同意其他帖子说你还应该学习如何做OO perl w/o Moose.但这往往很困难,你可以通过很多方式去做.我想如果你要开始一个新项目,那么Moose就是你要走的路.
我也使用了Object :: InsideOut,它与Moose很像,也有助于保护你的对象变量不被篡改.
另外一点,我知道Perl 6对象会像Moose对象一样..所以学习Moose会为Perl 6做准备.