Me pregunto, ¿cuáles son exactamente las características que debe proporcionar un lenguaje o una biblioteca para que se defina como 'Orientado a objetos'? ¿La Orientación de objetos es algo que se puede lograr más o menos en cualquier lenguaje de programación de propósito general con características decentes? ¿O es algo que solo se puede lograr en lenguajes que anuncian específicamente que son compatibles con la programación orientada a objetos?
Por ejemplo, mire el siguiente código C:
SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );
o el código discutido aquí .
Ahora el código anterior no usa herencia, tiempo de ejecución-polimorfismo (?), Funciones virtuales, etc. Pero me parece bastante POO.
¿La Orientación a objetos simplemente escribe código que se basa en estructuras de datos creables y destruibles, como objetos, clases, estructuras, etc., que no requiere ningún patrón especial o características proporcionadas por el lenguaje de programación o una biblioteca ?
fuente
1+2
realmente está orientado a objetos. Es un constructor que construye un nuevo objeto a partir de dos objetos existentes. El uso de ejemplos de código no revela nada.Respuestas:
Según Alan Kay, quien inventó el término "orientado a objetos",
La mensajería (como se implementa en Smalltalk) es un concepto comparable al polimorfismo, pero bastante más poderoso (al menos que el tipo de polimorfismo soportado por C ++ o Java). Se puede hacer en todos los idiomas, pero es bastante doloroso si no es compatible directamente con el idioma. Básicamente significa que los objetos pueden enviarse mensajes que contienen cualquier cosa, amd puede reaccionar como quieran los mensajes que reciben. Para admitir completamente la mensajería, debe haber una forma para que los objetos reaccionen de manera flexible a los mensajes sin enumerarlos en el código fuente (que es básicamente lo que hacen las definiciones de método / función).
La retención y protección local y la ocultación del proceso de estado (encapsulación AKA) se pueden realizar por convención en todos los idiomas, pero eso es un poco engañoso. La retención local en el nivel de idioma en realidad parece ser la única característica que comparten todos los idiomas que afirman ser OO (y muchos que no lo hacen): generalmente hay una forma de crear tipos de datos compuestos con múltiples instancias. La protección y el ocultamiento, por otro lado, a menudo solo se realizan por convención.
enlace tardío de todas las cosas : una escala móvil en la que C está muy lejos de la visión de Kay (como es C ++, mientras que Java está mucho más cerca). Se puede falsificar (ver COM), pero será difícil de usar.
Tenga en cuenta que Kay no menciona la herencia . En el mismo correo electrónico escribió
fuente
La programación orientada a objetos no se trata de características de sintaxis, es una filosofía de codificación y diseño. En su núcleo se encuentra el concepto de un objeto , que es una construcción que agrupa el estado con rutinas para actuar sobre él (o, según su punto de vista, las respuestas a los mensajes). El otro aspecto importante de OOP es la encapsulación : envolver detalles de implementación en estructuras opacas y conectarlas a través de interfaces bien definidas. Casi todo lo demás en la teoría OOP se remonta a estos dos fundamentos.
Por lo tanto, cualquier lenguaje que de alguna manera pueda modelar objetos (entidades que contienen datos y código) y la encapsulación se puede usar para hacer POO. Por ejemplo, en C puede usar punteros de función para almacenar funciones en estructuras, y puede usar el sistema de archivos de encabezado / fuente para realizar la encapsulación. No es conveniente, pero es suficiente para hacer POO. Probablemente incluso pueda doblar algo como Haskell o ML para hacer OOP, y no me sorprendería si alguien pudiera encontrar una forma de hacer OOP en conjunto.
Sin embargo, en términos prácticos, un lenguaje puede llamarse 'orientado a objetos' si proporciona un conjunto completo de características de sintaxis para la programación orientada a objetos explícita. Por lo general, esto significa que dicho lenguaje debería tener: * una noción de un objeto * una noción de llamada al método o transmisión de mensajes * una forma cómoda y directa de controlar el acceso a los miembros del objeto * una forma cómoda y sencilla de definir interfaces
En consecuencia, llamaría a un fragmento de código orientado a objetos si se adhiere a los principios de OOP y utiliza la sintaxis de OOP disponible.
Por cierto., El ejemplo de código, probablemente, hace uso de polimorfismo y funciones virtuales, aunque la sintaxis de C no lo hace evidente. No soy un experto en SDL, pero esperaría
SDL_surface
poder representar varios tipos diferentes de superficies, cada una con su propio conjunto específico de implementaciones: colocar algo en un mapa de bits de memoria y hacerlo en una superficie de pantalla requiere radicalmente diferentes código, pero la interfaz (las funciones que toman unSDL_surface*
como argumento) sigue siendo la misma. Solo así, también implementa la encapsulación: no puede acceder directamente a la representación subyacente de una superficie, debe pasar por funciones que sepan cómo manejar unaSDL_surface
, porque eso es todo lo que tiene. Es un buen ejemplo de cómo harías POO en C.fuente
Comprendo que OO es que OO es una forma de pensar y una implementación que se basa en la idea de que un trabajador (objeto) o una colaboración de trabajadores individuales (objetos) pueden realizar una tarea computacional a través del mensaje que pasa entre esos trabajadores ( objetos) en tiempo de ejecución. Este comportamiento en tiempo de ejecución requiere construcciones estáticas sólidas y dinámicas para habilitarlo.
La sintaxis específica para implementar OO no es la clave que determina si un idioma es un OO o no. Por ejemplo, Smalltalk y C # tienen diferentes sintaxis, pero ambos son lenguajes OO (en diversos grados). La clave es si el lenguaje dado conserva la filosofía (arriba) y proporciona los medios de implantación necesarios.
fuente
Cuando era estudiante me enseñaron que la programación orientada a objetos se basa en tres pilares:
Un lenguaje tendrá que soportar esas características para ser considerado un lenguaje orientado a objetos.
Tenga en cuenta que esto describe un conjunto de características, en lugar de la sintaxis . Por lo tanto, si tienes que escribir
o
no importa
Por lo tanto, puede programar según el paradigma orientado a objetos en C. Pero el lenguaje no ofrece soporte para esto, lo que lo convierte en un ejercicio bastante doloroso. Es por eso que C no se considera un lenguaje orientado a objetos.
fuente
Usted puede hacer OO en cualquier lenguaje de propósito general decente.
Es más fácil hacerlo en un lenguaje "OO", porque tienes construcciones idiomáticas disponibles y no tienes que recurrir a algo como OO en C , lo cual es posible, pero horrible.
Si las construcciones OO son proporcionadas por el propio lenguaje, por su biblioteca estándar o por alguna otra biblioteca, no importa mucho, ya que algunos lenguajes (por ejemplo, Scala) permiten que las bibliotecas agreguen construcciones de lenguaje para que desde el punto de vista del programador sea casi imposible para distinguir qué cosas proporciona el lenguaje central y cuáles una biblioteca.
fuente
Si observa la variedad de idiomas que han sido ampliamente aceptados como OO y aquellos que no lo han hecho, la prueba parece ser el soporte para el polimorfismo de inclusión (también conocido como polimorfismo de subtipo, pero el polimorfismo de inclusión es el término utilizado por Cardelli en el artículo que me presentó, y creo que muchos otros, a una clasificación de tipos de polimorfismo). Es decir, la posibilidad de que algunas variables tengan valores de diferentes tipos y la posibilidad de que algunas llamadas se despachen a diferentes rutinas dependiendo del tipo de uno o varios valores. Todo lo demás ha estado presente en idiomas no aceptados como OO o falta en idiomas bien aceptados como OO.
Las otras dos características principales asociadas con los idiomas OO han sido proporcionadas por idiomas no OO:
fuente
La orientación a objetos se define como
También echa un vistazo a las entradas de Wikipedia. Esas son las características que debe proporcionar un lenguaje para que se defina como orientado a objetos.
considere su código orientado a objetos si está en un lenguaje de programación orientado a objetos. incluso si escribe algo que parece ser de procedimiento, actuará sobre métodos en objetos de clases que usan polimorfismo a través de encapsulación [tal vez] :)
con respecto a su última pregunta, la respuesta es probablemente. si. orientado a objetos es básicamente actuar sobre métodos en objetos y pasar esos objetos como parámetros.
fuente