En varias ocasiones tengo una colección de funciones que me gustaría implementar de diferentes maneras. El ejemplo más obvio de esto sería abstraer de bases de datos específicas. En un lenguaje orientado a objetos que utilizaría una interfaz para esto:¿Funciones abstractas o interfaces de funciones en Clojure?
interface DB {
ResultSet query(String query);
void persist(Object o);
...
}
en speudo código que me gustaría hacer algo como esto:
(ns dbbackend)
(abstractfn query [q])
(abstractfn persist! [o])
Y luego implementaciones para cada base de datos:
(ns dbbackend.mysql :implements dbbackend)
(defn query [q] ...)
(defn persist! [o] ...)
No tengo muy claro cuál es la mejor práctica para hacer algo similar en un lenguaje funcional, específicamente Clojure. ¿Debería usar métodos múltiples para esto?
multimétodos parece una combinación razonablemente buena para mí, quizás la única. Pero no soy un experto en Clojure, así que no ofreceré una respuesta "real". +1 para la buena pregunta, sin embargo! –