Estoy programando en Java en un estilo muy orientado a objetos (OO). OOP me resulta muy intuitivo, pero tengo muy poco conocimiento sobre otros tipos de programación.
¿Qué es exactamente la programación procedimental ? ¿En qué se diferencia exactamente de OOP? ¿Es lo mismo que la programación funcional ?
Solía pensar que toda la programación que no es «t OO es procedimental. Pero yo» Estoy empezando a pensar que esto no es cierto.
Comentarios
- Compartir su investigación ayuda a todos. Díganos lo que ‘ lo he intentado y por qué no satisfizo sus necesidades. Esto demuestra que se ha tomado el tiempo para intentar ayudarse a sí mismo, nos evita reiterar respuestas obvias y, sobre todo, le ayuda a obtener una mayor respuesta específica y relevante. Consulte también Cómo preguntar
- La programación procedimental no es lo mismo que la programación funcional; ‘ s en realidad es esencialmente lo mismo que la programación orientada a objetos, menos los objetos y las clases.
- La POO imperativa en realidad es programación procedimental, por lo que es exactamente lo que ‘ haces todo el tiempo …
Responder
Wikipedia tiene buenas explicaciones para estos términos. Independientemente, aquí está el resumen:
- Programación imperativa modela el cálculo como una secuencia de declaraciones que alteran el estado mutable.
- La programación procedimental es una programación imperativa que divide el código en subrutinas.
- La programación estructurada es un enfoque más disciplinado de la programación de procedimientos que prohíbe los saltos arbitrarios (por ejemplo, goto) y cambios de estado global.
-
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).
-
Programa funcional ming modela el cálculo como expresiones que (pueden) producir valores. Las funciones son valores y pueden pasarse o devolverse 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, contrariamente a la creencia popular, todavía tiene mecanismos para lograr efectos).
- Programación funcional total además prohíbe las excepciones y los bucles infinitos (una función total en matemáticas es una función que devuelve un valor para todas sus entradas).
- La programación orientada a objetos enfatiza la uso de objetos / interfaces para lograr abstracción y modularidad.
Sus relaciones son un poco complicadas porque la POO es un término bastante cargado. Puede utilizar objetos tanto en lenguajes funcionales como en lenguajes de procedimiento, pero los lenguajes que se anuncian a sí mismos 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 de programación orientados a objetos convencionales no mencionan los ADT, brindan un soporte muy deficiente para ellos y promocionan los objetos como The One True Way.
- Nadie dice Programación abstracta orientada al tipo de datos (porque sería una tontería; necesita tanto ADT como objetos).
Esto hace que la gente piense que la POO es la única forma de lograr la abstracción, y que la programación funcional y la programación orientada a objetos son de alguna manera opuestos o mutuamente excluyentes. Mucha gente también piensa que todos los lenguajes funcionales son puros y no permiten la mutación.
Además, la gente generalmente usa imperativo / procedimental indistintamente, a veces contrastándolo con OOP (implicando código sin abstracción, generalmente C) y a veces en contraste con la programación funcional.Hasta donde yo sé, el término programación estructurada ha caído en desuso (probablemente porque en este punto la mayoría de la gente da por sentado que goto y globals se consideran dañinos).
Comentarios
- » prohíbe los saltos » es bastante genérico; eso incluye if / while / etc .. quizás » prohíbe los saltos arbitrarios «?
- @Izkata Buen punto, cambiado.
- Podría valer la pena vincularlo a las entradas de la wikipedia.
- Y ese ‘ es el motivo ‘ s llamado Objeto » Orientado » y no Solo Objeto.
- @OrangeDog ¿Cómo es eso? ¿Es diferente 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, así que en ese caso, ¿en qué estado ?
Respuesta
La Programación por procedimientos es un enfoque de la programación que es uno de los componentes básicos de muchos otros diseños de lenguaje (funcional no es uno).
La mayoría de los lenguajes se incluyen en el conjunto de «Programación por procedimientos» y es probablemente el enfoque de diseño más natural para la mayoría de la gente (si piensa en términos de OO, entonces diría que es una minoría).
BÁSICO es procedimental.
Como han dicho otros, 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 de cero a muchos parámetros y, opcionalmente, devolver un valor (que entonces generalmente se llamaría una función, lo que probablemente conduciría a su confusión con los lenguajes funcionales)
El párrafo digm no dicta cuáles serán las cosas que hará, o la manera en que las cosas se transmitirán.
Simplemente describe que el programa se estructurará como una serie de procedimientos (o funciones) que operan en de manera secuencial. Luego, los datos se definen 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 en el alcance de un procedimiento dado (declarado localmente), hasta el nivel del elemento superior que llama a cosas (declarado globalmente), con ámbitos anidados entre ellos.
En un lenguaje orientado a objetos, agregar un nuevo contexto de alcance, que es el del objeto actualmente en uso, que es ortogonal al anterior.
Otra forma de pensar en el procedimiento, en comparación con el orientado 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 procedimientos donde las clases se pueden usar para agrupar procedimientos.
Responder
Programación por procedimientos definitivamente no es programación funcional.
La programación por procedimientos es cuando tienes un modelo de la computadora como una máquina en tu cabeza, y estás pensando en cómo «s modificando datos en la memoria. Entonces, primero estableces A
en el valor 3, luego agregas 1 y lo almacenas en la ubicación de memoria A
nuevamente (sobrescribiendo el valor anterior) .
La programación funcional estaría diciendo A
es 3, y B
es A + 1
, y luego dejar que la computadora descubra cómo calcular B
. Una vez que «haya definido A
, debería ser inmutable (no cambiante). Funcional también le permite hacer cosas como pasar una función como primera valor de clase (una función puede tomar una función como argumento).
La programación orientada a objetos a menudo combina ambos, y es una especie de ortogonal a ambos. Puedes usar programación funcional y devolver un objeto inmutable, y eso El objeto puede tener un método que devuelva algún valor calculado, e incluso hacerlo de manera perezosa, eso es 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 «recuperarlas», y dejar que ese objeto maneje todos los detalles de cómo eso » Ya está hecho. Eso es básicamente programación procedimental orientada a objetos.
Respuesta
OOP no es más que una forma un poco refinada de programación procedimental , 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 consta de un montón de métodos void (anteriormente conocidos como procedimientos (sic!)) y código como:
doThis(); if (state is that) doSomethingElse(); doThat();
es una programación procedimental perfecta.
Comentarios
- 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 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.
- @JohnK Los desarrolladores de Java y C # se adhieren principalmente al Principio de Responsabilidad Única – ¿Servicio de labios?
- Los desarrolladores de Java se adhieren principalmente a la Responsabilidad Única? Si solo eso fuera cierto en la vida real …