10
votes

Quelle conception d'interface de la bibliothèque de clojure est la meilleure?

Je veux fournir plusieurs implémentations d'un lecteur / écrivain de message. Quelle est la meilleure approche?

Voici un pseudo-code de ce que je pense actuellement:

  • Il suffit de disposer d'un ensemble de fonctions que toutes les implémentations doivent fournir et laisser à l'appelant de conserver les bons flux XXX

  • Renvoie une carte avec deux fonctions fermées tenant sur le flux XXX

  • quelque chose d'autre?


0 commentaires

3 Réponses :


3
votes

Je pense que lire-message et message écrit sont des fonctions utilitaires. Ce que vous devez faire est d'encapsuler vos fonctions dans un (s) macro (s). Voir 'avec sortie à chaîne' dans la LISP commune pour voir ce que je veux dire.

EDIT: Lorsque vous utilisez une macro, vous pouvez avoir une manipulation des erreurs et une allocation de ressources dans l'expansion macro.


0 commentaires

8
votes

Je pense que la première option est meilleure. Il est plus extensible, en fonction de la façon dont ces objets vont être utilisés. Il est plus facile d'ajouter ou de modifier une nouvelle fonction qui fonctionne sur un objet existant si les fonctions et les objets sont séparés. Dans le clojure, il n'y a généralement pas beaucoup de raison de regrouper des fonctions avec les objets qu'ils travaillent, à moins que vous ne souhaitiez vraiment cacher les détails de la mise en œuvre des utilisateurs de votre code.

Si vous écrivez une interface pour laquelle vous vous attendez à de nombreuses implémentations, envisagez d'utiliser MultiMethods également. Vous pouvez avoir la valeur par défaut une exception "non implémentée", pour forcer les implémentations à implémenter votre interface.

comme Gutzofter dit, si la seule raison pour laquelle vous envisagez la deuxième option est de permettre aux gens de ne pas avoir à Tapez un paramètre de tous les fonctions, vous pouvez envisager de disposer de toutes vos fonctions utilisez quelque varisant l'objet de socket par défaut et d'écrire un avec la macro qui utilise liant pour définir la valeur de la Var. Voir les méthodes d'impression intégrées qui permettent d'utiliser la valeur de * out * comme flux de sortie et with-out-str qui se lie * out Code> à un écrivain à cordes, comme exemple de clojure.

Cet article peut vous intéresse; Il compare et contraste certains idiomes d'OOP avec des équivalents de clojure.


0 commentaires

2
votes

J'irais avec la première option et faites toutes ces fonctions multithèmes.


0 commentaires