Penso che la prima opzione sia migliore. È più estensibile, a seconda di come questi oggetti verranno utilizzati. È più semplice aggiungere o modificare una nuova funzione che funziona su un oggetto esistente se le funzioni e gli oggetti sono separati. In Clojure di solito non ci sono molte ragioni per raggruppare le funzioni insieme agli oggetti su cui lavorano, a meno che non si voglia veramente nascondere i dettagli di implementazione agli utenti del proprio codice.
Se si sta scrivendo un'interfaccia per la quale si prevedono molte implementazioni, considerare anche l'utilizzo di multimethods. È possibile fare in modo che l'eccezione passi un'eccezione "non implementata" per forzare gli implementatori a implementare la propria interfaccia.
Come ha detto Gutzofter, se l'unica ragione per cui si sta considerando la seconda opzione è consentire alle persone di non dover digitare un parametro su ogni chiamata di funzione, si potrebbe considerare che tutte le funzioni utilizzino alcune var come socket predefinito oggetto e scrivendo una macro with-socket
che utilizza binding
per impostare il valore di var. Vedere i metodi di stampa incorporati che utilizzano il valore predefinito di *out*
come flusso di output e with-out-str
che associa *out*
a un writer di stringhe come esempio Clojure.
This article potrebbero interessarti; confronta e contrasta alcuni idiomi OOP con equivalenti Clojure.
fonte
2009-09-04 18:36:50