Dado que muchos lenguajes de programación dinámicos tienen la característica de escribir pato , y también pueden abrir y modificar métodos de clase o instancia en cualquier momento (como Ruby y Python ), entonces ...
Pregunta 1) ¿Cuál es la necesidad de una clase en un lenguaje dinámico? ¿Por qué el lenguaje está diseñado de esa manera para usar una clase como una especie de "plantilla" en lugar de hacerlo como prototipo y simplemente usar un objeto?
También JavaScript está basado en prototipos, pero CoffeeScript (la versión mejorada de JavaScript) elige la forma basada en clases. Y es lo mismo para Lua (basado en prototipos) y MoonScript (basado en clases). Además, hay clase en ES 6. Entonces ...
Pregunta 2) ¿Sugiere que si intentas mejorar un lenguaje basado en prototipos, entre otras cosas, deberías cambiarlo a clases? Si no, ¿por qué está diseñado de esa manera?
class
palabra clave a partir del próximo estándar ECMAScript (ECMAScript 6). El soporte para las clases en JavaScript se ha planificado durante mucho tiempo. Ahora, para lo que es, las clases son simplemente azúcar sintáctica, una forma más fácil de razonar sobre modelos para objetos del mismo tipo. Es así en JS y así en Python y otros lenguajes dinámicos.Respuestas:
El primer lenguaje OO (aunque no se llamaba "OO"), Simula, no tenía herencia. La herencia se agregó en Simula-67, y se basó en clases.
Al mismo tiempo, Alan Kay comenzó a trabajar en su idea de un nuevo paradigma de programación, que más tarde llamó "Orientación a objetos". Realmente le gustaba la herencia y quería tenerla en su idioma, pero tampoco le gustaban las clases. Sin embargo, no podía encontrar una forma de tener herencia sin clases, por lo que decidió que no le gustaban las clases más de lo que le gustaba la herencia y diseñó la primera versión de Smalltalk, Smalltalk-72 sin clases y, por lo tanto, sin herencia.
Un par de meses después, a Dan Ingalls se le ocurrió un diseño de clases, donde las clases mismas eran objetos, a saber, instancias de metaclases. Alan Kay encontró este diseño un poco menos desalentador que los anteriores, por lo que Smalltalk-74 fue diseñado con clases y con una herencia basada en clases.
Después de Smalltalk-74, Alan Kay sintió que Smalltalk se estaba moviendo en la dirección equivocada y en realidad no representaba de qué se trataba OO, y propuso que el equipo abandonara Smalltalk y comenzara de nuevo, pero fue votado. Así siguieron Smalltalk-76, Smalltalk-80 (la primera versión de Smalltalk que se lanzará a los investigadores), y finalmente Smalltalk-80 V2.0 (la primera versión que se lanzará comercialmente, y la versión que se convirtió en la base de ANSI Smalltalk) .
Dado que Simula-67 y Smalltalk-80 se consideran los abuelos de todos los idiomas OO, casi todos los idiomas que siguieron, copiaron ciegamente el diseño de las clases y la herencia en función de las clases. Un par de años más tarde, cuando surgieron otras ideas como la herencia basada en mixins en lugar de clases, y la delegación basada en objetos en lugar de la herencia basada en clases, la herencia basada en clases ya se había arraigado demasiado.
Curiosamente, el lenguaje actual de Alan Kay se basa en la delegación de prototipos.
fuente
Muchos programadores prefieren trabajar con clases. Es un concepto muy fácil de entender que es un buen modelo de procesos de pensamiento humano sobre el mundo (es decir, instintivamente relacionamos objetos reales con el grupo abstracto de elementos a los que consideramos que pertenecen, que es lo que es una clase) . Además, las clases facilitan el razonamiento sobre los tipos de objetos: en un lenguaje basado en clases, la aplicación de principios como la sustitución de Liskov es más simple que en un lenguaje en el que solo tenemos objetos que pueden tener diferentes métodos, o cuyo tipo puede incluso cambiar en el tiempo de ejecución , como es el caso en JavaScript.
Tenga en cuenta que incluso en JavaScript, una gran cantidad de código simplemente usa el prototipo para emular clases. Esto se debe principalmente a que muchos programadores prefieren pensar de esa manera.
También hay otra razón por la que se prefieren los lenguajes basados en clases: es más fácil compilarlos en un código eficiente. Las máquinas virtuales JavaScript más eficientes crean clases dinámicamente para representar los tipos de objetos JavaScript a medida que cambian sus métodos y prototipos. Consulte esta descripción de la implementación de V8 para obtener una explicación de por qué se hace esto.
fuente
GOTO
y registra efectivamente significa que simplemente abandonar todas las abstracciones y escribir directamente en el ensamblaje es casi seguro, y por lo tanto, probablemente el JIT necesite pasar menos tiempo compilando el código. Es el trabajo de un compilador para soportar abstracciones de alto nivel.He oído que en grandes proyectos, donde equipos de personas trabajan juntos en el mismo código, que los lenguajes flexibles (donde puedes modificar las propiedades y métodos de un objeto durante el tiempo de ejecución) son libertades que otros miembros del equipo no te quieren. tener.
Quieren saber, cuando se trata de un objeto, que el objeto actuará tal como lo dice el plano, y no de una manera transformada a la que algún otro desarrollador ambicioso decidió cambiarlo para completar su propia tarea.
Entonces, la única razón por la que puedo concebir, que alguien no querría las flexibilidades que ofrecen estos impresionantes lenguajes dinámicos, es que quieren simplificar el desarrollo, la depuración y la documentación automática del equipo.
Personalmente, he desarrollado aplicaciones en ambas metodologías, y hago las cosas mucho más rápido con lenguajes dinámicos. No uso ninguno de estos marcos diseñados para volver a convertir mi lenguaje dinámico en un lenguaje de clase. Tales cosas son una regresión a mis gustos.
fuente
Entonces, lo que está diciendo aquí es que OO se trata de hacer cajas negras que respondan a los mensajes. En cierto modo, REST es el último sistema OO en el sentido de que utiliza verbos (es decir, un mensaje) y recursos (es decir, un cuadro opaco que contiene algunos datos).
Entonces, la pregunta de por qué algunos están basados en la clase y otros en el prototipo pierde el punto de que realmente no importa, ambos son meras implementaciones. Un sistema que solo usa mensajes en lugar de llamadas a métodos es tan OO como las dos instancias que menciona.
fuente