Pregunta

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

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é?

¿Fue útil?

Solución

Definiciones de orientación a objetos son por supuesto un enorme lata de gusanos, pero aquí están mis 2 centavos:

Para mí, la orientación a objetos se trata de objetos que colaboran enviando mensajes.Para mí, ese es el rasgo más importante de un lenguaje orientado a objetos.

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

  1. Objetos que envían mensajes a otros objetos.
  2. Todo es un objeto
  3. Encuadernación tardía
  4. Polimorfismo de subtipo
  5. Herencia o algo similar expresivo, como Delegación
  6. Encapsulación
  7. Ocultación de información
  8. Abstracción

Obviamente, esta lista es muy controvertida, ya que excluye una gran variedad de lenguajes que se consideran ampliamente orientados a objetos, como Java, C# y C++, todo lo cual viola 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). C) e incluso facilitarlo (lo que C no hace).Por eso he llegado a llamar a los lenguajes que satisfacen esos requisitos "puramente orientados a objetos".

Como lenguajes arquetípicos orientados a objetos nombraría Ser y Neolengua.

Ambos cumplen los requisitos antes mencionados.Ambos están inspirados y son sucesores de Charla, y ambos realmente logran ser "más OO" en algún sentido.Lo que me gusta de Self y Newspeak es que ambos llevan el paradigma de envío de mensajes al extremo (Newspeak incluso más que Self).

En neolengua, todo es un mensaje enviado.No hay variables de instancia, ni campos, ni atributos, ni constantes, ni nombres de clases.Todos ellos se emula mediante el uso de captadores y definidores.

En el yo hay no hay clases, solo objetos.Esto enfatiza qué es OO. en realidad acerca de:objetos, no clases.

Otros consejos

Según Booch, los siguientes elementos:Importante:

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

Menor:

  • Mecanografía
  • concurrencia
  • Persistencia

Básicamente, la Orientación a Objetos realmente se reduce a "pasar mensajes"

En un lenguaje procedimental, llamo a una función como esta:

  f(x)

Y el nombre f probablemente esté vinculado a un bloque de código particular en el momento de la compilación.(A menos que se trate de un lenguaje de procedimientos con funciones de orden superior o punteros a funciones, pero ignoremos esa posibilidad por un segundo). Entonces, esta línea de código solo puede significar una cosa inequívoca.

En un lenguaje orientado a objetos paso un mensaje a un objeto, quizás así:

 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 diferentes cosas en diferentes situaciones, dependiendo de o.

En la mayoría de los lenguajes OO, el objeto o tiene una "clase" y la clase determina qué bloque de código se llama.En un par de lenguajes OO (el más famoso es Javascript), o no tiene una clase, pero tiene métodos directamente adjuntos 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 los mensajes es esencial.

Aunque puedes fingir esto con punteros de función en C, por ejemplo, eso no es suficiente para que C sea llamado lenguaje OO, porque tendrás que implementar tu propia infraestructura.Puedes hacer eso, y un estilo OO es posible, pero el lenguaje no te lo ha dado.

En realidad, no son los lenguajes los que son OO, es el código.

Es posible escribir código C orientado a objetos (con estructuras e incluso miembros de puntero de función, si lo desea) y he visto algunos ejemplos bastante buenos de ello.(Me viene a la mente el SDK de Quake 2/3). Definitivamente también es posible escribir procedimientos (es decir,código no OO) en C++.

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

(Ampliando esto, se podría decir que Python tampoco está orientado a objetos, con la referencia "auto" obligatoria en cada paso y los constructores llamados en eso, todo eso;pero esa es una discusión religiosa.)

Smalltalk suele considerarse el lenguaje OO arquetípico, aunque a menudo se cita a Simula como el primer lenguaje OO.

Los lenguajes OO actuales se pueden clasificar vagamente según el lenguaje del que toman prestado la mayor cantidad de conceptos:

  • Como una pequeña charla:Ruby, Objetivo-C
  • Similar a una simulación:C++, Objeto Pascal, Java, C#

Hasta donde puedo decir, la visión principal de lo que hace que un lenguaje sea "orientado a objetos" es respaldar 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.

Ver esta discusión para obtener una descripción general de lo que la gente piensa (¿pensó?) Que significa la orientación a objetos.

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

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

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

"Cualquier idioma que tenga una palabra clave llamada 'clase'":-P

Para ampliar lo que dijo aib, yo diría que un lenguaje no está realmente orientado a objetos a menos que las bibliotecas estándar disponibles estén orientadas a objetos.El mayor ejemplo de esto es PHP.Aunque admite todos los conceptos estándar orientados a objetos, el hecho de que un porcentaje tan grande de las bibliotecas estándar no estén orientadas a objetos significa que es casi imposible escribir código de forma orientada a objetos.

No importa que estén introduciendo espacios de nombres si todas las bibliotecas estándar aún requieren que antepongas todas tus llamadas a funciones con cosas como mysql_ y pgsql_, cuando estés en un lenguaje que admita espacios de nombres en la API real, podrías deshacerte de las funciones con mysql_ y tenga simplemente un simple "incluir system.db.mysql.*" en la parte superior de su archivo para que sepa de dónde provienen esas cosas.

cuando puedes hacer clases, está orientado a objetos
Por ejemplo :Java está orientado a objetos, JavaScript no y C++ parece una especie de lenguaje "curioso por los objetos".

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

Hace unos años estaba escribiendo un conjunto de programas en AppleScript, que en realidad no impone ninguna característica orientada a objetos, cuando comencé a asimilar OO.Es complicado escribir objetos en AppleScript, aunque es posible crear clases, constructores, etc. si te tomas el tiempo para descubrir cómo hacerlo.

El idioma era el idioma correcto para el dominio:hacer que diferentes programas en Macintosh trabajen juntos para realizar algunas tareas automáticas basadas en archivos de entrada.Tomarse la molestia de aplicar 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 solucionar problemas, probar y comprender.

La característica que más noté al cambiar ese código de procedimiento a OO fue la encapsulación:tanto de propiedades como de llamadas a métodos.

Simples:(comparar carácter de seguro)

1-Polimorfismo 2 Herimiento 3-Engapsulación 4-Re-Use.:)

Objeto:Un objeto es un depósito 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.Pueden existir muchos objetos de la misma clase;por ejemplo, MyList y YourList pueden ser objetos ShoppingList.

Método:Un procedimiento o función que opera sobre 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 artículo a cualquier objeto ShoppingList.A veces un método está asociado con una familia de clases.Por ejemplo, addItem podría operar en cualquier Lista, de la cual ShoppingList 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 artículos.

Polimorfismo:La capacidad de hacer que una llamada a un método funcione en varias clases diferentes de objetos, incluso si esas clases necesitan 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 artículo a una ShoppingList es completamente diferente a agregar un artículo a un ShoppingCart.

Orientado 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 se le aplica.

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

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

Estoy feliz de compartir esto con ustedes, fue muy interesante y útil para mí.Este es un extracto de una entrevista de Rolling Stone de 1994 donde Steve (no es programador) explica la programación orientada a objetos en términos simples.

Jeff Goodell:¿Podría explicarnos, en términos sencillos, qué es exactamente el software orientado a objetos?

Steve Jobs:Los objetos son como las personas.Son seres vivos y respirables que tienen en su interior conocimiento sobre cómo hacer las cosas y tienen memoria en su interior para poder recordarlas.Y en lugar de interactuar con ellos en un nivel muy bajo, interactúas con ellos en un nivel muy alto de abstracción, como lo estamos haciendo aquí.

He aquí un ejemplo:Si soy tu objeto de lavandería, puedes darme tu ropa sucia y enviarme un mensaje que diga: "¿Puedes lavarme la ropa, por favor"? Sé dónde está el mejor lugar de lavandería en San Francisco.Y hablo inglés y tengo dólares en mis bolsillos.Así que salgo, paro un taxi y le digo al conductor que me lleve a este lugar en San Francisco.Voy a lavar tu ropa, vuelvo al taxi y vuelvo aquí.Te doy tu ropa limpia y te digo: “Aquí tienes tu ropa limpia”.

No tienes idea de cómo hice eso.No tienes conocimiento del lugar de lavado.Quizás hablas francés y ni siquiera sabes parar un taxi.No puedes pagar por uno, no tienes dólares en el bolsillo.Sin embargo, sabía cómo hacer todo eso.Y no era necesario que supieras nada de eso.Toda esa complejidad estaba escondida dentro de mí y pudimos interactuar en un nivel muy alto de abstracción.Eso es lo que son los objetos.Encapsulan la complejidad y las interfaces con esa complejidad son de alto nivel.

Arquetipo

La capacidad de expresar escenarios del mundo real en 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 nuestra cabeza y, si se implementa correctamente, hace que el código sea más eficiente, reutilizable y reduce la repetición.

Para lograr esto necesitas:

  • Consejos/Referencias para garantizar que esto == esto y esto != aquello.
  • Clases señalar (por ej.Arm) que almacenan datos (int hairyness) y operaciones (Throw(IThrowable))
  • Polimorfismo (Herencia y/o Interfaces) tratar objetos específicos de forma genérica para que puedas leer libros y graffitis en la pared (ambos implementan IReadable)
  • Encapsulación porque una manzana no expone una propiedad Atoms[]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top