跳轉到內容

使用 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
華夏公益教科書