2

これは前の質問へのフォローアップです。修飾子を含む複数のプラグイン/特性がaroundある場合、特定の実行順序を保証することは可能ですか (どれが実際にロードされるかがわからないため)? それとも、私が書いたコードとドキュメントでのみそれを制御できますか?

例: それぞれに を持つ 3 つのロールがありaround、それぞれをオプションで特性としてロードできます、複数のロールをロードする場合、正しく連携するには特定の順序でロードする必要があります。たとえば、Trait ABC をこの順序でロードすると正常に動作しますが、Trait BAC のようにロードすると、不安定な動作が発生します。

ユーザー (プログラマー) が間違った順序でロードするのを防ぐ方法はありますか?

4

3 に答える 3

1

ユーザー(プログラマー)が間違った順序でそれらをロードするのを防ぐ方法はありますか?

これは非常に主観的な答えであり、システムのアーキテクチャによって異なりますが、これについては説明していません。ただし、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::Manual::MethodModifiersを引用するには(WHY USE THEM? の直前)。

同じタイプの修飾子が複数ある場合、before および around 修飾子は最後に追加されたものから最初に追加されたものまで実行され、after 修飾子は最初に追加されたものから最後まで実行されます。

 前 2
     前 1
         前後 2
             前後 1前後
                 プライマリ
             1
         前後 2
     前後 1
 後 2 後

アイデアは、その瞬間に存在するメソッドを変更しているということです。

于 2010-08-15T14:58:27.237 に答える
1

短い答えは「いいえ」です。メソッド修飾子は順序付けられていますが、ロールは当然順序付けられていません。この構成の競合は、ロールのメソッド修飾子が危険にさらされている理由の 1 つであり、複雑なものに使用されることはめったにありません。

また、ユーザーは特に順序付けられていないことで知られています。Mooseは、役割の順序付けされた構成を強制するためのツールをほとんど提供していません(設計による)。ユーザー空間には、それらを制約するものは何もありません。

そうは言っても、別の返信で Ether の提案を使用して、適切な順序で構成された特性で構成されるメタ特性を作成できます。または、深いところから飛び降りて、順序付けされた構成を保証するために Moose の役割構成の部分を書き直すこともできます。正直なところ、これらのアプローチのどちらもお勧めできません。どちらも、設計が不十分であることを明確に示していると思います。

あなたの特定の問題についてもっと知らなければ、より良い解決策を提案することはできません. 一般的に、メソッド修飾子に頼るのではなく、コールバックを登録してそれをトリガーするようなものを探します。

于 2010-08-19T03:34:06.123 に答える