43 votes

Clojure multimethods vs protocoles

Je suis un Clojure novice et a été la recherche de quelques exemples concrets d'utilisation de protocoles et quand utiliser multimethods. Je sais que les protocoles sont généralement orientées vers la création d'une hiérarchie de type et typique de la programmation orientée objet les choses, qu'ils ont été ajoutés à la langue après multimethods, et que les protocoles ont généralement de meilleures performances donc ma question est:est-ce

Des protocoles destinés à remplacer multimethods? Si non, pourriez-vous me donner un exemple où je voudrais utiliser multimethods à la place de protocoles?

35voto

mikera Points 63056

Protocole et multimethods sont complémentaires et destinés à légèrement différents cas d'utilisation.

  • Les protocoles de fournir efficace polymorphes expédition basée sur le type du premier argument. Parce que le pouvoir exploiter des très efficace JVM caractéristiques, les protocoles de vous donner la meilleure performance.
  • Multimethods permettre très souple polymorphisme qui peut envoyer basé sur n'importe quelle fonction de la méthode d'arguments. Multimethods sont plus lents, mais très flexible

En général, mon conseil est d'utiliser des protocoles, sauf si vous avez un cas particulier qui nécessite multimethods.

Un cas où vous pourriez avoir besoin de multimethods est quelque chose comme ce qui suit:

(defn balance-available? [amount balance] (> balance amount))

(defmulti withdraw balance-available?)

(defmethod withdraw true [amount balance] 
  (- balance amount))

(defmethod withdraw false [amount balance] 
  (throw (Error. "Insufficient balance available!")))

Notez que vous ne pouvez pas utiliser les protocoles d'ici, pour les deux raisons suivantes:

  • La fonction de répartition doit utiliser à la fois des arguments afin de déterminer la méthode de la mise en œuvre d'utilisation (c'est à dire qu'il est un multiple dispatch cas).
  • Vous pouvez également avais distinguer le type du premier argument (ce qui est probablement toujours une valeur numérique)

34voto

Arthur Ulfeldt Points 45059

Multimethods sont plus puissants et plus chers,

protocoles d'utilisation lorsqu'ils sont suffisants , mais si vous avez besoin pour l'expédition basée sur la phase de la lune vue depuis la planète mars puis multimethods sont votre meilleur choix.

Des protocoles existent pour que les choses simples de rester simple et de fournir un moyen pour les clojure pour générer de très près la même bytecode que l'équivalent de java devrait. Il semble que la plupart des gens utilisent des protocoles, la plupart du temps. J'utilise multimethods quand j'ai besoin de l'expédition sur plus d'un argument, même si je dois admettre que c'est qu'une fois, et plein d' isa hiérarchies sont utilisés moins souvent encore (par moi). donc, en bref l'utilisation Multimethods lorsque vous en avez besoin

le meilleur exemple Dans mon expierence est, dès le début, dans le noyau.clj

6voto

M Smith Points 852

Comme le mentionne Arthur, les multiméthodes sont plus puissantes et plus coûteuses. En effet, les protocoles peuvent être considérés comme un cas particulier de mutlimethods où la fonction de répartition est `` . Bien sûr, ce n'est pas vraiment le cas car les protocoles sont plus que cela.

Si vous avez besoin d'envoyer sur autre chose que la classe du premier argument, vous aurez besoin d'utiliser une multiméthode, ou de refonte. L'expédition sur le type est un bon cas d'utilisation pour les protocoles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X