2016-01-09 30 views
2

假設我有一個有效調度密鑰的封閉世界;在我的具體例子中,它是nybbles的類型。有兩個明顯的方法來定義有不同的特徵上半字節參數一些參數的操作:使用defmulti/defmethod案例或defmulti封閉世界,基於價值的調度?

(defn read-arg [arg-mode mem cursor] 
    (case arg-mode 
    0x0 [:imm 0] 
    0x1 [:imm (read-fwd peek-word8 mem cursor)] 
    ;; And so on 
    0xf [:ram (read-fwd peek-word32 mem cursor)])) 
    1. 使用case,如

      (defmulti read-arg (fn [arg-mode mem cursor] arg-mode)) 
      (defmethod read-arg 0x0 [_ mem cursor] [:imm 0]) 
      (defmethod read-arg 0x1 [_ mem cursor] [:imm (read-fwd peek-word8 mem cursor)]) 
      ;; And so on 
      (defmethod read-arg 0xf [_ mem cursor] [:ram (read-fwd peek-word32 mem cursor)]) 
      

    哪一個被認爲是nic呃Clojure的風格?如果調度是在符號而不是nybbles上完成的,答案會不同嗎?

  • 回答

    2

    我希望調度本身在這種情況下使用case來提高任何文體上的考慮 - 根據窄範圍內的整數值進行調度是case的最佳情況 - 真的 - 然後我實際上認爲case更好的風格(這看起來確實像封閉式世界的調度,所以它是一個很好的使用信號的機制)。

    作爲進一步的評論,它看起來像case「結果表達式」在這裏會相當短,這是很好的。如果不是這樣,那麼將它們分解爲它們自己的功能可能是值得的,以防止執行調度的方法變得太大。 (JIT將能夠內聯那些它發現的部分值得內聯。)

    至於如果涉及到符號,我會感覺不同,這取決於許多因素 - 性能(它很重要嗎? ),分支的數量和大小(最好保持整體方法小 - 出於性能和可讀性的原因 - 所以能夠在單獨的defmethod中定義每個分支可以很方便)等。