clojure polymorphism switch-statement case multimethod

¿Por qué los métodos múltiples de Clojure son mejores que las afirmaciones ''if'' o ''case''?



polymorphism switch-statement (3)

La diferencia entre los métodos múltiples y una declaración if grande es que necesita modificar la función que contiene la sentencia case para agregar casos a la sentencia if. Puede agregar un nuevo método sin tocar los métodos previamente existentes.

Entonces, si define un método múltiple dentro de su biblioteca y quiere que sus usuarios puedan extenderlo para sus propios tipos de datos, eso no es un problema. Si en su lugar hubieras usado una sentencia if, sería un gran problema.

He pasado un tiempo tratando de entender los métodos múltiples de Clojure. El principal argumento "pro" multimétodo, según tengo entendido, es su flexibilidad, sin embargo, estoy confundido con la argumentación de por qué los multimétodos son mejores que una simple afirmación de caso o caso. ¿Podría alguien, por favor, explicar, dónde está dibujada la línea entre el polimorfismo y la declaración de un caso sobreglorificado?

EDIT: Debería haber sido más claro en la pregunta, que estoy más interesado en comparación con la declaración "si". ¡Muchas gracias por las respuestas!


La respuesta anterior de ivant se puede ampliar echando un vistazo a este artículo . Hace un buen trabajo explicando el poder de los protocolos. Piense en los métodos múltiples como protocolos con muchas dimensiones.


Supongamos que tenemos los tipos A, B, C, D y E, y los métodos m1, m2, m3 tomando argumentos únicos de los tipos anteriores. Puedes ponerlos en una mesa como esta:

| A | B | C | D | E | m1 | | | | | | m2 | | | | | | m3 | | | | | |

La estrategia de la declaración de "cambio" está implementando una fila de esta tabla a la vez. Supongamos que agrega un nuevo tipo F. Tendrá que modificar todas las implementaciones para admitirlo.

El polimorfismo basado en clases (C ++, Java, etc.) le permite implementar una columna completa en su lugar. Por lo tanto, agregar un nuevo tipo es fácil, ya que no tiene que cambiar las clases ya definidas. Pero agregar un nuevo método es difícil, ya que tendrás que agregarlo a todos los otros tipos.

Los métodos múltiples le permiten implementar celdas individuales de la tabla de forma independiente.

Esta flexibilidad es aún mayor si tiene que enviar múltiples argumentos. Cada nuevo argumento agrega otra dimensión a esta tabla, y los despachos basados ​​tanto en swich como en clase se vuelven muy complejos bastante rápidamente (ver patrón de visitante).

Tenga en cuenta que los métodos múltiples son en realidad incluso más genéricos de lo que se muestra, ya que puede enviar casi cualquier cosa, no solo los tipos de argumentos.