Header Ads Widget

Ticker

6/recent/ticker-posts

Polimorfismo en JavaScript

 Durante mucho tiempo, pensé que "Polymorphing" se trataba de convertir algo en ovejas (gracias a Warcraft). La imagen de la oveja se me quedó grabada y me hizo difícil entender exactamente qué es el polimorfismo.

Hoy quiero explorar qué es realmente el polimorfismo. (Dato curioso: la mayoría de los artículos sobre polimorfismo en JavaScript cubren menos de 1/3 de lo que realmente es).

¿Qué es el polimorfismo?

El polimorfismo proviene de la palabra polimorfismo.

  • Poly: Muchos.
  • Morph: cambia de una forma a otra.

Entonces, el polimorfismo es la capacidad de adoptar múltiples formas.

** Hay tres tipos de polimorfismo en la programación: **

  1. Polimorfismo adhoc
  2. Polimorfismo paramétrico
  3. Polimorfismo de subtipo

La mayoría de los artículos sobre programación orientada a objetos y polimorfismo explican solo el tercer tipo. No explican los otros dos.

Polimorfismo adhoc

Adhoc se utiliza para describir la creación de algo sin planificación previa. En otras palabras, el polimorfismo Adhoc significa cambiar algo de una forma a otra en el acto.

Hay muchas formas de polimorfismo adhoc

  1. Sobrecarga del operador
  2. Sobrecarga de funciones
  3. Polimorfismo de coerción

Sobrecarga del operador

Sobrecargar significa poder hacer más de una cosa.

Ejemplo:

El +operador en JavaScript hace muchas cosas. Puedes usarlo para sumar números. También puede usarlo para concatenar cadenas.

// Adding numbers
1 + 1 // Results in 2

// Adding Strings
'Hello' + ' ' + 'World' // Results in 'Hello World'

// Adding Numbers to Strings
1 + 'up' // Results in '1up'
Muestra los resultados del código anterior dentro de una consola de desarrollo.

La typedel resultado cambia según lo que se agrega.

  • NumberNumbercreaNumber
  • NumberStringcreaString

En +este caso, el operador le permite cambiar los valores de una forma (me gusta Number) a otra (me gusta String).

Sobrecarga de funciones

En algunos lenguajes de programación, la sobrecarga de funciones significa crear dos (o más) funciones con el mismo nombre. Cada función hace algo diferente dependiendo de los argumentos que se le den.

Ejemplo de Wikipedia sobre el cálculo del volumen en C ++:

// Volume of a Cube.
int Volume(int s) {
  return s * s * s;
}

// Volume of a Cuboid.
long Volume(long l, int b, int h) {
  return l * b * h;
}

La sobrecarga de funciones en JavaScript es ligeramente diferente porque no podemos producir dos funciones diferentes con el mismo nombre.

Usamos una función, pero cambiamos los resultados de acuerdo con los argumentos que recibimos .

El ejemplo anterior podría reescribirse de la siguiente manera en JavaScript:

function volumeCuboid (length, breadth, height) {
  return length * breadth * height
}

function volumeCube (length) {
  return volumeCuboid(length, length, length)
}


// Overloading happens here
function calculateVolume (...args) {
  if (args.length === 3) return volumeCuboid(...args)
  return volumeCube(args[0])
}

No necesitamos depender de la cantidad de argumentos. También podemos cambiar el resultado dependiendo del valor de cada argumento.

Ejemplo:

Podemos tener una createShapefunción que devuelva diferentes objetos dependiendo del valor de shape(El patrón de fábrica utiliza este tipo de polimorfismo).

function createShape (size, shape) {
  if (shape === 'triangle') return new Triangle(/* ... */)
  if (shape === 'rectangle') return new Rectangle(/* ... */)
  if (shape === 'square') return new Square(/* ... */)
}

(Dato curioso : entendí esta versión del polimorfismo de Refactorización: mejora del diseño del código existente de Martin Fowler . Me hizo sentir un poco más de curiosidad acerca del polimorfismo, ¡lo que finalmente me llevó a este artículo que estás leyendo!)

Si profundizamos más esta teoría, todas las declaraciones ifswitchdan como resultado una sobrecarga de funciones.

function createEmoji (emotion) {
  if (emotion === 'happy') return '😃'
  if (emotion === 'sad') return '😞'
  return 😑
}

Polimorfismo de coerción

JavaScript tiene coerción de tipo. Convierte valor de un tipo a otro mientras los evalúa.

Por ejemplo, puede cualquier expresión dentro de una ifdeclaración. JavaScript convierte la expresión en truefalseSi la expresión se convierte en true, se dice que la expresión es veraz. Si la expresión se convierte en false, se dice que la expresión es falsa.

const string = 'hello'
if (string) {
  console.log(string)
}

Otro ejemplo: puede comparar cadenas y números con ==(aunque generalmente no se recomienda).

22 == '22' // true

Dado que la coerción de tipo ocurre en el lugar, es una forma de polimorfismo ad hoc.

¿Sobrecarga variable?

No estoy seguro de este.

Wikipedia define el polimorfismo como esto:

El polimorfismo es la provisión de una interfaz única a entidades de diferentes tipos, o el uso de un solo símbolo para representar diferentes tipos.

"Usar un solo símbolo para representar diferentes tipos" me parece una sobrecarga de variables. (La sobrecarga variable no es un término real. Es algo que se me ocurrió).

Ya sobrecargamos las variables en JavaScript ya que cada variable puede representar cualquier valor.

// Variables in JavaScript can represent any value
const str = 'string'
const num = 123
const bool = true
const array = []
const obj = {}
const nah = null

Polimorfismo paramétrico

El polimorfismo paramétrico es un polimorfismo relacionado con los parámetros ... Pero eso no es muy útil, así que describamos de qué se trata.

El polimorfismo paramétrico tiene dos partes:

  1. Datos que pueden contener muchos tipos de datos
  2. Funciones que pueden trabajar con muchos tipos de datos

Datos que pueden contener muchos tipos de datos

Todo en JavaScript es un objeto. Entonces, los objetos son paramétricos. Se puede convertir en otros tipos de datos.

Los objetos también pueden almacenar varios tipos. No le importa qué valores se almacenan.

const object = {
  str: 'hello',
  num: 123,
  bool: true
}

Las matrices también son paramétricas. Le permite almacenar muchos tipos de datos y no le importa cuáles sean.

const array = ['hello', 123, true]

Funciones que pueden trabajar con muchos tipos de datos

Las funciones que pueden trabajar con muchos tipos de datos se denominan funciones polimórficas. No les importa lo que venga. Aplicarán la transformación que se les dice que hagan y escupen un resultado.

mapes un buen ejemplo. Toma una matriz y escupe otra matriz. No le importa lo que esté en el medio.

const doubled = [1, 2, 3].map(num => num * 2)

Puede usar mappara convertir números en cadenas.

const toString = [1, 2, 3].map(num => `${num}`)

Object.assignes otro ejemplo. Toma un objeto y escupe otro, pero no le importa lo que entra en cada objeto.

Object.assign({}, { property: 'value'})

Polimorfismo de subtipo

El polimorfismo de subtipo implica la creación de objetos derivados a partir de un objeto principal . Se puede llamar polimorfismo de inclusión, subclases o herencia. (Herencia es una palabra tan cargada. Lo explicaré otro día).

Los objetos derivados pueden anular un método del padre y seguirá funcionando.

Ejemplo:

Digamos que tienes una Humanclase con un sayHimétodo:

class Human {
  constructor(name) {
    this.name = name
  }

  sayHi() {
    console.log(`Hi! My name is ${name}`)
  }
}

Luego crea una subclase DeveloperDesignerde Human.

class Developer extends Human {/* ... */}
class Designer extends Human {/* ... */}

Nosotros DesignerDeveloperpara hablar más sobre ellos mismos, para que podamos anular el sayHimétodo.

class Developer extends Human () {
  sayHi() {
    console.log(`Hi! My name is ${name}. I am a developer.`)
  }
}

class Designer extends Human () {
  sayHi() {
    console.log(`Hi! My name is ${name}. I am a designer.`)
  }
}

Ahora tienes tres clases diferentes. Cada uno de ellos puede sayHiPuede usarlos sayHinormalmente y todos funcionarán, pero producen resultados diferentes.

const zell = new Human('Zell')
const vincy = new Developer('Vincy')
const tim = new Designer('Tim')

zell.sayHi() // Hi! My name is Zell.
vincy.sayHi() // Hi! My name is Vincy. I am a developer.
tim.sayHi() // Hi! My name is Tim. I am a designer.

¡Eso es!

Terminando

Hay tres tipos de polimorfismo.

  1. Polimorfismo adhoc
  2. Polimorfismo paramétrico
  3. Polimorfismo de subtipo

Lo más probable es que ya estés usando polimorfismo sin saberlo 😉. ¡Espero que esto te aclare el polimorfismo!

Publicar un comentario

0 Comentarios