Moose vs. MooseX ::宣告

Joe*_*ger 17 oop perl moose

片尾曲

MooseX :: Declare将不再被任何人推荐,因为它依赖于Devel :: Declare,它实现了它的目的,但它本身已经过时了.此时如果有人想要MX :: D,他们应该看看Moops

原版的

假设我已经对旧式Perl OO有了不错的认识,并且假设我要用某种形式的Moose编写一些新的代码(是的,我知道有一个性能损失),我想知道是否更深入了两个兔子洞我希望我选择了另一条道路吗?你能SO-和尚开导我的优劣Moose对比MooseX::Declare(或其他一些?).另外,如果我们选择切换,他们是如何互换的,一对一和另一个.

(ps我会很好地解决这个问题,但我认为一个结构良好的答案可能会避免主观性)

per*_*rin 19

MooseX :: Declare基本上是Moose语法的糖层.对于解析器之外的所有内容,它们都是相同的.MooseX :: Declare只会产生更多,写作更少.

作为喜欢MooseX :: Declare语法的人,但仍然喜欢在简单的Moose中编写我的所有代码,这些权衡主要在开发和可维护性方面.

比较它们时的基本项目清单:

  • MooseX ::申报有很多更简洁的语法.在普通的旧perl对象(PO​​PO?)中需要几百行的东西,在Moose中可能需要50行,在MooseX中可能需要30行:: Declare.来自MooseX :: Declare的代码对我来说更具可读性和优雅性.

  • MooseX :: Declare意味着你有免费的MooseX :: Types和MooseX :: Method :: Signatures.这导致了非常优雅的method foo(Bar $bar, Baz $baz) { ... }语法,导致人们在Ruby中使用了几年后回到Perl.

  • 不好的一面MooseX ::申报是,一些错误信息有很多比驼鹿更加神秘.TypeConstraint验证失败的错误可能发生在MooseX :: Types :: Structured中的几个深层,并且从那里到你的代码中你破坏它的位置对于刚接触系统的人来说可能是困难的.穆斯也有这个问题,但程度较轻.

  • 龙在MooseX :: Declare中隐藏的地方可能与他们隐藏在Moose中的地方略有不同.MooseX :: Declare努力绕过已知的Moose问题(with()例如时间),但引入了一些值得注意的新地方.例如,MooseX :: Types与Moose的原生Stringy类型[^ 1]有一系列完全不同的问题.

  • MooseX :: Declare再次遭遇性能打击.这是已知的MooseX ::声明开发商和人民正在做这个工作,(对于工作,我相信的几个值).

  • MooseX :: Declare为Moose添加了更多依赖项.我添加了这个,因为人们已经抱怨Moose的依赖列表,大约有20个模块.MooseX :: Declare在其上添加了另外5个直接依赖项.但根据http://deps.cpantesters.org/,总列表是Moose 27,MooseX :: Declare 91.

如果您愿意使用MooseX :: Declare,最好的部分是您可以在每个级别上进行交换.你不需要在项目中选择一个.如果这个类在Moose中因性能需求更好,或者由Junior程序员维护,或者安装在更严格控制的系统上.你可以做到这一点.如果该类可以从MooseX :: Declare语法的额外清晰度中受益,那么您也可以这样做.

希望这有助于回答这个问题.

[^ 1]:有人说更少,有些人说更多.老实说,Moose核心开发人员仍然在争论这个问题,而且没有正确的答案.

  • 老实说,我没有其他人回答.通常在*I*看到它以及其他几个人评论时.如果你注意到我只回答了穆斯的问题,我就不会关心因果报应或其他任何事情.我关心穆斯;) (3认同)
  • MooseX :: Method :: Signatures的性能下降令人震惊,将方法调用减慢了40倍.无论是否使用任何参数或类型检查,只需使用`method`关键字即可支付此成本.相比之下,Method :: Signatures几乎没有性能损失,并且它对Moose(或Mouse)类型具有alpha支持.http://search.cpan.org/dist/Method-Signatures/在工作中有一个MooseX :: Decla的模型来代替使用它. (3认同)