跳转到内容

使用 Moose/角色和插件进行编程

来自 Wikibooks,开放世界中的开放书籍
14:00 <@mst> EvanCarroll: add a disclaimer saying "concepts may be oversimplified and this has not been audited by the Moose developers so may not always be 
             precisely correct"
14:00 <@mst> then stevan can audit it and give a page the seal of approval if he wants to
14:00 <@mst> and not if he doesn't
14:00 < EvanCarroll> mst: sounds fair enough
14:00 <@mst> EvanCarroll: "Only a class can be subclassed, but there's no reason you can't subclass a class with a bunch of roles applied to it - also, see 
             <link to stuff on role composition>"

角色的适用场景

[编辑 | 编辑源代码]
SFTHM
直接来自马嘴
  • 如果您可以在不使用角色的情况下建模您的问题,并且只使用单一继承,请这样做。
  • 任何可以使用角色建模的东西都可以使用多重继承建模。[1]
  • 如果您在编译时就知道要应用插件,您可能不想使用插件。[2]
  • 如果插件或角色只用于一个类,那么最好不要使用它。
  • 角色应该只指定方法,而不是子例程。子例程应该在使用 Sub::Exporter 而不是 Moose 角色系统的模块中指定。角色用于方法组合。角色不仅仅是导出。SFTHM


顺序敏感性

[编辑 | 编辑源代码]

在需求和冲突解决方面,角色试图不敏感于顺序;但是,它们在组合方面非常敏感于顺序。

角色的使用顺序决定了方法修饰符的顺序。类中在 with(包含角色的关键字)之前的任何方法修饰符都将在它们之前运行,而 with 之后声明的任何方法修饰符都将在角色之后运行。


继承的缺点

[编辑 | 编辑源代码]
  1. ^ 继承允许通过构造函数在构建时设置参数,例如,Foo->new({bar=>'baz'})。如果FooBar的子类,并且Bar通过 Moose#has 提供了一些属性,这些属性可以在Foo的构造函数参数中设置。在插件模型中,Foo应用插件Bar,然后只设置 Bar 通过每个属性的单个方法调用进行设置,而不是通过哈希。没有办法应用Bar,然后使用一个哈希初始化Foo,也没有办法使用一个哈希初始化Bar的修改。Bar的修改。
    • 所有编译时解析都已禁用,例如,+has => ( default => 'NewDefault' ) 在插件中没有效果。
  2. ^ 您不能将角色作为子类:例如,角色可以提供有关人员的联系信息,之后据说可以联系该人员。但是,角色不能将该角色作为子类来提供美国特有的联系信息,为此,您必须使用两个角色或多重继承。
  3. 某些工具不受角色支持,例如 Moose 的augment
华夏公益教科书