2008-10-30 20 views
8

He oído mucho sobre Ruby y posiblemente incluso Javascript sea "verdadero" lenguaje orientado a objetos en comparación con C++ y C# que son lenguajes orientados a clases (o basados ​​en plantillas). ¿Qué se entiende por verdadero OO y cuáles son las ventajas de este sobre el enfoque de clase/plantilla?Lo que significa el término orientación de objeto "verdadero"

Respuesta

13

Es un término subjetivo usado para promocionar idiomas. Lo he visto decir que C# y Java son verdaderos lenguajes orientados a objetos en comparación con C++ porque todo debe estar en una clase (sin funciones o variables globales) y todos los objetos heredan de una clase Object.

Para Ruby, que puede refiere a la forma en Rubí trata todo como un objeto, por lo que se podría escribir 1.to_s, en lugar de algo así como str(1) o String.valueOf(1). Esto se debe a que Ruby no hace distinción entre el valor y las variables de referencia. En Javascript no hay clases y solo crea objetos extensibles que podrían clonarse para su reutilización, este estilo de programación se conoce como Prototype-based programming.

C++, por otro lado, se anuncia como un lenguaje multi-paradigma que le permite utilizar varios enfoques, como la programación orientada a objetos, genérica y de procedimiento. No se adhiere a un paradigma.

Pero sí, es solo un término subjetivo que podría significar cualquier cosa. En general, se refiere a si el idioma pone más énfasis en los objetos que en otros elementos del lenguaje como funciones, plantillas, etc.Wikipedia's article on SmallTalk lo llama un lenguaje 'puro' orientado a objetos, y la descripción se aplica a Ruby, así:

Smalltalk es un lenguaje orientado a objetos 'puro', sentido de que, a diferencia de Java y C++, no hay ninguna diferencia entre valores que son objetos y valores que son tipos primitivos. En Smalltalk, valores simples, como enteros, booleanos y caracteres son también objetos, en el sentido de que son instancias de clases correspondientes, y operaciones en ellos son invocados por el envío de mensajes. Un programador puede cambiar las clases que implementan valores primitivos, de manera que el nuevo comportamiento puede definirse por sus casos - por ejemplo, para poner en práctica nuevas estructuras de control - o incluso por lo que su comportamiento existente será cambiado . Este hecho se resume en la frase comúnmente escuchada "En Smalltalk todo es un objeto" (que sería más exactamente expresado como "todos los valores son objetos", como variables no lo son).

+1

Me gustaría agregar que si el lenguaje es puro/verdadero orientado a objetos no hace que el lenguaje sea mejor o peor que el de su competidor. Descubrirá que generalmente se anuncia como mejor, pero eso es muy subjetivo. –

+0

@he_the_great: Es cierto, pero considere que un lenguaje que solo sigue una metáfora/paradigma es más fácil de entender y de aprender que solo eso combina diferentes paradigmas. Entonces, si mezclar diferentes paradigmas no agrega ningún poder expresivo, solo agrega complejidad. Por ejemplo, el hecho de que los tipos primitivos de Java no sean objetos solo agrega complejidad al lenguaje sin agregar poder expresivo. – Giorgio

-1

No estoy seguro de la distinción que desea de los ejemplos proporcionados. ¡Pero sí sé lo que no es! Cuando OO se atornilla a un idioma como una idea de último momento, p. Perl OO.

2

El problema de C++ es el siguiente. Las clases de C++ existen solo en la sintaxis de origen. No hay ningún objeto de clase en tiempo de ejecución con atributos y métodos.

En Python, todo es un objeto. La clase de un objeto es otro objeto, con sus propios métodos y atributos. Esto también es cierto para el entorno smalltalk, que es una especie de punto de referencia de la orientación a objetos.

Creo que la orientación al objeto "verdadero" se refiere a aquellos entornos donde todo es un objeto.

[Java está a la altura de este, ya que tiene los tipos primitivos.]

+0

Eso está mal. Objeto orientado a objetos en cualquier idioma existe solo en tiempo de programación. En el tiempo de ejecución, solo se trata de llamadas a funciones con instrucciones simples junto con "código de pegamento" que lo hacen sentir "dinámico" u "orientado a objetos". Cualquier compilador una vez tiene un árbol de programas y luego comienza a producir código en lenguaje de máquina que no tiene objetos, ni atributos, ni métodos. solo simples cmp, instrucciones de JMP. –

2

Creo que puede estar refiriéndose a Prototype Based Programming, un Programming Paradigm en los cuales:

Las clases no están presentes, y la reutilización de comportamiento (conocido como herencia en lenguajes basados ​​en clases) se realiza a través de un proceso de clonación de objetos existentes que sirven como prototipos. Este modelo también se puede conocer como programación sin clase, prototipo o basada en instancias.

Véase también Ruby singleton methods.

1

Un lenguaje orientado a objetos "Verdadero" o "Puro" por lo general se refiere a los idiomas en los que todo es un objeto de primera clase, incluidos los tipos primitivos. En C++ y Java, por ejemplo, los tipos primitivos int, char, etc. no son objetos. En Ruby, por ejemplo, todo es un objeto. A veces, los criterios adicionales están implícitos con la definición dependiendo de con quién está hablando.

1

Otra interpretación de ese término "verdadera orientación a objetos" es que puede tomar algún lenguaje que no admita OOP por sí mismo, y adhiera una forma de OOP de hacer las cosas en la parte superior. Por ejemplo, puede modelar la encapsulación en C como

typedef struct foo_ { 
    T1 (*getA)(foo * self); 
    void (*setA)(foo * self, T1 a_); 

/* private: */ 
    T1 a_; 
} foo; 

T1 foo_getA(foo * self) { 
    return self->a_; 
} 

void foo_setA(foo * self, T1 a_) { 
    self->a_ = a_; 
} 

foo * foo_create() { 
    foo * f = malloc(sizeof(foo)); 
    f->getA = foo_getA; 
    f->setA = foo_setA; 
    return f; 
} 

void foo_destroy(foo * f) { 
    free (f); 
} 

void doSomething(T1 a) { 
    foo * f = foo_create(); 
    f->setA(f, a); 
    foo_destroy(f); 
} 

técnicas para implementar herencia y polimorfismo ha estado en uso desde hace mucho tiempo. Un ejemplo es el marco GObject utilizado como base para gtk +.

Ahora, aunque puede programar de forma orientada a objetos, C no admite la orientación del objeto, pero simplemente le permite simularlo hasta cierto punto. Entonces no tienes orientación verdadera del objeto. Mirando C++/Java/C#, tiene soporte para todo este tipo de cosas como la herencia/encapsulación de datos y cosas de primera mano.

2

El problema de C++ es el siguiente. Las clases de C++ existen solo en la sintaxis de origen. No hay ningún objeto de clase en tiempo de ejecución con atributos y métodos.

Por supuesto, en esta regla no es hay tal cosa como programación orientada a objetos en una arquitectura de máquina convencional, ya que no hay objeto de clase de tiempo de ejecución con los atributos y métodos a nivel de código máquina. (O, al menos, no existe excepto para las arquitecturas especializadas como la edad o System/38AS/400.)

Qué "object oriented" significa que se establecieron hace mucho tiempo como tres cosas: abstract data types, con inheritance y polymorphism. (El artículo de Wikipedia relacionado confunde las propiedades de OO con los beneficios hasta cierto punto. Pero la distinción importante es entre los sistemas "object based" OO y.)

En general, lo que "X no es realmente orientado objeto, a diferencia Y "realmente significa es" Estoy tratando de venderte Y. "

+0

No hay muchas cosas a nivel de máquina. Sin embargo, el tema parece ser sobre el lenguaje y los niveles de tiempo de ejecución. – yfeldblum

+0

Estoy seguro de que piensas que el comentario tiene sentido y agrega valor, pero me cuesta cómo. –

+0

Los ADT y los objetos son prácticamente el complemento del otro. Vea "Los conceptos de la abstracción de datos revisados" de William Cooks, o "Paradigmas de programación de Dummies" de Peter Van Roy. –

0

El término "orientación a objetos verdaderos" tiene el mismo significado que como el término sin adornos "orientación a objetos".

Cuando se agrega el calificador "verdadero" a "el tema en cuestión", se intenta alertar al lector sobre la presencia, dentro del universo actual del discurso, de una o más "imitaciones incompletas" de dicho sujeto, que se usan indistintamente, pero que, en comparación con el tema, carecen de una o más propiedades de importancia para el discurso.

Dicho uso normalmente debe ir seguido de una descripción de las propiedades del sujeto, o una descripción de las propiedades que faltan en el "tema de imitación", o ambos; lo que lleva al lector a comprender, o al menos a contemplar, la (s) distinción (es).

La orientación a objetos, tal como se utiliza por la persona que acuñó la frase, parece incluir las siguientes propiedades:

  • Encapsulación de (datos + comportamiento) en (objetos) que se comunican a través de (mensajes) solo.
  • Recuperación automática de la memoria utilizada para representar (objetos),
    cuando dichos (objetos) ya no se referencian.
  • Enlace retardado de (significado) en la (representación) de los objetos.
  • Reflejo en tiempo de ejecución desde (objeto) hasta (propiedades del objeto).

práctica y la experiencia han enseñado,
como también es necesario, la inclusión de

  • cierres (a veces referido como "verdaderos cierres",
        significado (cierres) en el sentido formal ,
        y siguiendo el ejemplo de los cierres en (Lisp).
    )
+0

Hasta donde yo sé, los cierres y los objetos son dos formas alternativas de programación (vinculación léxica versus despacho dinámico): algunos idiomas proporcionan el primero, algunos el último y otros proporcionan ambos. Pero los cierres son un enfoque alternativo a la orientación a objetos, no son parte de eso. – Giorgio

Cuestiones relacionadas