2

这是对上一个问题的跟进。如果我有多个带有around修饰符的插件/特征,是否可以确保特定的执行顺序(看看我如何不确定哪个会实际加载)?还是我真的只能在我编写的代码和文档中控制它?

示例:我有 3 个角色,每个角色都有一个around,每个角色都可以作为一个Trait加载,但如果加载超过 1 个,则必须按特定顺序加载它们才能正常工作。例如,按该顺序加载 Trait ABC 可以正常工作,但像 Trait BAC 一样加载它会导致行为不稳定。

有没有办法可以防止用户(程序员)以错误的顺序加载它们。

4

3 回答 3

1

引用Moose::Manual::MethodModifiers(在为什么使用它们之前?)。

当有多个相同类型的修饰符时, before 和 around 修饰符从最后添加到第一个,而 after 修饰符从第一个添加到最后:

 之前 2
     之前 1
         大约 2
             大约 1
                 初级
             大约 1
         大约 2
     之后 1
 之后 2

这个想法是您正在修改当时存在的方法。

于 2010-08-15T14:58:27.237 回答
1

有没有办法可以防止用户(程序员)以错误的顺序加载它们。

这是一个非常主观的答案,取决于您没有描述的系统架构。但一种方法是您可以将“您自己”的角色应用到另一个角色中,然后将其单独应用于该类:

package OmniRole;
use Moose::Role;

with 'RoleA',' RoleB', 'RoleC';  # these roles contain the 'around' method modifier


package User::Class;
use Moose;

with 'OmniRole';    # wraps method 'foo' several times to do magic.
于 2010-08-15T15:30:20.663 回答
1

简短的回答是“不”。虽然方法修饰符是有序的,但角色自然是无序组合的。这种组合冲突是角色中的方法修饰符充满危险的原因之一,您很少看到它用于任何复杂的事情。

用户也以无序而闻名。Moose 提供了一些工具来强制执行角色的有序组合(按设计)。用户空间中肯定没有任何东西会限制它们。

也就是说,您可以在不同的回复中使用 Ether 的建议,创建一个由按正确顺序组合的特征组成的元特征。或者,您可以跳出深层次,重新编写 Moose 的角色组合片段,以保证组合有序。老实说,我不能推荐这两种方法中的任何一种,这两种方法似乎都在抹黑对我来说显然是设计不佳的迹象。

在不了解您的特定问题的情况下,我无法提出更好的解决方案。我通常会寻找诸如注册回调并以某种方式触发它而不是依赖方法修饰符之类的东西。

于 2010-08-19T03:34:06.123 回答