una sirve que programacion para orientada objetos objeto miembros ejemplos clases clase caracteristicas c++ c oop procedural-programming

c++ - sirve - ¿Cuál es la diferencia entre un programa de procedimientos y un programa orientado a objetos?



programacion orientada a objetos pdf (17)

Soy bastante nuevo en 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 ++?


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 procedimientos como C. 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 usando estructuras y operando en esas estructuras usando 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 es muy similar a OOP. 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

Elegí Python para el ejemplo porque "self" es explícito, como en el ejemplo de 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 llamar a los métodos 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 un paradigma. Los lenguajes orientados a objetos como Java, Python, Ruby, etc., proporcionan azúcar sintáctico para manipular fácilmente los objetos, y esta es la principal diferencia entre los "lenguajes de procedimiento" y los "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.


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 a objetos es ortogonal a esta otra idea, y describe un medio para 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 un tiempo libre abundante. Apenas hago programación funcional).

Como otros han notado, 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.

Por cierto, veo que "procedural" usó mucho para distinguir lenguajes de procedimientos no orientados a objetos de sus hermanos orientados a objetos, pero creo que este es un uso pobre impulsado por la falta de un adjetivo limpio para "no orientado a objetos". YMMV.


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 una 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 "métodos como una propiedad de los datos" como medio para estructurar y explicar / comprender su código.


Esta es una respuesta simplificada.

  • En un verdadero lenguaje 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 mismos son solo colecciones de código y datos.

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 estructuras de datos compartidas.

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


La diferencia es que los objetos tienen procedimientos y datos relacionados en el mismo lugar: los lenguajes de procedimiento usan ''estructuras'' (elementos que mantienen unidos los datos relacionados) 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 lenguaje de OO pone a los programadores.


La forma en que se implementa C ++ solo hace que la programación de 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 en función del mensaje.


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 procedimental 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 por 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, puedes burlar el objeto si eres inteligente, pero tienes que salir del camino para hacerlo.

Esto no es completo, pero es un aspecto.


Para obtener un ejemplo imparcial de la diferencia entre procedimiento 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 (también conocidos como métodos de invocación) a 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.


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


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 función en C ++). Por lo tanto, podría hacer un diseño orientado a objetos e 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 del 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 debe pensar juntos en estado y operaciones como una entidad, y luego diseñar su programa como interacciones entre entidades que intercambian estado y activan operaciones.


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

los procedimientos procesan los datos: los datos ingresan, aplican algún procesamiento, obtienen datos

a 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 tomar una estructura de datos como entrada y alterarla y / o producir otra estructura de datos como salida

ocasionalmente notamos que algunos procedimientos solo se refieren a un cierto tipo de estructura de datos; es conveniente agrupar estos procedimientos junto con su estructura de datos y llamarlo un objeto .

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

podemos notar que una clase es muy parecida a otra, así que en lugar de copiar y pegar el código, dejamos que una clase herede de otra: la subclase hereda de la superclase o "clase base". De esta forma, la subclase tiene acceso a todas las estructuras de datos y los procedimientos de la superclase, y puede aumentarlos o anularlos de ciertas maneras

si cortésmente le pedimos a un objeto que haga algo por nosotros en lugar de llamar brutalmente a sus procedimientos directamente, esto se denomina transmisión de mensaje , 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 conduce a la noción de polimorfismo . Por ejemplo, podemos solicitar muchos tipos diferentes de documentos para imprimirlos, y cada uno responde adecuadamente.

un lenguaje que admite objetos (a través de clases o no) con paso de mensajes y herencia se llama orientado a objetos . Si no hay herencia, el lenguaje está simplemente basado en objetos .

¡Buena suerte con sus estudios!


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 consiste en datos y el 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 tienes un número y quieres duplicarlo. Una forma procedimental de hacer esto es:

n = n * 2

El código aquí multiplica explícitamente n por 2 y almacena el resultado nuevamente en n.

La manera OO de hacer esto es enviar un "mensaje" al objeto de número diciéndole que se duplique a sí mismo:

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 decidiera que "bob" * 2 era "bobbob", el código sería algo así como:

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

Entonces podría llamar a x.double () sin importar qué tipo de letra era x (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 puede parecer un poco como objetos. El ejemplo clásico es stdio.h : nunca te importa lo que apunta un FILE* , 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.


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 los programas orientados a objetos, analiza un problema como algunos objetos y la interacción entre objetos. Esto se llama abstracción de objetos.


La diferencia es

Programación orientada a procedimientos: le da importancia al algoritmo en lugar de a los datos. Esta forma de programación se centra en los procedimientos, es decir, los métodos para realizar tareas específicas y compartir su estructura de datos. Sigue estructuras de arriba hacia abajo.

ejemplo: Pascal y C

Programación orientada a objetos: le da importancia a los datos en lugar de a los algoritmos. 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


Es más fácil de entender en contexto, mira otras abstracciones introducidas entre 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 de OO como C ++ es la abstracción de "objeto". Las personas que escriben "c" a menudo crean objetos conceptuales pero es difícil y propenso a errores , un lenguaje OO le brinda herramientas para hacerlo más fácil.

Cosas como Sing # de Microsoft (o Erlang) agregan la abstracción 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 para beneficio de nuestros cerebros, no de la computadora.


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 "agrupamiento 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ófico, porque lo es .

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

ACTUALIZAR
Como se menciona en la respuesta de Flanagan , los lenguajes OO implementan construcciones que utilizan esta abstracción.

Quiero decir, técnicamente puedes "piratear" las clases y el polimorfismo en términos de estructuras, funciones y punteros de función.

Aquí hay un ejemplo de OO en C