Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Polimorfismo (tipado pato 🦆) JS: Polimorfismo

Comencemos con la introducción al polimorfismo de subtipos con un ejemplo. Imagina una función que verifica si un artículo o un tema (preguntas de los usuarios de Códica en lecciones y proyectos) tiene comentarios. En el código, un artículo está representado por un objeto de la clase Article, y un tema por un objeto de la clase Topic.

const hasComments = (commentable) => {
  // Si es un artículo
  if (commentable instanceof Article) {
    return commentable.getArticleComments().length > 0;
  // Si es un tema
  } else if (commentable instanceof Topic) {
    return commentable.getTopicComments().length > 0;
  }
}

class Article {
  // algún código

  getArticleComments() {
    return this.comments;
  }
}

class Topic {
  // algún código

  getTopicsComments() {
    return this.comments;
  }
}

// Article.first() es un método que devuelve el primer artículo de la base de datos
const article = Article.first();
console.log(hasComments(article));

Hemos visto un código similar antes. Cada nuevo tipo requeriría agregar más código a esta estructura condicional. Podríamos reemplazarlo con un despacho por clave, pero no mejoraría mucho. Igual tendríamos que describir el comportamiento para cada clase, además de lo que ya está definido dentro de cada clase. Pero podemos hacer algo mejor. Basta con acordar una interfaz común para todos los tipos y decidir que el método para obtener comentarios se llamará getComments(). Así, el código quedará de la siguiente manera:

const hasComments = (commentable) => commentable.getComments().length > 0;

const article = Article.first();
console.log(hasComments(article));

const topic = Topic.first();
console.log(hasComments(topic));

Ahora la función hasComments(commentable) puede llamarse con cualquier objeto que tenga el método getComments() con la firma necesaria. Esta función no cambiará incluso si añadimos una nueva clase que tenga el mismo método.

La capacidad de una función para manejar objetos de diferentes tipos de la misma manera se llama polimorfismo de subtipos, y la función en sí es una función polimórfica.

Como puedes ver en el código anterior, no necesitamos herencia ni interfaces para implementar este polimorfismo en JavaScript. Este enfoque se conoce como "tipado de pato". Si algo camina como un pato y hace cuac como un pato, entonces es un pato 🦆.

Técnicamente, lo más sencillo y claro que hace el polimorfismo de subtipos (para el código del cliente) es eliminar las estructuras condicionales. Cualquier estructura condicional puede ser reemplazada por polimorfismo y cualquier función polimórfica puede ser reemplazada por un if. En otras palabras, el polimorfismo de subtipos no es indispensable para el desarrollo, se puede escribir código sin él. Sin embargo, hay situaciones en las que es muy útil, aunque no es algo que ocurra todo el tiempo.

¿Cuál es la diferencia entre el polimorfismo paramétrico y el polimorfismo de subtipos? En el primer caso, se implementa un algoritmo general para un contenedor (por ejemplo, un array) que contiene un valor o valores de tipo T. Este algoritmo no depende de T y se ejecuta de manera idéntica para cualquier T. En el segundo caso, el algoritmo se construye alrededor del propio objeto y utiliza sus métodos. En el polimorfismo de subtipos, la función polimórfica solo funciona con objetos que tienen los métodos necesarios para implementar el algoritmo.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY