Estoy programando en Java en un estilo muy orientado a objetos (OO). OOP es muy intuitivo para mí, pero tengo muy poco conocimiento sobre otros tipos de programación.
¿Qué es exactamente la programación procesal ? ¿Cómo es exactamente diferente de OOP? ¿Es lo mismo que la programación funcional ?
Solía pensar que toda la programación que no es OO es de procedimiento. Pero estoy empezando a pensar que esto no es cierto.
object-oriented
procedural
Aviv Cohn
fuente
fuente
Respuestas:
Wikipedia tiene buenas explicaciones para estos términos. De todos modos, aquí está el resumen:
La programación declarativa es lo opuesto a la programación imperativa: especifica qué calcular en lugar de cómo (por ejemplo, SQL, expresiones regulares).
La programación funcional modela el cálculo como expresiones que (pueden) producir valores. Las funciones son valores y se pueden pasar o devolver desde otras funciones. Se desaconseja la mutación; Todas las variables son inmutables por defecto. Como resultado, es más declarativo que imperativo, ya que enfatiza lo que se está calculando en lugar de la secuencia de cambios de estado necesarios para lograrlo.
Sus relaciones son un poco complicadas porque OOP es un término bastante cargado. Puede usar objetos tanto en lenguajes funcionales como en lenguajes de procedimiento, pero los lenguajes que se anuncian como OO son de procedimiento. Para confundir aún más el problema:
Esto hace que las personas piensen que la POO es la única forma de lograr la abstracción, y que la programación funcional y la POO son de algún modo opuestas o mutuamente excluyentes. Mucha gente también piensa que todos los lenguajes funcionales son puros y no permiten la mutación.
Además, las personas generalmente intercambian imperativo / procedimiento indistintamente, a veces contrastando con OOP (lo que implica un código sin abstracción, generalmente C) y otras contrastando con la programación funcional. Por lo que puedo decir, el término programación estructurada se ha dejado de usar (probablemente porque en este punto la mayoría de la gente da por sentado que los goto y los globales se consideran dañinos).
fuente
La programación procesal es un enfoque de programación que es uno de los elementos básicos de los bloques de construcción para muchos otros diseños de lenguaje (funcional no es uno).
La mayoría de los idiomas caen en el conjunto de "Programación de procedimientos" y es probablemente el enfoque de diseño más natural para la mayoría de las personas (si piensas en términos de OO, entonces diría que eres una minoría).
BASIC es de procedimiento.
Como otros han dicho, es un mecanismo para estructurar programas de manera secuencial.
Requiere un mecanismo para definir "procedimientos": bloques de código con nombre similares a los métodos OO, que pueden aceptar cero a muchos parámetros y, opcionalmente, devolver un valor (que generalmente se llamaría una función), lo que probablemente genere confusión con los lenguajes funcionales. )
El paradigma no dicta cuáles serán las cosas que hagas o la forma en que se transmitirán.
Simplemente describe que el programa se estructurará como una serie de procedimientos (o funciones) que operan de manera secuencial. Los datos se definen entonces independientemente de los procedimientos.
Esto difiere de la programación orientada a objetos, que estructura el programa en torno a colecciones de datos y métodos (no funciones) que actúan sobre esos datos.
Una forma de pensarlo es en términos del alcance de los datos.
En un lenguaje de procedimiento, el alcance es bastante simple. Una variable puede estar dentro del alcance de un procedimiento dado (declarado localmente), hasta el nivel de la parte superior que llama cosas (declaradas globalmente), con ámbitos anidados entre ellos.
En un lenguaje orientado a objetos, agrega un nuevo contexto de alcance, que es el del objeto actualmente en uso, que es ortogonal al anterior.
Otra forma de pensar en procedimientos, en comparación con los orientados a objetos es considerar un lenguaje orientado a objetos donde todos los métodos deben declararse como estáticos. El resultado es un lenguaje de procedimiento donde las clases se pueden usar para agrupar procedimientos.
fuente
La programación procesal definitivamente no es programación funcional.
La programación de procedimientos es cuando tienes un modelo de la computadora como una máquina en tu cabeza, y estás pensando en cómo está modificando los datos en la memoria. Entonces, primero establece
A
el valor 3, luego agrega 1 y lo almacenaA
nuevamente en la ubicación de la memoria (sobrescribiendo el valor anterior).La programación funcional diría que
A
es 3, yB
esA + 1
, y luego dejar que la computadora descubra cómo calcularB
. Una vez que lo haya definidoA
, debe ser inmutable (no cambiante). Funcional también le permite hacer cosas como pasar una función como un valor de primera clase (una función puede tomar una función como argumento).La programación orientada a objetos a menudo combina ambos, y es algo ortogonal para ambos. Puede usar la programación funcional y devolver un objeto inmutable, y ese objeto puede tener un método que devuelva algún valor calculado, e incluso hacerlo de manera perezosa, es decir, la programación funcional orientada a objetos. También puede tener un objeto que represente un "repositorio" (versión abstracta de una base de datos), y puede "guardar" cosas en el repositorio y "recuperar" cosas, y dejar que ese objeto maneje todos los detalles de cómo se hace. . Eso es básicamente programación procesal orientada a objetos.
fuente
OOP no es más que una forma un poco refinada de programación de procedimientos, que nuevamente pertenece a la gran familia de programación imperativa. Prueba de esa afirmación es que muchos programadores de C # / Java tienden a "hacer algo" y prefieren métodos como:
Entonces, un programa que consiste en un montón de métodos vacíos (anteriormente conocidos como procedimientos (sic!)) Y código como:
Es una programación procesal perfecta.
fuente