2008-10-26 28 views
10

Steve Yegge publicó recientemente un interesting blog post en lo que él llama el patrón de diseño universal. Allí detalla el uso de prototipos como una herramienta de modelado, en lugar de clases. Me gusta la forma en que esto introduce menos acoplamiento en comparación con la herencia. Pero eso es algo que también se puede obtener con las clases, al implementar las clases en términos de otras clases, en lugar de la herencia. ¿Alguien más tiene historias exitosas sobre el uso de prototipos y puede ayudar a explicar dónde es ventajoso usar prototipos en comparación con las clases? Supongo que se trata de modelado estático versus modelado dinámico, pero serían bienvenidos más ejemplos.prototipos versus clases

+0

semánticamente, prototipos + delegación == + clases herencia –

+0

errata: Yeggie debe ser Yegge – Ken

Respuesta

13

Un aspecto interesante es que es fácil hacer que un lenguaje basado en prototipos actúe como OO pero es difícil hacer que un lenguaje OO actúe basado en prototipos. de

No está del todo claro cómo se vería OO como prototipo, aparte de la composición frente a la herencia como usted menciona.

Un lenguaje de prototipos facilita el comportamiento complejo de herencia. Puede implementar el comportamiento de multiple inheritance, mixin, o simplemente seleccionar y elegir lo que quiere de un objeto para agregarlo a otro.

Wikipedia's article menciona: "Los defensores de la programación basada en prototipos a menudo argumentan que los lenguajes basados ​​en clases fomentan un modelo de desarrollo que se enfoca primero en la taxonomía y las relaciones entre clases.En contraste, la programación basada en prototipos se considera alentadora para el programador centrarse en el comportamiento de un conjunto de ejemplos y luego preocuparse por clasificar estos objetos en objetos arquetípicos que luego se utilizan de forma similar a las clases ".

Eso no quiere decir que el prototipo de paradigma es todo ventajas y nada contra. Si OO es más restrictivo, es porque elige serlo. Puedo ver dónde toda esa flexibilidad podría meterlo en problemas si no tiene cuidado.

3

Los prototipos son una forma de herencia, es solo que los objetos heredan atributos y comportamientos directamente de otros objetos, en lugar de obtener sus atributos y el comportamiento de su clase, que hereda de otras clases.

Por ejemplo, consulte cualquier código orientado a objetos en un prototype based language como, por ejemplo, JavaScript.

+0

lo tienes al revés: programación orientada a objetos la herencia basada en la clase es un subconjunto de prototipos (que es un subconjunto de la tipificación de pato) – Javier

+0

creo que malinterpreta yo. Estaba diciendo que los prototipos son una forma de herencia y las clases/subclases son otra forma. No estaba tratando de entrar en la pregunta completa "cuál se puede implementar en términos de la otra". – Glomek

1

Para los interesados, NewtonScript era (es) un idioma dual: tenías prototipos y tenías clases. Puede elegir heredar de una clase, de un prototipo o de ambos.