使用 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。