Equivalente a los principios SOLID para la programación funcional.

36

Los principios SÓLIDOS me han resultado bastante útiles al pensar en el diseño orientado a objetos.

¿Existe un conjunto similar / equivalente de principios independientes del lenguaje adaptados para la programación funcional?

mikera
fuente
12
FWIW, esto fue discutido brevemente en SO hace un año
StuartLC
Este video y estas diapositivas presentan los principios SÓLIDOS aplicados a la programación funcional. Ambos usan el lenguaje Clojure como ejemplo, pero los principios se mantienen en otros idiomas.
mascota

Respuestas:

14

Es un poco difícil encontrar equivalentes, pero puedo intentarlo:

  • S (SRP) en FP, una función crea SIEMPRE la misma salida para los mismos argumentos, esto se llama transparencia referencial
  • O (OCP) en FP hay un concepto llamado tipos de datos algebraicos, eche un vistazo cómo se relaciona con las jerarquías de clase y qué problema ambos intentan resolver 1
  • El principio de sustitución de L (LSP) Liskov es la contravarianza 2
  • D (DIP) en la programación funcional general logra la abstracción a través de la composición de funciones, también hay otro mecanismo con la ayuda de la teoría de categorías (por ejemplo, monoide o functor), para "Inyección de dependencias" 3
AndreasScheinert
fuente
21
Todavía estoy pensando en cómo pasaste del Principio de Responsabilidad Única a la transparencia referencial . Esos dos no están relacionados. SRP se trata de una función que tiene un único propósito. Puede o no ser referencialmente transparente con respecto a eso.
Goran Jovic
3
Ah, mi mal, lo entiendo ahora. Estos son equivalentes en el sentido de ser principios y formar el mismo acrónimo, no en el sentido de significar lo mismo o algo similar. Perdón por el voto negativo!
Goran Jovic
1
Correcto, esa es la forma prevista de leerlo. Traté de describir una asignación para esos términos en el contexto de fp.
AndreasScheinert
Hombre, odio que no puedas editar un comentario, de hecho, las cosas DEBEN significar al menos algo similar.
AndreasScheinert
Tal vez las funciones de orden superior pueden proporcionar algún tipo de inyección de dependencia: se inyecta una función concreta como parámetro en una función genérica (de orden superior).
Giorgio
45

SOLID resulta ser una buena idea para los reinos funcionales / imperativos también.

SRP : "Solo hacer una cosa" se tomó de la programación imperativa en primer lugar. Tener funciones pequeñas y enfocadas es bueno.

OCP - Permitirle cambiar comportamientos sin modificar el código es bueno. La programación funcional utiliza funciones de orden superior más que la herencia, pero el principio es válido.

LSP : cumplir con algún contrato de interfaz es tan bueno en la programación funcional como en la orientación a objetos. Si una función de clasificación toma un comparador, entonces esperaría que el comportamiento '0 es igual, menos que proporciona resultados negativos, mayor que resultados positivos'.

ISP : la mayoría de los lenguajes funcionales aún tienen estructuras. Especificar el conjunto de datos más pequeño requerido por una función sigue siendo una buena práctica. Requerir la interfaz menos específica para los datos (¿por qué usar las listas de entradas cuando las enumeraciones de T funcionan igual de bien?) Sigue siendo una buena práctica.

DIP : especificar parámetros para una función (o una función de orden superior para recuperarlos) en lugar de codificar la función para obtener algún valor es tan bueno en la programación funcional como en la orientación a objetos.

E incluso cuando se realiza una programación orientada a objetos, muchos de estos principios se aplican también al diseño de métodos en los objetos.

Telastyn
fuente