2009-02-10 31 views
28

Soy bastante nuevo en la programación, pero he estado leyendo algunas discusiones interesantes sobre StackOverflow sobre diversos enfoques de programación. Todavía no estoy 100% claro sobre cuál es la diferencia entre la programación de procedimientos y la programación orientada a objetos. Parece que la programación orientada a objetos todavía usa procedimientos (métodos) pero todo se organiza de forma diferente porque el objeto es la estrella del espectáculo. Pero me parece que los procedimientos todavía te permiten hacer las mismas cosas. Al igual que en C, puede poner todos sus procedimientos similares en una biblioteca. Entonces, ¿no podría decir realmente que una biblioteca en C es similar a un objeto en C++?¿Cuál es la diferencia entre un programa de procedimiento y un programa orientado a objetos?

+0

Cf. [esta vieja pregunta SO] (http://stackoverflow.com/questions/552336/oop-vs-functional-programming-vs-procedural) – jogojapan

+1

Se pudo mover a los programadores SO tal vez – Kromster

Respuesta

13

La diferencia entre los dos es sutil pero significativa.

En un programa de procedimientos, los módulos interactúan mediante el estado de lectura y escritura que se almacena en las estructuras de datos compartidas.

En un programa orientado a objetos, los módulos en forma de objetos interactúan enviando mensajes a otros objetos.

+0

Tengo una duda. ¿Es Java un lenguaje de procedimiento? –

6

La diferencia es que los objetos tienen procedimientos y datos relacionados en el mismo lugar: los lenguajes de procedimiento usan 'estructuras' (cosas que mantienen datos relacionados entre sí) que mantienen los datos separados de los procedimientos. De hecho, todo lo que haga en un idioma OO debe ser posible en un lenguaje de procedimientos con una combinación de estructuras y procedimientos.

La principal diferencia es la mentalidad que un lenguajes OO pone en programadores.

1

Ésta es una respuesta simplificada.

  • En un verdadero idioma OO, la única codificación de procedimiento se realiza dentro de un objeto.

  • C no tiene objetos y C++ es un lenguaje que admite objetos. Java, por otro lado, todo es un objeto (excepto las primitivas). Todo está tipeado

  • La progresión lineal ocurre dentro de los objetos, pero los objetos en sí mismos son colecciones de código y datos.
+0

'... a los objetos en sí mismos son solo colecciones de código y datos. ' –

+0

@Richard, gracias por señalar mi omisión. Lo corregiré. – WolfmanDragon

21

Puede programar proceduralmente en la mayoría de los lenguajes OO, pero la potencia de OO proviene de la capacidad de heredar, encapsular y abstraer esa lógica de procedimiento. Creo que tiene razón, una biblioteca debe parecerse mucho a una clase. Debe tener su propio alcance y encapsular la lógica detrás de funciones con nombres significativos.

+3

Para complementar su respuesta, la herencia, la encapsulación y el polimorfismo son los tres pilares de OOP. –

4

El procedimiento es parte de la distinción procedural/funcional/lógica (o lógica) (compare c, lisp y prólogo) entre las diferentes formas de describir lo que un programa debería hacer.

La orientación de objetos es ortogonal a esta otra idea, y describe un modo de agrupar subprogramas con datos. C++ y Java son lenguajes de procedimiento con características orientadas a objetos; fortran77 es un lenguaje de procedimientos sin características orientadas a objetos. El lisp común admite la orientación del objeto; algunos ceceos más viejos no. El prólogo simple de vainilla no admite objetos, y no puedo nombrar un lenguaje orientado a la lógica que sí lo haga (no hago programación orientada a la lógica, está en mi lista de cosas que hacer cuando tengo tengo un montón de tiempo libre. apenas hacer programación funcional).

Como otros han señalado, sin embargo, el pensamiento orientado a objetos adecuado cambia la forma en que hace su programación tanto como un cambio de procedimiento a funcional.


BTW-- veo "de procedimiento" que se utiliza mucho para distinguir no orientado a objetos lenguajes procedimentales de sus hermanos orientados a objetos, pero creo que este es un uso deficiente impulsado por la falta de un adjetivo limpia para "no orientado a objetos". YMMV.

+0

"orientado a la lógica"? ;-P – Shog9

+0

En lugar de "lógico" para evitar un desastre como "No puedo nombrar un lenguaje lógico ..."? Sí, puedo ver eso. – dmckee

+0

@ Shog9: ¿Eso es mejor? – dmckee

31

En un programa de procedimiento, el código es el rey y los datos están subordinados. En otras palabras, usted tiene programas que actúan en base a datos y, por lo general, no están estrechamente vinculados.

En el mundo OO, los objetos son lo principal de interés. Un objeto consta de los datos y del código que puede actuar sobre esos datos, y están muy vinculados. Es el concepto de encapsulación, el ocultamiento de la información.

Un ejemplo, digamos que tiene un número y desea duplicarlo. Una forma de procedimiento de hacer esto es:

n = n * 2 

El código aquí multiplica de manera bastante explícita n por 2 y almacena el resultado en n.

La forma OO de hacer esto es enviar un "mensaje" al objeto número diciéndole que se duplicará en sí:

n.double(); 

La ventaja de esto se llama polimorfismo. Qué sucede cuando decides que quieres poder duplicar una cadena como "bob". En el mundo de los procedimientos, tendrías que proporcionar más código para doblar, pero también tendrías que llamar a ese código de manera diferente.

Con OO, crea un objeto de cadena que también puede tomar el mensaje 'doble'. El código para duplicar una cadena pertenece al objeto de cadena por lo que sabe que tiene que actuar de manera diferente al objeto de número. Si se decidió que "bob" * 2 era "BobBob", el código sería algo como:

class number:     class string: 
    int n       char array s 
    procedure double:    procedure double: 
     n = n * 2      s = string_join(s,s) 

entonces se podría llamar x.double() no importa qué tipo real x era (número o cadena) y sabría qué código ejecutar, esto simplifica enormemente su código. Puede doblar enteros, cadenas, matrices, números complejos, reales, tamaños de ventana en su monitor y todo tipo de cosas diferentes.

Y tienes razón, una biblioteca C se puede hacer que se parezca un poco a objetos. El ejemplo clásico es stdio.h - nunca te importa lo que a FILE* realmente señala, solo el hecho de que se comportará de cierta manera. El FILE*, fopen(), fclose() y otras funciones son una clase de clases que representan las capacidades de E/S de C.

+0

Excelente explicación. Me sorprende que se haya elegido esta como la mejor respuesta. Creo que esto realmente lo clavó. –

+0

Pregunta: Entiendo cómo su ejemplo representa el concepto de polimorfismo, pero no estoy seguro de cómo representa la encapsulación: ¿se debe a que la doble funcionalidad ahora está envuelta en una pequeña funcionalidad modular llamada método? ¿Tan pronto como tenemos un método, tenemos encapsulación? –

+1

@WO, la encapsulación es la ocultación de datos o código. La encapsulación de código es lo que permite el polimorfismo ya que el código ahora pertenece al objeto en lugar de tener un código externo que actúa sobre un objeto. Usted le dice al objeto qué hacer, no cómo hacerlo. Sabe cómo hacerlo. Encaps/polymorph están estrechamente relacionados. – paxdiablo

8

OO es principalmente un conjunto de ideas. Puede programar OO en C (si realmente desea ...), y puede tener perfectamente código de procedimiento en C++/Java; lo que quiero decir es que, incluso si usas clases en la superficie, aún podría ser de procedimiento.

La idea detrás de OO es la abstracción del estado. En lugar de "pensar" en términos de "agrupaciones de datos", "piensas" en términos de "objetos", donde un objeto es una "interfaz" para "agrupar datos y formas de manipular estos datos".

todo suena filosófica, porque es .

Hay mucho que decir aquí, y no se puede decir todo en una pequeña publicación SO, así que lo dejo aquí.

ACTUALIZACIÓN
Como se mencionó en Flanagan's answer, lenguajes orientados a implementar las construcciones que utilizan esta abstracción.

Es decir, técnicamente podría "piratear" las clases y el polimorfismo en términos de estructuras, funciones y punteros a las funciones.

He aquí un ejemplo de OO in C

0

muchos puntos interesantes ya mencionados aquí.

Una forma de pensarlo es que en OO, tiene la idea de 'objetos' que son cosas que tienen características y comportamientos inherentes a ellos. Por lo general, tienen algún tipo de 'interfaz' pública que proporciona un mecanismo para recuperar cierta información sobre ellos, pero el objeto en sí, o más bien su 'clase', limita qué información está disponible públicamente. Las entrañas del objeto no están expuestas al público porque normalmente no es necesario conocer los detalles sucios debajo del capó del objeto. Así que los programas orientados a objetos utilizan esta construcción, así como otras cosas.

La programación procedural no suele utilizar dicho acoplamiento de datos y comportamiento en un 'objeto'. Lo he visto en C antes, pero no era muy bonito y estaba involucrado demasiado en el mundo de los monos como para aproximarme a lo que uno podría hacer con, digamos, C++.

Una de las ideas detrás del desarrollo orientado a objetos es que no debería ser capaz de ensuciar tus datos con otros medios que no sean los que has proporcionado. Si me proporciona solo una interfaz bien pensada, puede mantenerme honesto. Ahora, si usa un enfoque de procedimiento y me envía una estructura que no tiene protecciones integradas, entonces puedo hacer lo que me plazca y si soy tonto o malvado, puedo cambiar las cosas que quizás no quiera que haga. cambio.

De acuerdo, puede eludir el objeto si es inteligente, pero tiene que salir del camino para hacerlo.

Esto no es completo, pero es un aspecto.

0

La forma en que se implementa C++ solo hace que la programación OO se parezca mucho a la programación de procedimientos. Tienes que cambiar tu forma de pensar un poco.

En C++ los objetos tienen métodos que son solo procedimientos que actúan sobre el objeto. Pero en un OO paradiam real deberías pensar en los métodos como posibles mensajes que el objeto puede recibir (es decir, cartas). El objeto recibe un mensaje (los parámetros representan la carga útil del mensaje, es decir, el contenido de la carta) y cambia su estado según el mensaje.

9

En mi humilde opinión, la programación orientada a objetos es un concepto que existe a un nivel más alto de abstracción que la programación de procedimientos. Los dos no son mutuamente excluyentes ya que los métodos individuales en un programa OO se parecen mucho a las funciones individuales en un programa de procedimientos. Esto contrasta con, por ejemplo, la programación funcional, que requiere una mentalidad completamente diferente. Además, puede escribir proceduralmente en un lenguaje OO haciendo que todo sea estático, etc. Puede ser un compilador humano y escribir efectivamente código OO en C usando muchos punteros de función y fundición de puntero estructural.

OO, entonces, es más una filosofía de diseño y visión del mundo que algo con una definición rigurosa. Requiere que la herencia, el polimorfismo, etc. se usen como patrones principales en la estructuración de su código, y que se proporcione la sintaxis para hacer que estos sean expresables sin recurrir a trucos de bajo nivel. Requiere que piense en el código que actúa sobre el estado de una colección de datos como una propiedad de los datos, no en un procedimiento que existe por sí mismo. No es blanco y negro Su código puede ser OO "más" o "menos", dependiendo de qué tanto confíe en la herencia, el polimorfismo, las clases y la cosmovisión de "métodos como propiedad de datos" como medio para estructurar y explicar/comprender su código.

+0

Buen punto en la diferencia entre el código OO frente al código de procedimiento y los lenguajes OO frente a los lenguajes de procedimiento. Upped –

6

[perdón por el estilo de imprimación, es tarde y estoy cansado]

procedimientos de datos de proceso - datos en, aplicar un poco de procesamiento, obtener datos

veces, algunos de los elementos de datos están relacionados con algunos de los otros elementos de datos, y es conveniente agruparlos en una estructura de datos , que luego se puede manipular y tratar como una sola unidad.

ahora nuestro procedimiento puede tener una estructura de datos como entrada y alterarlo y/o producir otra estructura de datos como salida

vez en cuando nos damos cuenta de que algunos procedimientos sólo se preocupan de un cierto tipo de estructura de datos; es conveniente agrupar estos procedimientos junto con su estructura de datos, y llamarlo objeto.

una plantilla para crear objetos se llama clase; un objeto se dice que es un ejemplo de una clase

se puede notar que una clase es muy parecido a otro, así que en vez de copiar y pegar el código que deje una clase hereda de otro: el subclase hereda de la superclase o "clase base". De esta manera, la subclase tiene acceso a todas las estructuras de datos y procedimientos de la superclase, y puede aumentarlos o anularlos de ciertas maneras

si cortésmente le solicitamos a un objeto que haga algo por nosotros en lugar de llamar brutalmente a sus procedimientos directamente , esto se llama mensaje pasando, incluso si no se transmite un 'mensaje' real. La alegría aquí es que muchos tipos diferentes de objetos pueden entender el mismo mensaje, lo que lleva a la noción de polimorfismo. Por ejemplo, podemos solicitar muchos tipos diferentes de documentos para imprimir ellos mismos, y cada uno responde adecuadamente.

un lenguaje que admite objetos (a través de clases o no) con transmisión de mensajes y la herencia se llama orientado a objetos. Si no hay herencia, el lenguaje es simplemente basado en objetos.

¡buena suerte con tus estudios!

+4

¡Esto es excelente! No puedo imaginar cómo hubiera sido si no hubieras estado cansado. Estoy guardando esto. –

+0

@ [Willem Obst]: Gracias - si tuviera más tiempo, hubiera sido más corto ;-) –

+4

¡Guau!Deseo que más de mis maestros puedan explicar las cosas tan claramente como lo han hecho aquí. ¡Gracias por tu contribución! –

2

Es más fácil de entender en contexto, mira otras abstracciones introducidas entre los idiomas.

Una diferencia clave entre el lenguaje ensamblador y un lenguaje de procedimiento como C o Pascal es la introducción de la abstracción de "procedimiento". Las personas que escriben código ensamblador crean procedimientos, pero es duro y propenso a errores, un lenguaje de procedimientos le brinda herramientas para hacerlo más fácil.

La diferencia entre un lenguaje de procedimiento y un lenguaje OO como C++ es la abstracción de "objeto". Las personas que escriben "c" a menudo crean objetos conceptuales but its difficult and error prone, un lenguaje OO le brinda herramientas para hacerlo más fácil.

Cosas como Sing# de Microsoft (o Erlang) agregan la abstracción de mensaje/proceso al idioma. Claro, puede hacer pasar mensajes y crear procesos en ensamblador, C o C++, pero Sing # lo hace más fácil.

Todo se reduce al mismo código de máquina, estas abstracciones son puramente beneficiosas para nuestros cerebros, no para la computadora.

15

Tiene razón en su observación de que los programas orientados a objetos se basan de muchas maneras en el paradigma de procedimiento. También tienes razón en que, sintácticamente, todo lo que realmente sucede es que invocas funciones. De hecho, podría implementar muchas características de los lenguajes orientados a objetos utilizando mecanismos de procedimiento (por ejemplo, punteros de funciones en C++). Por lo tanto, podría hacer un diseño orientado a objetos y aún implementarlo en un lenguaje de procedimientos (por ejemplo, como lo hicieron los viejos compiladores de C++).

La importancia del paradigma orientado a objetos no es tanto en el mecanismo de lenguaje como en el proceso de pensamiento y diseño. En la programación de procedimientos, la idea es sobre operaciones y romper esas operaciones utilizando otras operaciones, agrupándolas en módulos, etc. Esto significa que los datos o el estado tienen una importancia secundaria. Es como pensar en operaciones matemáticas.

El paradigma orientado a objetos, por otro lado, dice que necesita pensar en estados y operaciones juntos como una entidad, y luego diseñar su programa como interacciones entre entidades que intercambian estado y activan operaciones.

1

Depende de cómo defina OOP. En términos de OOP tipo Java donde se llaman métodos sobre objetos, la programación de procedimientos es más o menos la misma. Por lo que puedo decir, puedes emular todos los principios OOP (encapsulación, abstracción, polimorfismo, herencia) en un lenguaje de procedimiento como C. La prueba de esto es GObject, hasta cierto punto Objective-C, y muchas otras implementaciones de lenguaje OOP que usan C, como cPython. Esto se hace mediante el uso de las estructuras y el funcionamiento de esas estructuras que utilizan funciones:

typedef struct { 
    Object *isa; 
    String *name; 
    Date *birthday; 
} Person; 

Person *Person_new(); 
String *Person_name(Person *self); 
void Person_setName(Person *self, String *newName); 
// ... 

La interfaz de programación orientada a objetos es muy similar. Realmente no permite el polimorfismo, pero también es posible. Es muy similar a una interfaz de Python, excepto que los atributos están separados de los "métodos":

class Person(object): 
    def __init__(self): 
     self._name = "" 
     self._age = datetime.datetime.now() 

    @property 
    def name(self): 
     return self._name 

    @property 
    def age(self): 
     return self._age 

I eligieron Python para el ejemplo porque "auto" es explícita, como en el ejemplo C. Muchos lenguajes OOP, como Java, resumen esto.

También hay un OOP similar a Smalltalk donde los mensajes se envían a los objetos, en lugar de los métodos de llamada en los objetos. La diferencia es sutil a primera vista, pero proporciona mucha potencia y flexibilidad. Esto también se puede implementar en los lenguajes de procedimiento, como lo demuestra Objective-C.

La programación orientada a objetos no es necesariamente un tipo de lenguaje, sino más bien un paradigma. Los lenguajes orientados a objetos como Java, Python, Ruby, etc., proporcionan azúcar sintáctico para manipular fácilmente objetos, y esta es la principal diferencia entre "lenguajes de procedimiento" y "lenguajes orientados a objetos".

De hecho, una biblioteca, o más bien un conjunto de funciones que operan en una estructura, es lo mismo que un objeto en C++. De hecho, C++ se implementa de esa manera.

0

Para obtener un ejemplo bastante directo de la diferencia entre procedimientos y OO, intente aprender Smalltalk. En Smalltalk, todo, y quiero decir que todo es un objeto. No hay declaraciones if o while-loops. Usted logra esa funcionalidad enviando mensajes a (a.k.a. invocar métodos en) otros objetos. Realmente hace que la cabeza le dé vueltas al principio, pero creo que asimilará rápidamente lo que se supone que es OO.

2

En un programa de procedimiento, divide un gran problema en pequeños problemas y abstrae cada uno de estos pequeños problemas como un procedimiento. Esto se llama abstracción de procedimiento.

En programas orientados a objetos, analiza un problema como algunos objetos y la interacción entre objetos. Esto se llama abstracción de objetos.

2

La diferencia es la programación orientada

Procedimiento - da importancia al algoritmo en lugar de data.This modo de programación se centra en los procedimientos es decir los métodos para llevar a cabo tareas específicas y compartir su estructura de datos. Sigue estructuras de arriba hacia abajo.

ejemplo: Pascal y C de programación orientado

Object - da importancia a los datos en lugar de algoritmo. Sigue estructuras bottom-up. Cada cosa se ve como un objeto. Cada objeto tiene su propia estructura y procedimiento de datos. Incluye funciones como ocultación de datos, polimorfismo, encapsulación y transmisión de mensajes. Los usuarios realmente no tienen que molestarse con lo que están dentro de estos objetos, mientras los usan en sus programas.

ejemplo: C++ y Java

Cuestiones relacionadas