Foros del Web » Programando para Internet » Javascript »

Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribadas en JS

Estas en el tema de Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribadas en JS en el foro de Javascript en Foros del Web. Buenas! Gracias a la recomendacion dada por Aijoona, ya tengo entre mis manos la traducción al español del libro Gang of Four (patrones de diseño ...
  #1 (permalink)  
Antiguo 02/06/2013, 08:48
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Información Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribadas en JS

Buenas!


Gracias a la recomendacion dada por Aijoona, ya tengo entre mis manos la traducción al español del libro Gang of Four (patrones de diseño reutilizables orientado a POO), y si bien es verdad que se necesita tiempo para desarrollar el contenido de este libro, veo que todo el tratamiento a POO dado en el mismo, es radicalmente diferente al que veo en JS (ellos usan mayoritariamente C++ para sus ejemplo).Aunque yo se C++, tratar herencias complejas (esto no existe en JS) y los polimorfismos virtuales y abstractos (me estoy refiriendo a la implementacion no a las interfaces).


Vemos que en JS muchas de esas relaciones y metodologías no existen como tal, o al menos, en mi limitado conocimiento de JS , no las veo. Cuando se habla de Polimorfismo, de Relaciones entre clases deribadas, de interfaces (en JS la implementacion implica la interfaz, no hay "contrato") y de funciones virtuales, veo que necesito aun conocer mucho mejor el funcionamiento de JS en POO.


He estado buscando ampliamente en google acerca de esto y no he encontrado material, ¿alguien tiene algunas buenas referencias? gracias de antemano!

Última edición por Albuss; 02/06/2013 a las 08:55
  #2 (permalink)  
Antiguo 02/06/2013, 11:56
Avatar de chwc  
Fecha de Ingreso: julio-2008
Ubicación: Buenos Aires ! :D
Mensajes: 814
Antigüedad: 16 años, 4 meses
Puntos: 103
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Albuss ! yo solamente tengo una que me gusto mucho
es esta página, pero esta en ingles

trata lo que vos decis, aunque tampoco ví que se use mucho el polimorfismo
__________________
Hangouts de JavaScript todos los jueves 20hs GMT, Unite !
https://plus.google.com/u/0/108504944676960830886
  #3 (permalink)  
Antiguo 02/06/2013, 12:57
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Gracias una vez mas chwc por venir al rescate, temia que nadie se uniera al hilo!, a decir verdad el polimorfismo de una clase en JS yo si lo uso, pero me cuesta a horrores entender el polimorfismo entre metodos virtuales entre clases heredadas , acaso no se supone que una función virtual es aquella que sobrescribe parametros de la aclase padre? (por ejemplo)


Bueno, en realidad continuo con mi lectura pausada y prudente del libro patrones de diseño de GoF, pero me gustaría saber como aplicar lo que aprendo a JS, por ejemplo , el patrón : iterator que es el que primero sale como ejemplo en el libro. Me gustaría que Aijoona se mojase y entrase, ya que el es el responsable de que este leyendo dicho libro (y se lo agradezco).
  #4 (permalink)  
Antiguo 03/06/2013, 06:42
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 7 meses
Puntos: 343
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

DeriVada.

Las interfaces son la definición de la 'parte visible' de un objeto, no hace falta que sean explícitas como lo son en Java por ejemplo.

Herencias complejas? JavaScript tiene mecanismos de herencia simple, y si tenés ganas podes implementar herencia múltiple y hasta interfaces explícitas.

Por lo de Iterator, acá tenés una explicación/implementación näive:

http://blog.aijoona.com/2011/06/18/p...ript-iterator/
http://blog.aijoona.com/2011/06/25/i...e-iteraciones/

PD: Te diría que empieces leyendo sobre factories y singletons, ya que son sencillos y se relacionan con dudas que tuviste anteriormente.
PD2: Es díficil responder en tus threads, ya que no se entiende bien cual es la duda particular.
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 03/06/2013, 06:55
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Gracias por responder, no es que haya una duda concreta, realmente es un todo por lo que abrí este topic, en JS la implementan implica también hablar de interface (en c++ la interface son las declaraciones de los métodos y la implementación cuando los definimos, pero como en JS si defines una función también implica estar creando la interface), y la cosa para mi se pone mas "fea" cuando en el libro tratan con las funciones virtuales de C++ (como dije arriba, cambian el método de la herencia del padre).


en definitiva seguiré con mucha atención tu blog y espero encontrar un apoyo para seguir el libro de patrones de diseño, pero como narro arriba, aun tengo muchas dudas de como traducir los ejemplo de C++ a JS. Toda referencia que me puedas dar par complementar mis conocimientos de JS en POO sera muy agradecida por mi parte. (como el ejemplo que ha dado chwc por ejemplo)
  #6 (permalink)  
Antiguo 03/06/2013, 07:30
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 7 meses
Puntos: 343
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

En JavaScript se estila a respetar convenciones, más que restricciones.

Un caso paradigmatico de esto son los métodos privados, que aún siendo posible su implementación, mucha gente opta por tener todos los métodos visibles (muchas veces se usa el prefijo '_' para denotar que son privados).

Una hermosa implementación de todo un sistema de objetos/herencia/mixins/etc es la que tienen los muchachos de Sencha en ExtJS y Sencha Touch (aunque excesivamente compleja para cosas menores).

Si tenés alguna duda/problema *particular* con alguna implementación, compartila y te vamos a poder ayudar.
__________________
blog | @aijoona
  #7 (permalink)  
Antiguo 03/06/2013, 18:45
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Pregunta Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Te tomo la palabra pues, solo pido algo de paciencia ya que por ahora me gustaría asentar algunos conocimientos antes de preguntar sobre los patrones. Bien, Tratar las herencias en JS, voy a exponer un ejemplo en C++ y otro en JS, voy a tratar de abstraer el ejemplo lo máximo posible, es decir, tratar de ser lo mas simple y directo que pueda. Voy a declarar una relación entre clases de derivación (herencia simple) y luego con mis conocimientos tratare de hacer lo mismo en JS, para finalmente hacer mis preguntas.


Código C++:
Ver original
  1. class Mamifero{
  2.  
  3.  public:
  4.  
  5. //Constructor y destructor
  6.    Mamifero();
  7.    ~Mamifero();
  8.  
  9. //Metodo Accesor
  10.    int ObtenerEdad();
  11.  
  12. // Propieades
  13.  protected:
  14.  
  15.    int _edad;
  16. }
  17.  
  18.  
  19. class Persona : public Mamifero{
  20.  
  21.  public:
  22. //Constructor y Destructor
  23.    Persona();
  24.    ~Persona();
  25.  
  26. //Metodo Accesor
  27.    String ObtenerNombre();
  28.  
  29. // Propieades
  30.  protected:
  31.  
  32.   String Nombre;
  33. }
  34.  
  35. //Notese que solo he declarado la interfaces, es decir no las he implementado


Código JS:

Código Javascript:
Ver original
  1. MamiferoPrototype(edad){
  2.  
  3.    this.Edad = edad;
  4.  
  5. }
  6.  
  7. PersonaPrototype(name){
  8.  
  9.    MamiferoPrototype.call(this , edad , name); // hago que el constructor también inicialice los argumentos del padre.
  10.    this.Nombre = nombre;
  11.  
  12. }
  13.  
  14.  
  15. PersonaPrototype.prototype = new MamiferoPrototype(); /* Creo la relacion de Herencia simple */
  16. var Titos = new PersonaPrototype(50, 'Titos'); // Instancio un objeto del prototipo persona y le paso al constructor los parametros iniciales tanto de mamifero como de persona
  17.  
  18.  
  19. Titos.Edad; // devuelve 50
  20. Titos.Nombre // devuelve Titos


Un montón de preguntas se acumulan acerca de estos dos ejemplos, tratando de se lo mas simple y directo posible llevare acabo una lista :
  1. En C++ se que estoy llevando una relación entre clases de derivación, es decir, de la clase Base (Mamifero) a la clase derivada (Persona), pero en JS no se exactamente cual es la relación entre los dos prototipos, en C++ al declarar la clase derivada Persona, es necesario al declararla describir el tipo de relación (class Persona : public Mamifero), es decir, cuando declaro la clase declaro la relacion, en cambio en Js primero declaro los dos prototipos, luego declaro una sentencia en la cual enlazo al prototipo de persona con el de mamifero, ¿ que tipo de relacion estoy estableciendo? ¿alternativas? ¿es correcto?


  2. En C++ tiene mucha importancia declarar el alcance de cada una de las partes de la clase, Public, Private, Protected , Esto tiene que ver sobretodo con la encapsulación, que es uno de los pilares de POO, C++ es un lenguaje de nivel medio, me pregunto cuan es la importancia de declarar el alcance de las partes de un prototipo en JS que es un lenguaje de alto nivel, notese que no he declarado ninguna propiedad como privada en JS, pero seria algo asi :

    Código Javascript:
    Ver original
    1. MamiferoPrototype(edad){
    2.  
    3.    //Publico
    4.  
    5.    this.ObtenerEdad(){
    6.    return Edad;
    7.    }
    8.    // Privado
    9.  
    10.    var Edad = edad;
    11.  
    12. }
  3. ¿Que importancia tiene?, en C++ se usa la Protected en vez de private por que los métodos privados no son accesibles por la clase derivada, ¿esto es así en JS?


  4. En JS el constructor es la propia función, ¿cual es la relación entre los constructores de la herencia que he creado en js? ¿limitaciones? , Por que tengo que hacer una sentencia explicita para que la clase derivada también inicialice los argumentos del padre? (MamiferoPrototype.call) , ¿por que esto no ocurre de forma "automatica" cuando declaro la herencia, como en C++? ¿como funciona y porqué, para que tenga que ser asi?

Última edición por Albuss; 04/06/2013 a las 05:04
  #8 (permalink)  
Antiguo 04/06/2013, 16:42
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Y mira que le dedique tiempo a exponer 4 puntos bien definidos para que @Aijoona pudiese contestar cosas concretas ....



Ps. (no hay muchos topics sobre esto en el foro, si me ayudáis a mi, ayudareis a mas gente ya que es un tema poco recurrente y por ende mas fresco)
  #9 (permalink)  
Antiguo 04/06/2013, 19:53
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 7 meses
Puntos: 343
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

1. La relación es básicamente herencia, la implementación es por prototipos.

Al igual que en C++, existe una relación Persona -> Mamífero, solo que los mecanismos son distintos.

Acá un *antiguo* artículo que habla un poco sobre distintos mecanismos de herencia: http://www.crockford.com/javascript/inheritance.html

2. Lo que hiciste es crear una property privada (Edad) y un método 'privileged' (tiene visibilidad sobre las properties declaradas en el closure generado por el constructor).

Ese tipo de mecanismos permiten implementar scopes privados, pero tienen el costo de que cada función que definis dentro del constructor se replica en cada instancia. Si las agregas al prototype, pierden la capacidad de trabajar sobre elementos privados, pero son más eficientes (se crean una unica vez, en el prototipo).

3. Las restricciones de scoping tienen como objetivo hacer cumplir el encapsulamiento. De nuevo, JS es un lenguaje en el que por limitaciones propias siempre se estiló utilizar convenciones sobre restricciones reales.

Acá te dejo una cita del 'Programming in Lua' (hermoso libro por cierto), que es un lenguaje bastante similar a JavaScript:

'If you do not want to access something inside an object, just do not do it. '

Fuente: http://www.lua.org/pil/16.4.html

De cualquier manera, se puede jugar e implementar mecanismos de scoping (divertido y didactico, sin demasiado uso en el mundo real).

4. La implementación actual de constructores y herencia en JavaScript es horrible y engorrosa. Esto es simplemente por diseño.
La próxima versión (EcmaScript6) introduce 'clases' más amigables para la gente que viene de lenguajes como C++ o Java.

Link (spec): http://wiki.ecmascript.org/doku.php?...inimal_classes

-------

Tópicos de esto no hay, porque la gente no suele utilizar JavaScript más que para validar un formulario o hacer algo de minima complejidad en jQuery.

Saludos.
__________________
blog | @aijoona

Última edición por Aijoona; 04/06/2013 a las 19:58
  #10 (permalink)  
Antiguo 05/06/2013, 03:22
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 11 meses
Puntos: 206
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Hace poco más de un años hice un artículo en mi blog de cómo utilizaba yo POO en javascript para programar minijuegos.

http://www.jlabstudio.com/webgl/2012...en-javascript/
  #11 (permalink)  
Antiguo 06/06/2013, 20:52
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Gracias Aijoona una vez mas, siento la tardanza en contestar pero he estado fuera y no uso smartphon, me ha sido sumamente interesante leerte una vez mas, asi como las fuentes de información que has puesto sobre la mesa (anecdota : cuando tenia 17 años aprendí a usar los archivos .Lua para un server privado de un juego llamado tibia, y desde entonces no habia vuelto a utilizarlo , me he pasado un buen rato curioseando en http://www.lua.org/).


Atendiendo a tus respuestas 1 y 4 :


Cita:
Iniciado por Aijoona Ver Mensaje
1. La relación es básicamente herencia, la implementación es por prototipos.

Al igual que en C++, existe una relación Persona -> Mamífero, solo que los mecanismos son distintos.

...

4. La implementación actual de constructores y herencia en JavaScript es horrible y engorrosa. Esto es simplemente por diseño.

...

Y teniendo en cuenta el siguiente código :


Código Javascript:
Ver original
  1. MamiferoPrototype(edad){
  2.  
  3.    this.Edad = edad;
  4.  
  5. }
  6.  
  7. PersonaPrototype(name, sexo, raza, altura){
  8.  
  9.    MamiferoPrototype.call(this , edad , name, sexo, raza, altura);
  10.    this.Nombre = nombre;
  11.  
  12. }
  13.  
  14.  
  15. PersonaPrototype.prototype = new MamiferoPrototype();
  16.  
  17. var Titos = new PersonaPrototype(50, 'Titos', 'male', 'mongoloide', 1.78);


La sentencia : MamiferoPrototype.call([Argumentos]), ¿no esta sobrecargando el constructor del prototipo actual, es decir, ¿en javascipt es posible y viable la sobrecarga de funciones/metodos/prototipos, teniendo en cuenta que es el mismo y único constructor?, en C++ y en general en POO la sobrecarga implica una misma y igual funcion/metodo pero cambiando la firma, es decir los argumentos que toman ,realmente me cuenta ver como es y trabaja el constructor en JS, lo que también me da pie a ... : ¿Que pasa con la sobreescritura de los metodos del prototipo derivado sobre el padre, es decir, que pasa con las funciones virtuales en JS, hay algún método para llevarlas a cabo? , ¿como puedo implementar el polimorfismo, si no puedo sobrescribir algunos métodos de la clase padre?.


Ps. marlanga , aun estoy con tus manuales sobre WebGl.

Última edición por Albuss; 06/06/2013 a las 21:12
  #12 (permalink)  
Antiguo 06/06/2013, 21:46
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 7 meses
Puntos: 343
Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

No estás sobrecargando ningun método, solamente llamás a otro método con el thisValue apuntando al objeto actual.

Te diria que esperes un poco antes de pensar en sobrecarga de metodos (que es posible, ej: multimethods).

La idea de llamar al constructor padre es simplemente no repetir la logica en ambos constructores, nada más que eso.

Podes sobreescribir los métodos que quieras, la precedencia en los prototipos es igual que en las clases de Java por ejemplo.

Código Javascript:
Ver original
  1. var Person = function(name) {
  2.   this.name = name;
  3. };
  4.  
  5. Pirate.prototype.salute = function() {
  6.   alert('I\'m ' + this.name);
  7. };
  8.  
  9. var Pirate = function(name) {
  10.   // Esto seria el equivalente a super(name)
  11.   Person.call(this, name);
  12. };
  13.  
  14. // Extendemos
  15. Pirate.prototype = new Person;
  16.  
  17. // Sobreescribimos el metodo salute
  18. Pirate.prototype.salute = function() {
  19.   alert('ARRRRRRR! I\'m ' + this.name );
  20. };
  21.  
  22. var jose = new Person('José');
  23.  
  24. jose.salute(); // I'm José
  25.  
  26. var sandokan = new Pirate('Sandokan');
  27.  
  28. sandokan.salute(); // ARRRRRRR! I'm Sandokan

PD: Si queres, plantea un diseño y lo plasmamos a codigo, probablemente sea lo mejor para sacarte las dudas.
__________________
blog | @aijoona

Etiquetas: clases, contrato, implementacion, virtuales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:32.