¿Qué es exactamente la programación procesal? ¿Cómo es exactamente diferente de OOP? ¿Es lo mismo que la programación funcional?

32

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.

Aviv Cohn
fuente
9
Compartir su investigación ayuda a todos. Cuéntanos qué has probado y por qué no satisfizo tus necesidades. Esto demuestra que te has tomado el tiempo para tratar de ayudarte a ti mismo, nos salva de reiterar respuestas obvias y, sobre todo, te ayuda a obtener una respuesta más específica y relevante. También vea Cómo preguntar
mosquito
2
La programación procesal no es lo mismo que la programación funcional; en realidad es esencialmente lo mismo que la programación orientada a objetos, menos los objetos y las clases.
Mason Wheeler
1
La OOP imperativa en realidad es programación de procedimientos, por lo que es exactamente lo que estás haciendo todo el tiempo ...
Ingo

Respuestas:

68

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.

  • La programación puramente funcional no permite la mutación por completo (aunque contrario a la creencia popular todavía tiene mecanismos para lograr efectos secundarios).
  • La programación funcional total además prohíbe excepciones y bucles infinitos. (Una función total en matemáticas es una función que devuelve un valor para todas sus entradas).

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:

  • La mayoría de las personas no conocen la diferencia entre un objeto y un tipo de datos abstracto
  • Los lenguajes principales de OOP no mencionan los ADT, proporcionan un soporte muy pobre para ellos y promocionan objetos como The One True Way.
  • Nadie dice Programación orientada al tipo de datos abstractos (porque sería una tontería, necesita tanto ADT como objetos).

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).

Doval
fuente
3
"prohíbe los saltos" es bastante genérico; eso incluye si / while / etc. ¿tal vez "prohíbe saltos arbitrarios"?
Izkata
@Izkata Buen punto, cambiado.
Doval
1
Puede valer la pena realmente vincular a las entradas de wikipedia.
haylem
Y es por eso que se llama Objeto "Orientado" y no solo Objeto.
JeffO
1
@OrangeDog ¿En qué se diferencia eso de un tipo de datos abstracto, que también define un conjunto encapsulado de datos y funciones que pueden actuar sobre él? Además, puede tener objetos inmutables, entonces, en ese caso, ¿en qué estado ?
Doval
12

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.

  • Primero hago x
  • Segundo hago y
  • En tercer lugar hago Z

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.

Rob Baillie
fuente
5

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 Ael valor 3, luego agrega 1 y lo almacena Anuevamente en la ubicación de la memoria (sobrescribiendo el valor anterior).

La programación funcional diría que Aes 3, y Bes A + 1, y luego dejar que la computadora descubra cómo calcular B. Una vez que lo haya definido A, 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.

Scott Whitlock
fuente
0

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:

void doThisAndThat(....) { ... do something ... }

Entonces, un programa que consiste en un montón de métodos vacíos (anteriormente conocidos como procedimientos (sic!)) Y código como:

doThis();
if (state is that) doSomethingElse();
doThat();

Es una programación procesal perfecta.

Ingo
fuente
doThisAndThat (....) implica que un método hará más de una cosa que, en general, no es una buena práctica. Los desarrolladores de Java y C # se adhieren principalmente al Principio de responsabilidad única. Creo que tu analogía es defectuosa. objectmentor.com/resources/articles/srp.pdf
JohnK
@ John Sé que no es una buena práctica. Sin embargo, uno común. Especialmente entre los desarrolladores de Java, si uno puede juzgar por lo que ve todos los días en SO.
Ingo
Los desarrolladores de @JohnK Java y C # se adhieren principalmente al Principio de responsabilidad única : ¿servicio de labios?
Ingo
¿Los desarrolladores de Java se adhieren principalmente a la responsabilidad única? Si solo eso fuera cierto en la vida real ...
Sridhar Sarnobat