Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该先学习Perl5OO还是Moose?_Perl_Oop_Moose_Perl Mouse - Fatal编程技术网

我应该先学习Perl5OO还是Moose?

我应该先学习Perl5OO还是Moose?,perl,oop,moose,perl-mouse,Perl,Oop,Moose,Perl Mouse,我对Perl编程还比较陌生,但我知道Perl5OO基本上是如何工作的。然而,我从来没有用Perl5OO创建过任何项目,所以我很肯定我会遇到很多陷阱 最近我发现了关于这个模块的炒作。我查阅了一些关于CPAN的文档,我发现它非常有趣,对我这个开发人员有很大帮助。此外,它似乎非常稳定和可靠 我应该加紧使用基本的Perl5OO语法,直到我对它非常熟悉为止(以了解这些阶段后面的情况),还是您认为我应该继续使用Moose直接开始开发应用程序?或者我应该试一试吗 任何关于这方面的想法和经验都将受到赞赏 提前谢

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

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

我应该加紧使用基本的Perl5OO语法,直到我对它非常熟悉为止(以了解这些阶段后面的情况),还是您认为我应该继续使用Moose直接开始开发应用程序?或者我应该试一试吗

任何关于这方面的想法和经验都将受到赞赏


提前谢谢

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

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

我已经开始使用Moose,并且非常喜欢它。我同意其他帖子的说法,即您仍然应该学习如何使用Moose实现OOPerl。但这往往很难做到,而且有很多方法可以做到这一点。我认为如果你要开始一个新的项目,那么驼鹿就是最好的选择

我还使用了Object::InsideOut,它非常类似于Moose,也有助于保护对象变量不被篡改


另一个注意事项是,我知道Perl 6对象与Moose对象非常相似。。因此,学习Moose将使您为Perl 6做好准备。

Moose是有用的,但您可能仍然希望学习Perl OO,以使自己免受攻击


PerlOO本身相当复杂,但这本书使它非常容易理解:。强烈推荐。

驼鹿不错,但学习它的决定取决于你的目标

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


如果你想成为一名“Perl程序员”,那么你会遇到更多的非Moose OO代码,而不是Moose OO代码,所以你应该先学会在没有Moose的情况下进行编码。我推荐Damian Conway的面向对象Perl作为一个很好的起点。

正如其他人所指出的,学习Perl中OO的基本原理将对您有所帮助,不仅对大多数非moose软件包有帮助,而且对moose本身也有帮助,因为moose的深层次基本上只使用标准的Perl OO布局。基本上,一旦您熟悉了所显示的内容,就可以合理地掌握Perl中的OO原则。Damian Conway的面向对象Perl书是对面向对象时期的一个极好的介绍,而不仅仅是Perl的风格。我强烈建议你读它,或者至少读它的前半部分

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


披露:我是一名核心Moose开发人员,从事过鼠标方面的工作。

老实说,我不确定Perl原始OO原语的知识对于编写新代码有多大价值。我已经很长时间没有在代码中使用@ISA或“use base”或“bless”;我做的任何OO都是通过驼鹿拖把。(我当然会使用无rebless实例,但我使用$meta->rebless_实例,而不仅仅是“bless”。更干净!)

不管怎样,我会先自学驼鹿。这很容易马上开始,并且很有成效,随着您对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的实例作为第一个参数。如果您在签名中的a:之前提供了其他内容,您可以更改变量的类型和名称。我还编写了“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
这一切都是免费的,它使调试程序变得更容易。没有理由避免它,它确实让编程变得更有趣(而且它让你的程序更可靠…免费!)

哦,还有一件事。使用Moose,你可以反思你的课程。这可能不是很重要,但它可以很好地拥有。打开Devel::REPL,键入“do”test.pl“”加载Point类,然后说:

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

结果是
['x','y']
。在没有源代码的情况下,您可以找出类具有哪些属性。尝试使用“普通”PerlOO来实现这一点。(这类事情使丰富的MooseX::命名空间成为可能。您可能不需要内省,但您将享受使用来自CPAN的可靠模块的能力。)

我想先学习Moose。为什么?是的,大多数PerlOO并没有完成对Moose的操作。是的,驼鹿很慢(尽管尝试一下)。是的,有很多实际的原因让你最终不得不学会用艰难的方式去做。但是