使用 Moose/角色和插件进行编程
外观
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 之后声明的任何方法修饰符都将在角色之后运行。
- ^ 继承允许通过构造函数在构建时设置参数,例如,
Foo->new({bar=>'baz'})
。如果Foo是Bar的子类,并且Bar通过Moose#has
提供了一些属性,这些属性可以在Foo的构造函数参数中设置。在插件模型中,Foo应用插件Bar,然后只设置 Bar 通过每个属性的单个方法调用进行设置,而不是通过哈希。没有办法应用Bar,然后使用一个哈希初始化Foo,也没有办法使用一个哈希初始化Bar的修改。Bar的修改。- 所有编译时解析都已禁用,例如,+has => ( default => 'NewDefault' ) 在插件中没有效果。
- ^ 您不能将角色作为子类:例如,角色可以提供有关人员的联系信息,之后据说可以联系该人员。但是,角色不能将该角色作为子类来提供美国特有的联系信息,为此,您必须使用两个角色或多重继承。
- 某些工具不受角色支持,例如 Moose 的augment。