Beneficios de la OOP clásica sobre el lenguaje Go-like

13

He estado pensando mucho en el diseño del lenguaje y qué elementos serían necesarios para un lenguaje de programación "ideal", y estudiar Google's Go me ha llevado a cuestionar muchos conocimientos comunes.

Específicamente, Go parece tener todos los beneficios interesantes de la programación orientada a objetos sin tener realmente la estructura de un lenguaje orientado a objetos. No hay clases, solo estructuras; no hay herencia de clase / estructura, solo incrustación de estructura. No hay jerarquías, ni clases principales, ni implementaciones explícitas de interfaz. En cambio, las reglas de conversión de tipos se basan en un sistema suelto similar a la escritura de pato, de modo que si una estructura implementa los elementos necesarios de un "Lector" o una "Solicitud" o una "Codificación", puede emitirlo y usarlo como uno.

¿Hay algo acerca de OOP implementado en C ++ y Java y C # que es inherentemente más capaz, más fácil de mantener y de alguna manera más poderoso que tiene que renunciar al pasar a un lenguaje como Go? ¿A qué beneficio tiene que renunciar para ganar la simplicidad que representa este nuevo paradigma?

EDITAR
Se eliminó la pregunta "obsoleta" por la que los lectores parecían estar demasiado obsesionados y enfurecidos.

La pregunta es, ¿qué ofrece el paradigma tradicional orientado a objetos (con jerarquías y demás) como se ve con frecuencia en implementaciones de lenguaje común que no se puede hacer tan fácilmente en este modelo más simple? O, en otras palabras, si diseñara un lenguaje hoy, ¿hay alguna razón por la que quiera incluir el concepto de jerarquías de clases?

tylerl
fuente
1
¿OOP hizo obsoleta la programación de procedimientos? Odio sonar pedante o que te estoy hablando mal, pero esa fue la primera frase que me vino a la mente. Go proporciona un nuevo paradigma (ish). Con la experimentación, los usuarios descubrirán en qué es bueno y en qué no es bueno (como con todos los paradigmas e idiomas), y terminaremos con cientos de excelentes productos (junto con una buena cantidad de productos malos) escritos en Go . Al menos, esa es mi opinión
Jamie Taylor
1
Hay algunas lecturas interesantes cuando Google para OOP está muerto . Recomiendo que la web morirá cuando muera OOP
Andomar
Hay tan poco valor en OOP que no vale la pena perder el tiempo en absoluto.
SK-logic
1
Estoy de acuerdo con el comentario anterior, no se centre demasiado en OOP. Además, OOP no significa C ++ o Java. Trate de leer un poco en ltu.org
AndreasScheinert
C ++, Java y C # no son lenguajes OOP "clásicos". Si hay un lenguaje clásico de OOP, creo que es Smalltalk.
Kevin Cline

Respuestas:

16

No hay un nuevo paradigma. La orientación a objetos es un patrón que utiliza para escribir programas, que ni siquiera está claramente definido. Varios lenguajes proporcionan diversos rasgos típicos de la orientación a objetos (definición de nuevos tipos, encapsulación, jerarquías de tipos, polimorfismo, transmisión de mensajes y más), pero pueden no proporcionar otros. En esos casos, corresponde a los programadores emularlos si surge la necesidad.

Muchos de los lenguajes que proporcionan estas características no tienen un análogo del concepto de clase, por ejemplo, Javascript y Common Lisp. La implementación proporcionada por lenguajes similares a Java (basados ​​en clases, con herencia única, interfaces, despacho basado en tipos) es solo una de las posibilidades, y no necesariamente la mejor.

Andrea
fuente
11
+1 para "no necesariamente el mejor". Citando a Alan Kay: "Inventé el término orientado a objetos, y puedo decirte que no tenía C ++ en mente". (tampoco tenía C # y / o Java, supongo humildemente)
herby
1
@herby He visto que sugirió que los sistemas de agente (similar a cómo funciona Erlang) están más cerca de la eventual intención de Alan Kay para OOP.
CodexArcanum
2
Er, Common Lisp definitivamente tiene clases. Pero, típicamente, una clase CL contiene datos y los métodos se definen en "funciones genéricas". Como efecto secundario, eso le brinda una forma conveniente de realizar despachos múltiples, ya que los métodos ya no están estrechamente acoplados a "una sola clase de implementación".
Vatine
Sí, lo que quise decir es que no tiene clases en el sentido de Java
Andrea
5

¿A qué beneficio tiene que renunciar para ganar la simplicidad que representa este nuevo paradigma?

La verificación de tipo para un sistema de tipo estructural es mucho más compleja que simplemente verificar si la clase base está en su lista de herencia. El despacho virtual se vuelve un poco más complicado y probablemente menos eficiente.

¿Un sistema de este tipo deja obsoleto el concepto de OOP?

No. Siempre que pueda hacer el programa en términos de 'objetos que hacen cosas' en lugar de una lista de instrucciones, o un conjunto declarado de reglas, o una serie de funciones en cascada ... la implementación no importa. Del mismo modo, cambiar el sistema de tipos no invalida ninguno de los principios comunes de OO.

Todavía puede trabajar en un tipo base y no preocuparse por su tipo real. Todavía puede extender los tipos sin modificarlos. Todavía puede hacer que un tipo haga solo una cosa. Todavía puede suministrar interfaces de grano fino. Todavía puede proporcionar abstracciones a sus tipos.

Cómo lo permite un idioma eso realmente no importa.

Telastyn
fuente
De hecho, Go hace que todas esas cosas de OOP sean más fáciles y agrega algunas posibilidades adicionales, como extender un tipo para proporcionar una nueva interfaz que se aplica a las instancias existentes (siempre que no necesite nuevos miembros de datos, por supuesto).
Jan Hudec
4

Creo que su idea acerca de OOP está un poco fuera de lugar:

Inventé el término 'Programación Orientada a Objetos' y esto {Java y C ++} no es lo que tenía en mente.
- Alan Kay .

La elección de la tipificación (subtipificación nominativa, subtipificación estructural o tipificación de pato, o una combinación de ellas) es en gran medida ortogonal a la POO. La herencia y las clases son completamente ortogonales a OOP. Si te tomas un tiempo para jugar con io , verás eso.

Ahora puede preguntar qué tipo de sistemas de tipos son "mejores", y qué medios de reutilización y combinación de códigos lo son. E intente determinar las ventajas y los inconvenientes entre las elecciones realizadas en Simula (y luego en C ++, Java y C #) y las realizadas en Go. Pero todas estas son preguntas diferentes y distintas.

En última instancia, OOP es un concepto muy vago y todos los intentos de implementarlo vienen en una gran variedad de sabores. Pero para simplificar realmente las cosas, diría que la idea central de OOP es componer sistemas de subsistemas SOLIDOS . Ahora, esto desdibuja absolutamente la línea de otros paradigmas, pero especularía que esa es la razón por la cual los lenguajes de paradigmas múltiples han aumentado su popularidad recientemente y por qué Google ha tomado su propia oportunidad con Go.

back2dos
fuente
2
La pregunta se refiere a los conceptos, no necesariamente el término. Si puede encontrar un nombre mejor que "OOP" para referirse al concepto de jerarquías de clase y todos los recortes que vienen con él, entonces podemos usarlo en su lugar.
tylerl
@tylerl: Estás confundiendo al menos dos preguntas en una. Una es si el subtipo estructural es mejor que el subtipo nominativo. La otra es, básicamente, si la composición es mejor que la herencia. Estas preguntas son mutuamente ortogonales. Creo que, en última instancia, el "mejor" lenguaje no hace esta elección por usted. Supondría que Go simplemente tiene un conjunto diferente de problemas, pero veremos si Google agrega esas características "atrás" o no.
back2dos
Me gustaría un solo lenguaje que tenga la mayoría de las capacidades de C ++ pero que sea más pequeño y simple. C ++ es el único lenguaje, excepto C realista para los núcleos, y le brinda herramientas extremadamente útiles como los destructores y el STL. Y el principio importante "si no lo usa, no paga". OO, usado correctamente, es extremadamente poderoso. Pero los genéricos y otros conceptos que no son OO también son de vital importancia. C no te da casi nada, y Go arroja OO real por algunas ideas extrañas y novedosas.
Erik Alapää
1

OOP no es obsoleto.

Como dijo Andrea, se han propuesto muchos conceptos como alternativa a las clases (por ejemplo: clase de tipo haskell). OOP tiene un gran beneficio: se enseña en muchos lugares, y la cultura de OOP se comparte en gran medida entre los desarrolladores.

Esto permite una comunicación más rica dentro de un equipo. Se puede hablar de fábricas más fácilmente que de prepromorfismos zygohistomórficos . OOP estructura la forma en que organizará y se comunicará acerca de su programa con diagramas de uso común. Este es un activo poderoso.

Simon Bergot
fuente
1
Pienso: enseñado en muchos lugares. No es una ventaja, en realidad.
AndreasScheinert
@AndreasScheinert ¿por qué no sería una ventaja?
Simon Bergot
Porque para emitir un juicio, debe saber por lo menos 1 alternativa igualmente buena. Es un problema de hábito, a las personas les gusta permanecer en su zona de confort y eso lleva al estancamiento.
AndreasScheinert
@AndreasScheinert usa la herramienta adecuada para el trabajo. Oop no funciona para todos los escenarios .... no tiene nada que ver con su zona de confort
pqsk
1

No, no hay nada nuevo aquí, ni la POO está obsoleta. C ++ también tiene interfaces implícitas en forma de plantillas, pero las personas aún usan funciones virtuales. Necesita interfaces explícitas para hacer frente, por ejemplo, interfaces binarias o interfaces donde el otro código simplemente no se conoce en tiempo de compilación.

Se podría argumentar que esto es simplemente un caso de inferencia frente a afirmarlo explícitamente, que no se parece en nada a un "nuevo paradigma" y realmente es más conveniente.

DeadMG
fuente