2011-05-16 8 views
52

He visto este citado en muchos lugares:¿Por qué es mejor tener 100 funciones operan en una estructura de datos de 10 funciones en la estructura 10 de datos

"Es mejor tener 100 funciones operan en una estructura de datos de 10 funciones en 10 estructuras de datos ". Perlis -Alan

Pero nunca he visto que explica por qué esto debe ser cierto. ¿Es solo la idea de que debe tratar de derivar las otras 9 estructuras de datos de la primera para evitar duplicar los datos? Siento que me falta algo de contexto.

+0

Porque 100 funciones> 10 funciones. –

+0

Porque 100 funciones en una estructura de datos son más genéricas, ofreciendo una mejor composición, mientras que 10 funciones en 10 estructuras de datos son específicas para su estructura de datos y, por lo tanto, menos (o imposible de ser) compuestas a través de estructuras de datos. – mljrg

Respuesta

70

La cita es de Alan Perlis' Epigrams on Programming, que fue publicado en 1982.

El significado de esta cita se incorpora bien en Lisp, donde hay multitud de funciones que operan y se ocupan específicamente de las listas , y podría lograr mucho solo con listas y la variedad de funciones que operan en las listas, lo que las hace mucho más poderosas que cualquier estructura de datos de propósito único.

Lua, como otro ejemplo, uses tables to simulate classes. ¿Por qué utilizar una tabla para crear objetos en lugar de crear clases y objetos de nivel de lenguaje como los lenguajes orientados a objetos? Como su objeto es una tabla ahora, puede usar cualquier número de funciones definidas para las tablas de su objeto, ¡sin cargo! Mejor aún, no tuvimos que saturar el lenguaje con sintaxis específica de clase y tenemos que redefinir funciones de la tabla que queremos para nuestra clase.

Lo dijo Perlis es sin duda un modo prominente del pensamiento en Lisp y en functional programming en general. Esas 100 funciones en su única estructura de datos pueden componerse juntas de muchas maneras únicas, ya que todas operan en la misma estructura de datos, pero tampoco puede realmente mezclar las 10 funciones en 10 estructuras de datos, ya que solo se definieron para trabajar en su estructura de datos particular.

Una variación más moderno y más sencillo de esto se piensa en términos de abstracciones . Si estuviéramos codificando en Java, preferiríamos escribir 100 funciones en la interfaz List, o el mismo conjunto de diez funciones, una para ArrayList, una para LinkedList, una para ...

+1

+1 Muy buena respuesta. – ralphtheninja

+1

Especialmente teniendo en cuenta lo vaga que era mi pregunta, gracias. – GlennS

+1

Creo que el último párrafo de esta respuesta destaca por qué la cita de Alan Perlis ya no es aplicable. En el mejor de los casos, se reduce a lo que considera que constituye una "estructura de datos". –

6

Estructura e interpretación de la computadora programas (SICP) responde a su pregunta de la siguiente manera:

Screenshot from SICP

se puede ver el contenido original del online version of the book here

EDITAR (incluido desde comentario):

"En Pascal, la plétora de estructuras de datos declarables induce una especialización dentro de las funciones". La especialización es mala porque inhibe la "casualidad/creatividad", diría yo, con mis propias palabras.

En otras palabras, si las funciones son demasiado especializados por lo que no pueden ser reutilizados de manera que no se conocían en el momento de la creación función.

Buen ejemplo es fold (https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Foldable.html) que es una estructura de datos agnóstica, función de orden superior general.Se puede usar en un árbol, por ejemplo

data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a). 
+0

Esto no responde por qué. – isomorphismes

+2

Sí, no es así, si no puede leer. – jhegedus

+0

Ilumíname. Solo lo leí. – isomorphismes

Cuestiones relacionadas