2008-08-26 20 views
30

Dado que el debate sin términos significativos es meaningless, calculé que señalaría al elefante en la habitación y me preguntaría: ¿Qué es exactamente lo que hace que un lenguaje sea "orientado a objetos"? No estoy buscando una respuesta de libro de texto aquí, sino una basada en sus experiencias con los lenguajes OO que funcionan bien en su dominio, cualquiera que sea.¿Qué hace que un lenguaje sea orientado a objetos?

Una pregunta relacionada que podría ayudar a responder primero es: ¿Cuál es el arquetipo de los lenguajes orientados a objetos y por qué?

Respuesta

27

Definitions for Object-Orientation son, por supuesto, un huge can of worms, pero aquí son mis 2 centavos:

Para mí, Obj ect-Orientation se trata de objetos que colaboran mediante el envío de mensajes. Es decir, para mí, el rasgo más importante de un lenguaje orientado a objetos.

Si tuviera que aguantar una lista ordenada de todas las características que un lenguaje orientado a objetos debe tener, que se vería así:

  1. Objects sending messages to other objects
  2. todo es un objeto
  3. Late Binding
  4. Subtype Polymorphism
  5. herencia o algo similarmente expresiva, como Delegation
  6. Encapsulation
  7. Information Hiding
  8. Abstracción

Obviamente, esta lista es muy controvertido, ya que excluye a una gran variedad de idiomas que son ampliamente considerado como orientado a objetos, tales como Java, C# y C++, todo lo cual infringe los puntos 1, 2 y 3. Sin embargo, no hay duda de que esos lenguajes permiten la programación orientada a objetos (pero también lo hace el C) e incluso la facilitan (lo que C no hace). Por lo tanto, he llegado a llamar a los idiomas que satisfacen esos requisitos "puramente orientados a objetos".

Como lenguajes orientados a objetos arquetípicos, me gustaría llamar Self y Newspeak.

Ambos satisfacen los requisitos mencionados anteriormente. Ambos están inspirados y son sucesores del Smalltalk, y ambos realmente logran ser "más OO" en algún sentido. Las cosas que me gustan de Self y Newspeak son que ambas llevan el paradigma de envío de mensajes al extremo (Newspeak incluso más que Self).

En Newspeak, todo es un mensaje de enviar. No hay variables de instancia, ni campos, ni atributos, ni constantes, ni nombres de clase. Todos son emulados usando getters y setters.

En sí, hay no hay clases, solo objetos. Esto enfatiza lo que OO es realmente sobre: ​​objetos, no clases.

+1

Mensajes, el enlace en tiempo, y el polimorfismo son la misma cosa: un mensaje enlazados en tiempo es sólo una llamada de procedimiento, y si no puedes enviar los mismos mensajes a objetos de diferentes tipos, entonces ¿por qué ata tarde? La delegación, el encapsulado y todo es un objeto también se derivan de la transmisión de mensajes, de alguna manera. –

0

Admite clases, métodos, atributos, encapsulación, ocultación de datos, herencia, polimorfismo, abstracción ...?

7

Según Booch, los siguientes elementos: principales:

  • Abstracción
  • Encapsulación
  • Modularidad
  • Jerarquía (herencia)

Minor:

  • Typing
  • concurrencia
  • Persistencia
3

Smalltalk se considera generalmente como el lenguaje OO arquetípico, aunque Simula se cita a menudo como el primer lenguaje orientado a objetos.

lenguajes orientados a objetos actuales pueden ser vagamente categorizados por el cual el lenguaje que toman prestado la mayor cantidad de conceptos de:

  • Smalltalk-como: Ruby, Objective-C
  • Simula-como: C++, Object Pascal, Java, C#
+0

No se olvide de Objective C y Javascript como procedente de la rama Smalltalk – Mamut

-2

Arquetipo

La capacidad de expresar escenarios del mundo real en el código.

foreach(House house in location.Houses) 
{ 
foreach(Deliverable mail in new Mailbag(new Deliverable[] 
       { 
       GetLetters(), 
       GetPackages(), 
       GetAdvertisingJunk() 
       }) 
{ 
    if(mail.AddressedTo(house)) 
    { 
     house.Deliver(mail); 
    } 
} 
} 

-

foreach(Deliverable myMail in GetMail()) 
{ 
    IReadable readable = myMail as IReadable; 
    if (readable != null) 
    { 
     Console.WriteLine(readable.Text); 
    } 
} 

¿Por qué?

Para ayudarnos a entender esto más fácilmente. Tiene más sentido en nuestras cabezas y si se implementa correctamente hace que el código sea más eficiente, reutilizable y reduce la repetición.

Para lograr esto es necesario:

  • punteros/referencias para asegurar que este == esto y esto = eso!.
  • Clases a las que apuntar (p.Arm) que almacena datos (int hairyness) y operaciones (Throw (IThrowable))
  • Polimorfismo (Herencia y/o Interfaces) para tratar objetos específicos de forma genérica para que pueda leer libros y graffitis en la pared (tanto aplicar IReadable)
  • encapsulación debido a una manzana no expone una átomos [] propiedad
1

Hasta donde puedo decir, la visión principal de lo que hace que un lenguaje sea "orientado a objetos" apoya la idea de agrupar datos y métodos que funcionan con esos datos, lo que generalmente se logra a través de clases, módulos, herencia, polimorfismo, etc.

Consulte this discussion para obtener una visión general de lo que piensa la gente (¿qué piensa?) Orientación a objetos significa.

En cuanto al lenguaje OO "arquetípico", eso es de hecho Smalltalk, como señaló Kristopher.

4

No son realmente los idiomas que son OO, es el código.

Es posible escribir código C orientado a objetos (con estructuras e incluso con miembros de punteros de función, si lo desea) y he visto algunos buenos ejemplos de ello. (Te viene a la mente Quake 2/3 SDK). También es definitivamente posible escribir código de procedimiento (es decir, no OO) en C++.

Dado que, diría que es el soporte del idioma para escribir un buen código OO que lo convierte en un "lenguaje orientado a objetos". Nunca me molestaría con el uso de miembros del puntero de función en estructuras en C, por ejemplo, para lo que serían funciones de miembro ordinarias; por lo tanto, diré que C no es un lenguaje OO.

(Ampliando esto, se podría decir que Python no está orientado a objetos, o bien, con la obligatoria "auto" de referencia en cada paso y constructores llama init, lo que sea;. Pero eso es una discusión religiosa)

+0

solo para tomar el anzuelo por un segundo, ¿por qué no tener una palabra clave auto implícita significa que Python no es OO? – interstar

+2

Lo siento, ¿qué? – aib

0

sin tener en cuenta las implicaciones teóricas, parece ser

"Cualquier lenguaje que tiene una palabra clave denominada 'clase'" :-P

+3

gracioso ... pero incorrecto – interstar

0

para promover lo AIB dijo, yo diría que una lengua no es realmente objeto orientado a menos que las bibliotecas estándar que están disponibles sean orientado a objetos. El mayor ejemplo de esto es PHP. A pesar de que admite todos los conceptos orientados a objetos estándar, el hecho de que un porcentaje tan grande de las bibliotecas estándar no estén orientados a objetos significa que es casi imposible escribir el código de una manera orientada a objetos.

No importa que estén introduciendo espacios de nombres si todas las bibliotecas estándar aún requieren que prefija todas sus llamadas a función con cosas como mysql_ y pgsql_, cuando en un lenguaje que admite espacios de nombres en la API real, puede obtener elimine las funciones con mysql_ y tenga un simple "include system.db.mysql. *" en la parte superior de su archivo para que sepa de dónde provienen esas cosas.

7

Básicamente orientada a objetos realmente se reduce a "paso de mensajes"

En un lenguaje de procedimientos, que llamo una función como esta:

f(x) 

Y el nombre f está probablemente ligado a un determinado bloque de código en tiempo de compilación. (A menos que este sea un lenguaje de procedimiento con funciones de orden superior o indicadores de funciones, pero dejemos pasar por alto esa posibilidad por un segundo.) De modo que esta línea de código solo puede significar una cosa inequívoca.

En un lenguaje orientado a objetos que pase un mensaje a un objeto, tal como esto:

o.m(x) 

En este caso. m no es el nombre de un bloque de código, sino un "selector de método" y el bloque de código que se llama en realidad depende del objeto o de alguna manera. Esta línea de código es más ambigua o general porque puede significar cosas diferentes en diferentes situaciones, dependiendo de o.

En la mayoría de los lenguajes orientados a objetos, el objeto O tiene una "clase", y la clase determina qué bloque de código se llama. En un par de OO idiomas (el más famoso, Javascript) o no tiene una clase, pero tiene métodos directamente asociados a ella en tiempo de ejecución, o los ha heredado de un prototipo.

Mi demarcación es que ni las clases ni la herencia son necesarias para que un idioma sea OO. Pero este manejo polimórfico de mensajes es esencial.

Aunque puede falso esto con los punteros de función en C decir, eso no es suficiente para C que se denomina un lenguaje orientado a objetos, porque vas a tener que poner en práctica su propia infraestructura. Puede hacerlo, y es posible un estilo OO, pero el idioma no se lo ha proporcionado.

0

cuando se puede hacer clases, es
por ejemplo orientado a objetos: Java es orientado a objetos, JavaScript no está, y C++ parece a algún tipo de lenguaje "curiosa a objetos"

+0

JavaScript generalmente se considera OO: * tiene * objetos, simplemente no clases. (Específicamente, es OO basado en prototipos, no OO basado en clases). En realidad, puede implementar un sistema de clases sobre el sistema prototipo en JavaScript si así lo desea, y tanto ES6 como CoffeeScript hacen exactamente eso por medio del azúcar sintáctico. Lo contrario también es cierto, por cierto: algunos lenguajes orientados a clases de OO (como Ruby, pero probablemente no Java) pueden hacer prototipos de OO sin muchos problemas. –

0

En mi experiencia , los lenguajes no están orientados a objetos, el código es. Hace

unos años yo estaba escribiendo un conjunto de programas en AppleScript, que en realidad no cumplir ningún características orientadas a objetos, cuando empecé a asimilar OO. Es difícil escribir Objetos en AppleScript, aunque es posible crear clases, constructores, etc. si se toma el tiempo para descubrir cómo hacerlo.

El lenguaje era el idioma correcto para el dominio: conseguir diferentes programas en el Macintosh para trabajar juntos para llevar a cabo algunas tareas automáticas basadas en los archivos de entrada. Tomar la molestia de autoejecutar un estilo orientado a objetos fue la elección de programación correcta porque dio como resultado un código que era más fácil de resolver problemas, probar y comprender.

La característica que me di cuenta de la mayor parte en el cambio de código que el relevo de procedimiento de encapsulación fue OO: tanto de las propiedades y las llamadas a métodos.

0

Simples: (compárese con carácter asegurador)

1-El polimorfismo 2-Herencia 3-encapsulación 4-Re-uso. :)

0

Objeto: Un objeto es un repositorio de datos. Por ejemplo, si MyList es un objeto ShoppingList, MyList podría registrar su lista de compras.

Clase: Una clase es un tipo de objeto. Muchos objetos de la misma clase pueden existir; por ejemplo, MyList y YourList pueden ser objetos de ShoppingList.

Método: Un procedimiento o función que opera en un objeto o una clase. Un método está asociado con una clase particular. Por ejemplo, addItem podría ser un método que agrega un elemento a cualquier objeto ShoppingList. A veces, un método se asocia con una familia de clases. Por ejemplo, addItem podría operar en cualquier lista, de las cuales una lista de compra es solo un tipo.

Herencia: una clase puede heredar propiedades de una clase más general. Por ejemplo, la clase ShoppingList hereda de la clase List la propiedad de almacenar una secuencia de elementos.

polimorfismo: La capacidad de tener un método de trabajo llamada en varias clases diferentes de objetos, incluso si esas clases tienen diferentes implementaciones de la llamada al método.Por ejemplo, una línea de código podría llamar al método "addItem" en cada tipo de lista, aunque agregar un elemento a una lista de compra es completamente diferente de agregar un artículo a una ShoppingCart.

Orientada a objetos: cada objeto conoce su propia clase y qué métodos manipulan los objetos de esa clase. Cada ShoppingList y cada ShoppingCart saben qué implementación de addItem aplica a ella.

En esta lista, lo único que realmente distingue a los lenguajes orientados a objetos de los lenguajes de procedimiento (C, Fortran, Basic, Pascal) es el polimorfismo.

Fuente: https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd

+1

Fortran es compatible con el polimorfismo. – francescalus

Cuestiones relacionadas