¿Qué hizo exitosa la programación orientada a objetos? [cerrado]

17

¿Cuál es esa característica según usted que ha hecho que la programación orientada a objetos sea tan exitosa?

  1. Paso de mensajes
  2. Herencia
  3. Polimorfismo
  4. Encapsulamiento

O alguna otra característica que le gustaría presentar.

También me gustaría saber cuál es la conexión entre el tipo de datos abstractos y la programación orientada a objetos.

Tony
fuente
popular y exitoso no son sinónimos
kevin cline

Respuestas:

76

Sugeriría que la característica más importante de la programación orientada a objetos es la de la gestión de la complejidad .

El cerebro humano solo puede contener tantos conceptos a la vez: me viene a la mente el límite a menudo citado de recordar 7 +/- 2 elementos independientes.

Cuando estoy trabajando en un sistema de 600kloc en el trabajo, no puedo tener todo en mi cabeza de una vez. Si tuviera que hacer eso, estaría limitado a trabajar en sistemas mucho más pequeños.

Afortunadamente, no tengo que hacerlo. Los diversos patrones de diseño y otras estructuras que hemos utilizado en ese proyecto significan que no tengo que lidiar con todo el sistema a la vez: puedo recoger piezas individuales y trabajar en ellas, sabiendo que encajan en la aplicación más amplia de maneras bien definidas

Todos los conceptos importantes de OO proporcionan formas de gestionar la complejidad.

Encapsulación : permítame tratar con una API externa que me proporciona varios servicios, sin preocuparme de cómo se implementan esos servicios.

Abstracción : déjame concentrarme en las características esenciales e ignorar lo que no es relevante.

Composición : permítanme reutilizar componentes que ya se han construido en nuevas combinaciones.

Polimorfismo : permítame solicitar un servicio sin preocuparme de cómo los diferentes objetos podrían proporcionarlo de diferentes maneras.

Herencia : permítame reutilizar una interfaz o una implementación, proporcionando solo las piezas que son diferentes de lo que había sucedido antes.

Principio de responsabilidad única : mantengamos el propósito de cada objeto claro y conciso, por lo que es fácil razonar sobre

Prinicple de sustitución de Liskov : no dejemos trampas entre nosotros introduciendo dependencias impares

Principio abierto / cerrado : permitamos la extensión y modificación de formas que no requieran que corramos el riesgo de romper el código existente

Inyección de dependencias : llevemos la composición al siguiente nivel y ensamblemos los componentes mucho más tarde.

Desarrollo orientado a la interfaz : llevemos la abstracción al siguiente nivel y solo dependamos de la abstracción, nunca de una implementación concreta.

Bevan
fuente
66
+1. Solo puedo votar una vez, lo cual es una pena que esto merezca más.
Richard
1
Hay un corolario en esto, es una pena que no pueda encontrar la referencia en este momento, pero intentaré recordar buscarlo y editar el comentario. Entonces, un estudio de prácticas de revisión de código encontró que las revisiones de código tendían a tomar más tiempo para encontrar errores en el código OO que en el código de procedimiento, porque el flujo salta más en el código OO. Prácticas como TDD y programación de pares mitigan eso, pero sigue siendo un resultado interesante (y para mí, inesperado).
55
Esta podría ser la respuesta perfecta: información completa, pero lo suficientemente corta como para que el lector no tenga que leer una novela. Bravo
Tim Claason
@Graham Lee: Me interesaría leer ese estudio.
Frank Shearar
13

Interfaces gráficas de usuario. A fines de los años ochenta, principios de los noventa, cuando Macs, Amigas, Atari ST, Windows y GEM comenzaron a reemplazar las interfaces de usuario basadas en caracteres, se hizo evidente que lenguajes como C no son adecuados para escribir programas GUI. Si bien el procesamiento de datos tradicional se considera como un esquema de "datos de entrada -> procesamiento -> datos de salida", que también podría hacerse en un lenguaje de procedimiento, las características de OO son útiles para manejar la complejidad inherente de una GUI.

usuario281377
fuente
1
+1 por mencionar aplicaciones GUI. La orientación a objetos fue la herramienta que permitió implementar GUI, que de otra manera (con código de procedimiento) eran bastante difíciles de administrar.
Giorgio
7

La ocultación de datos proporcionada por la encapsulación.


fuente
Esta es una respuesta? Los ADT proporcionan ocultación de datos (por eso se les llama "abstracciones de datos")
Frank Shearar
@Frank, solicitó características específicas y cuando escribí esta respuesta, solo había otra e intentaba no duplicarla.
Es justo, pero la encapsulación no es exactamente específica para OO. Debería verificar esto yo mismo, pero estoy bastante seguro de que estábamos haciendo la encapsulación mucho antes de OO.
Frank Shearar
1
@ Frank, estoy de acuerdo que no es específico de OO, es solo una de sus características principales.
Eso es cierto para la mayoría de los OOPL, pero no para todos. CLOS es una notable excepción.
Frank Shearar
7

Una característica que aún no ha sido mencionada por ninguna de las otras respuestas: modelado de dominio . Debido a que las personas tienden a pensar en hacer cosas con o con objetos, y en objetos que tienen propiedades intrínsecas, es muy fácil modelar un problema o flujo de trabajo utilizando un software orientado a objetos. Esencialmente, nos permite usar nuestra capacidad existente para tratar con sustantivos, verbos y adjetivos en código.


fuente
6

Creo que la herencia es el punto más importante de la POO.

[del desarrollo del juego] Puedes crear algo así como una clase Drawable, con métodos y atributos de representación, y crear una clase de Nave espacial y Planeta, que hereda de Drawable. Tome todos los objetos de esos [y otro niño Sprite], agregue un drawableObjArray y simplemente llame al método de dibujo para cada objeto. Solo necesita saber que es un Drawable.

JulioC
fuente
2
¿¿De Verdad?? El polimorfismo es MUCHO más importante y no requiere herencia (desde un punto de vista teórico).
Thomas Eding
Ni siquiera requiere funciones virtuales, solo use punteros de función.
Calmarius
1
El concepto original de Alan Kay de OO ni siquiera incluía la herencia porque no le gustaba cómo se implementaba en los sistemas anteriores.
Michael Borgwardt
3

Abstracción

Brindar los servicios necesarios ocultando las cosas innecesarias. Vea mi explicación aquí: ¿Qué es la abstracción?

Gulshan
fuente
Error tipográfico: "Absracción" debería ser "Abstracción"
Vetle
2

Es algo exitoso porque alienta el uso de la organización de las cosas de la mente humana en objetos. Las personas generalmente son buenas para ver las relaciones de las cosas, como las diferencias, las similitudes y el comportamiento. OO alienta el desarrollo de software para imitar la conceptualización humana del mundo.

Hacer que el desarrollo de software sea similar a cómo vemos el mundo hace que sea más fácil para nuestras mentes manejar la complejidad.

Tim
fuente
Tal vez se deba a más experiencia con procedimientos, pero después de usar ambos métodos, todavía encuentro que los procedimientos son más intuitivos que OOP. Sin embargo, todavía me gustan las partes buenas de ambos estilos.
Juha Untinen
1

Se ha preguntado " ADT vs objetos " varias veces aquí. La respuesta de una línea es "los ADT y los objetos son inversos entre sí: lo que uno resume claramente que el otro no puede; cada uno permite flexibilidad de diferentes maneras".

Para una respuesta más larga, vea William Cook's On Understanding Data Abstraction, Revisited . Brevemente, los objetos le permiten usar fácilmente múltiples implementaciones / representaciones de algún dato (algo que parece una lista podría ser una matriz, o un árbol de auto-equilibrio, o ...) pero dificulta la adición de nuevas operaciones (porque tiene que agregar esa nueva operación a cada una de sus representaciones), mientras que los ADT facilitan agregar nuevas operaciones en su tipo de datos, pero dificultan tener múltiples implementaciones.

Editar: había dicho que pasar el mensaje fue lo que hizo que OO tuviera éxito. Según el comentario de Jonas, eso no está bien, porque la mayoría de los idiomas que las personas consideran OO no usan la transmisión de mensajes. Como no está bien, lo descarté de mi respuesta.

Frank Shearar
fuente
1
El paso de mensajes difícilmente puede ser la respuesta, ya que ninguno de los lenguajes exitosos de OOP lo usa.
Jonas
Tu OO no es necesariamente mi OO. Y la mayoría de los idiomas que se llaman OO no lo son, según la definición de Alan Kay. Olvidé la cita exacta, pero Kay dijo que los objetos no eran lo importante de Smalltalk, sino la transmisión de mensajes (y que la mayoría perdió este punto).
Frank Shearar
@Jonas Creo que, al releer la pregunta y mi respuesta, estoy medio diciendo "OO no tiene éxito, ya que muy pocos idiomas lo hacen bien". Pero solo digo cosas así cuando llevo mi traje a prueba de llamas.
Frank Shearar
0

Mis tres características principales. Composición de objetos: permite que los objetos colaboren. Polimorfismo: admite comportamientos dinámicos en tiempo de ejecución. Herencia: reutilizando el código y modificando el comportamiento mediante la anulación de métodos.

ADT: puede tener eso incluso en lenguajes no orientados a objetos como Pascal. Una pila o una cola son ejemplos de ADT.

StartClass0830
fuente
"ADT: puede tener eso incluso en lenguajes no orientados a objetos como Pascal. Una pila o una cola son ejemplos de ADT": Verdadero. Pero OOP facilita la definición de la interfaz de un ADT y proporciona una implementación diferente e intercambiable (interfaz / clase abstracta <---> subclases / clases concretas). Que yo sepa, no es tan fácil en Pascal.
Giorgio
0

en palabras simples, OOP es la clave para la reutilización y la encapsulación que da como resultado la producción de grandes marcos que hacen la vida más fácil para los programadores en esta era, ya que solo pueden llamar a las API y hacer lo que el día quiere con mayor frecuencia.

ya que su pregunta es sobre las 4 características de OOP para que pueda decir

  1. Herencia y 4. La encapsulación son las características más importantes y otras dos son muy necesarias para lograr las dos primeras.

entonces 1. La transmisión de mensajes y 3. El polimorfismo son en realidad compatibles 2. Herencia y 4. Encapsulación.

  1. Herencia y 4. Encapsulación son claves para el éxito de OOP
Badr uz Zaman
fuente
la herencia no es necesaria, un componente definitorio de, o incluso una parte muy deseable de OOP la mayor parte del tiempo. La encapsulación es un buen principio para la programación en general. no fue inventado por OOP y no se usa únicamente en OOP.
Sara
-1

En mi opinión, las últimas tres características son las más importantes una vez que afectaron el uso generalizado de OOP:

2. Inheritance
3. Polymorphism
4. Encapsulation

Editar: Otro punto sería IDE y entornos de desarrollo de interfaz gráfica como Visual Studio y Eclipse. A medida que adoptan los lenguajes OOP, cada vez más diseños tienden a OOP.

Y, por supuesto, los Principios SÓLIDOS son los únicos que hacen que los productos de software ROCK sean sólidos entregables :)

Yusubov
fuente