¿Cuáles son las características requeridas para la orientación de objetos?

9

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 ?

AprendizHacker
fuente
2
OOP generalmente requiere objetos . Sin embargo, es posible escribir código que se vea OOP en la mayoría de los idiomas (dudo que se pueda decir "este ensamblaje se ve OOP")
Raynos
El código anterior no usa una declaración if o un bucle . No usa multiplicación o suma. No puede usar dos líneas de código, y una lista de cosas que no se muestran, para emitir un juicio. De esas dos líneas de código, podría deducir que es un lenguaje de programación funcional estrictamente vago, no un lenguaje OO. Usar dos líneas de código como parte de una generalización no es una pregunta real.
S.Lott
El enlace también se incluye en el código anterior que juzgué. También tenga en cuenta que no es un juicio , le pregunto si esto podría considerarse POO.
ApprenticeHacker
La respuesta trivial es . Mi punto es este. No puede, a partir de ejemplos de código, emitir un juicio sobre OOP. Es una cuestión trivial de definición. O el idioma se define como un lenguaje OOP o no lo es. Es posible que algunos ejemplos de código no requieran todas las funciones de OOP. De hecho, el código OOP puede usar muy, muy pocas características. En Python, por ejemplo, 1+2realmente 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.
S.Lott
¿Qué tiene de malo usar esta definición y compararla con el idioma (no con dos ejemplos de código)? en.wikipedia.org/wiki/…
S.Lott

Respuestas:

11

Según Alan Kay, quien inventó el término "orientado a objetos",

OOP para mí significa solo mensajes, retención local y protección y ocultación del proceso estatal, y un enlace tardío extremo de todas las cosas. Se puede hacer en Smalltalk y en LISP. Posiblemente hay otros sistemas en los que esto es posible, pero no estoy al tanto de ellos.

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ó

No me gustó la forma en que Simula I o Simula 67 heredaron (aunque pensé que Nygaard y Dahl eran simplemente pensadores y diseñadores tremendos). Así que decidí dejar de lado la herencia como una característica incorporada hasta que lo entendí mejor

Michael Borgwardt
fuente
44
Exactamente, ¿cómo están Java y C # más cerca de la unión tardía que C ++?
fredoverflow
@FredOverflow: Java carga perezosamente las definiciones de clase en tiempo de ejecución cuando se usan por primera vez, y lo hace implícitamente a través de un mecanismo extremadamente flexible que permite agregar fácilmente nuevas clases o incluso generarlas sobre la marcha. C ++ requiere que vuelva a vincular su archivo ejecutable o que cargue explícitamente las bibliotecas. La situación con C # parece ser menos clara de lo que pensaba, por lo que eliminé la referencia a ti.
Michael Borgwardt
5

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_surfacepoder 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 un SDL_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 una SDL_surface, porque eso es todo lo que tiene. Es un buen ejemplo de cómo harías POO en C.

tdammers
fuente
Sin embargo, los tipos de datos abstractos, el modelado de datos y la encapsulación no son exclusivos de OO (como se menciona brevemente a sí mismo). Preferiría describir OO en función de sus características más exclusivas (enlace dinámico de llamadas a métodos, polimorfismo a través de dichas llamadas a métodos, etc.)
hugomg
4

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.

Ninguna posibilidad
fuente
2

Cuando era estudiante me enseñaron que la programación orientada a objetos se basa en tres pilares:

  • encapsulación ,
  • polimorfismo y
  • herencia .

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

type obj; // or type obj = new type;
obj.func(arg);

o

type* ptr = create_type();
func(ptr, arg); 

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.

sbi
fuente
2
Enseñar estos "pilares" probablemente haya hecho más daño que bien al mundo. La encapsulación es buena, pero eso es todo.
tdammers
1
Están en esta lista, por lo que parecen ser ampliamente aceptados: en.wikipedia.org/wiki/…
S.Lott
¿Puedes explicar por qué el polimorfismo y la herencia son malos?
MathAttack
@MathAttack: ¿Me estás hablando a mí? Porque ciertamente no lo dije.
sbi
1
@missingno: Algo no tiene que ser exclusivo de algún paradigma para ser considerado importante para distinguir el paradigma. La encapsulación ya no tiene que ser exclusiva de OOP, ya que las funciones deben ser exclusivas de la programación estructurada.
sbi
2

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.

Joonas Pulakka
fuente
2

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:

  • La encapsulación está bastante bien proporcionada por Ada83;
  • Oberon proporciona la herencia (Oberon es interesante, Wirth quería proporcionar un lenguaje OO con la menor cantidad de información posible, pero tuvo que revisar su concepción para obtener uno: Oberon-2 es OO).
Un programador
fuente
1

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.

Makach
fuente
3
Definido por quien?
Michael Borgwardt