Pregunta

¿Cuáles son las diferencias entre estos paradigmas de programación, y que son más adecuados a los problemas particulares o realizar cualquier casos de uso a favor de uno sobre los otros?

ejemplos Arquitectura apreciados!

¿Fue útil?

Solución

Todos ellos son buenos en sus propios caminos - Simplemente son diferentes aproximaciones a los mismos problemas

.

En un estilo puramente de procedimiento, los datos tiende a ser altamente desacoplado de las funciones que operan sobre ella.

En un estilo orientado a objetos, datos tiende a llevar con ella una colección de funciones.

En un estilo funcional, datos y funciones tienden hacia tener más en común entre sí (como en Lisp y Scheme) al tiempo que ofrece más flexibilidad en términos de cómo se utilizan realmente funciones. Algoritmos tienden también a ser definida en términos de la recursión y la composición en lugar de bucles y la iteración.

Por supuesto, el lenguaje en sí sólo influye cuales se prefiere el estilo. Incluso en un lenguaje de pura funcional como Haskell, puede escribir en un estilo de procedimiento (a pesar de que no es nada recomendable), e incluso en un lenguaje de procedimientos como C, se puede programar en un estilo orientado a objetos (como en el GTK + y EFL API).

Para que quede claro, la "ventaja" de cada paradigma es simplemente en el modelado de sus algoritmos y estructuras de datos. Si, por ejemplo, el algoritmo consiste en listas y árboles, un algoritmo funcional puede ser el más sensible. O si, por ejemplo, sus datos son altamente estructurada, puede tener más sentido para componer como objetos si ese es el paradigma nativo de la lengua - o, se podría fácilmente ser escrito como una abstracción funcional de las mónadas, que es el paradigma nativo de lenguajes como Haskell o ML.

La elección de los cuales se utiliza es simplemente lo que tiene más sentido para su proyecto y las abstracciones su idioma apoya.

Otros consejos

Creo que las bibliotecas disponibles, herramientas, ejemplos y comunidades eclipsa por completo el paradigma en estos días. Por ejemplo, ML (o lo que sea) podría ser el último de programación de uso general idioma pero si usted no puede conseguir cualquier buenas bibliotecas de lo que está haciendo estás jodido.

Por ejemplo, si usted está haciendo un juego de video, hay más buenos ejemplos de código y SDK en C ++, por lo que es probablemente mejor con eso. Para una pequeña aplicación web, hay algunos grandes marcos de Python, PHP y Ruby que ponerlas fuera de funcionamiento muy rápidamente. Java es una gran opción para los proyectos más grandes debido a la comprobación en tiempo de compilación y bibliotecas y plataformas empresariales.

Lo que solía ser el caso de que las bibliotecas estándar para los distintos idiomas eran bastante pequeñas y fácilmente replicado - C, C ++, ensamblador, ML, LISP, etc .. vinieron con lo básico, pero tendían a pollo a cabo cuando se trataba de la estandarización de cosas como las comunicaciones de red, cifrado, gráficos, formatos de archivos de datos (incluyendo XML), incluso las estructuras de datos básicos como árboles equilibrados y tablas hash se quedaron fuera!

Las lenguas modernas como Python, PHP, Ruby y Java ahora vienen con una biblioteca estándar mucho más decente y tienen muchas buenas bibliotecas de terceros que puede utilizar fácilmente, gracias en gran parte a la adopción de espacios de nombres para mantener las bibliotecas de chocar con entre sí, y la recolección de basura para estandarizar los esquemas de gestión de memoria de las bibliotecas.

Estos paradigmas no tienen que ser mutuamente excluyentes. Si nos fijamos en Python, es compatible con las funciones y clases, pero al mismo tiempo, todo es un objeto, incluyendo funciones. Usted puede mezclar y combinar / Estilo por procedimientos funcional / oop todo en una pieza de código.

Lo que quiero decir es, en los lenguajes funcionales (por lo menos en Haskell, el único que he estudiado) no hay declaraciones! funciones sólo se permite una expresión dentro de ellos !! PERO, las funciones son ciudadanos de primera clase, se pueden pasar alrededor como parámetros, junto con un montón de otras habilidades. Pueden hacer cosas poderosas con pocas líneas de código.

Mientras que en un lenguaje de procedimientos como C, la única manera que puede pasar en torno a las funciones es mediante el uso de punteros de función, y que por sí sola no permite muchas tareas de gran alcance.

En Python, una función es un ciudadano de primera clase, pero puede contener un número arbitrario de los estados. Para que pueda tener una función que contiene el código de procedimiento, pero se pueden pasar alrededor al igual que los lenguajes funcionales.

Lo mismo sucede con programación orientada a objetos. Un lenguaje como Java no permite que usted pueda escribir los procedimientos / funciones fuera de una clase. La única manera de pasar una función alrededor es envolver en un objeto que implementa esa función, y luego pasar ese objeto alrededor.

En Python, que no tienen esta restricción.

Para GUI yo diría que el Paradigma Orientado a Objetos se adapta muy bien. La ventana es un objeto, los cuadros de texto son objetos, y el bien-Button es uno también. Por otro material mano como procesamiento de cadenas se puede hacer con mucho menos gastos generales y por lo tanto más fácil con un simple paradigma procedimental.

No creo que se trata de una cuestión de la lengua ninguno. Usted puede escribir casi cualquier lenguaje popular funcional, de procedimiento o en orientado a objetos, aunque podría ser un poco de esfuerzo adicional en algunos.

Con el fin de responder a su pregunta, necesitamos dos elementos:

  1. La comprensión de las características de los diferentes estilos de arquitectura / patrones.
  2. La comprensión de las características de los diferentes paradigmas de programación.

Una lista de software de estilos de la arquitectura / patrón se muestra en la artículo en Wikipeida. Y se puede investigar en ellas fácilmente en la web.

En breve y general, procesal es bueno para un modelo que sigue un procedimiento, programación orientada a objetos es buena para el diseño y funcional es bueno para la programación de alto nivel.

Creo que debería tratar de leer la historia en cada paradigma y ver por qué la gente crea y se puede entender con facilidad.

Después de la comprensión de los dos, puede vincular los elementos de arquitectura estilos / patrones de paradigmas de programación.

Creo que a menudo no son "frente a", pero se puede combinarlos. También pienso que muchas veces, las palabras que mencionas son sólo palabras de moda. Hay pocas personas que realmente saben lo que significa "orientado a objetos", incluso si son los evangelistas más feroces de la misma.

Uno de mis amigos está escribiendo una aplicación de gráficos usando NVIDIA CUDA . Aplicación se ajusta muy bien con paradigma OOP y el problema puede ser descompuesto en módulos cuidadosamente. Sin embargo, para utilizar CUDA es necesario utilizar C, que no soporta herencia . Por lo tanto, tiene que ser inteligente.

a) a diseñar un sistema inteligente que emular la herencia hasta cierto punto. Se puede hacer!

i) Se puede utilizar un sistema de gancho, que espera que todos los niños del padre P C tener una cierta anulación de la función F. puede hacer que los niños registran sus reemplazos, que se almacenan y se ejerce cuando sea necesario.

ii) Puede utilizar struct alineación de memoria característica para echar a los niños en los padres.

Esto puede ser ordenada, pero no es fácil de llegar a prueba de futuro, solución fiable. Va a pasar mucho tiempo en el diseño del sistema y no hay garantía de que no tendrá problemas a medio camino a través del proyecto. La implementación herencia múltiple es aún más difícil, por no decir casi imposible.

b) Se puede utilizar la política de nomenclatura coherente y usar divide y vencerás enfoque para crear una programa. No tendrá ninguna herencia sino porque sus funciones son pequeños, fáciles de entender y con formato consistente que no lo necesita. La cantidad de código que necesita para escribir sube, es muy difícil mantener la concentración y no sucumbir a soluciones fáciles (hacks). Sin embargo, de esta manera Ninja de codificación es la forma C de la codificación. El permanecer en equilibrio entre la libertad de bajo nivel y escribir buen código. Buena manera de lograr esto es escribir prototipos utilizando un lenguaje funcional. Por ejemplo, Haskell es muy bueno para los algoritmos de creación de prototipos.

tiendo hacia un enfoque b. Escribí una posible solución utilizando un enfoque, y voy a ser honesto, se sentía muy poco natural utilizando ese código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top