Header Ads Widget

Ticker

6/recent/ticker-posts

Por que utilizar las funciones Getters y Setters

 Tengo dos razones.

  1. Razones de sintaxis
  2. Encapsulamiento

Razones de sintaxis

Cuando intenta obtener la longitud de una matriz, escribe array.lengthEsta lengthpropiedad actúa como una función Getter. Te devuelve valores en tiempo real.

Si lengthes una propiedad simple, lengthpermanecerá sin importar cuántos elementos agregue a la matriz. Dado lengthque el valor cambia según la longitud de la matriz, prueba que lengthNO es una propiedad simple.

Sin lengthembargo, no estoy seguro de si es una función Getter. No estaba documentado en ninguna parte, pero sospecho que sí.

Dado que usamos array.length(que actúa como una función Getter) para obtener valores, ¿por qué no usamos otras funciones Getter para obtener valores también? Ya estamos familiarizados con esta sintaxis.

Por ejemplo, digamos que tiene un carrusel y desea obtener la diapositiva actual. Tienes dos opciones:

  1. Crea una función normal
  2. Crea una función getter

Así es como se vería el código:

const carousel = {
  // Option 1: Normal function
  getCurrentSlide () {/* ... */},
  
  // Option 2: Getter function
  get currentSlide () {/* ...*/}
}

Primero, puede ver que no hay trabajo adicional para definir una función Getter. Entonces, ¿por qué no crear uno?

En segundo lugar, si usa una función Getter, la usa llamando a la propiedad. Si usa una función normal, debe llamar al método escribiendo paréntesis.

// Normal function
const currentSlide = carousel.getCurrentSlide()

// Getter function
const currentSlide = carousel.currentSlide

Creo que la versión de la función Getter es más ordenada, concisa y más fácil de entender. Para mí tiene más sentido.

Por otro lado, también podemos usar funciones de Setter en lugar de funciones normales.

// Normal function
carousel.setCurrentSlide(4)

// Setter function
carousel.currentSlide = 4 // Uses a Setter function

Una vez más, la versión de la función Setter me parece más ordenada. Ya estoy acostumbrado a esta sintaxis porque estoy acostumbrado a asignar valores con =.

Ahora, la clave es usar las funciones Getter y Setter para comunicar la intención del código.

  • Los getters obtienen algo
  • Los setters establecen algo
  • Los métodos hacen el resto

Una vez que obtenga este conjunto de intenciones, el código escrito con las funciones Getter y Setter será más fácil de analizar.

Aquí hay un ejemplo en el que obtenemos un valor, establecemos un valor y ejecutamos un proceso, todo hecho con funciones.

const value = object.getValue() // Gets value
object.setValue(5) // Sets value
object.method() // Runs a process

Y aquí está la misma versión con las funciones Getter y Setter.

const value = object.value // Getter
object.value = 5 // Setter 
object.method() // Runs a method

¿Qué te queda más claro? Para mí, la versión Getter and Setter lo es.

Cuando usa Getter y Setters, es más fácil ver si esa línea de código está OBTENIENDO un valor, CAMBIANDO un valor o EJECUTANDO un proceso. Ni siquiera tienes que prestar atención a los detalles de lo que escribiste.

Sí, es una pequeña cosa. Pero las pequeñas cosas se suman. Cuando se suma, ahorra una gran capacidad intelectual.

Encapsulamiento

La segunda razón es la capacidad de crear código seguro.

Digamos que tienes un coche. Un coche tiene combustible. Cuando el coche sale de fábrica, tiene 50 litros de combustible.

function Car () {
  const fuel = 50
}

Los automóviles necesitan saber cuánto combustible les queda. Una forma es exponer toda la propiedad del combustible.

function Car () {
  const fuel = 50
  return {
    fuel
  }
}

const car = Car() 
console.log(car.fuel) // 50

Pero cuando expone la fuelpropiedad de esta manera, permitimos a los usuarios realizar cambios fuelsin límites.

Digamos que la capacidad de combustible del automóvil es 100. Pueden agregar cualquier cantidad y romper el automóvil.

car.fuel = 3000
console.log(car.fuel) // 3000

Si usó una función Getter, no podrán cambiar esta fuelpropiedad.

function Car () {
  const fuel = 50
  return {
    get fuel () { return fuel } 
  }
}

const car = Car() 
car.fuel = 3000
console.log(car.fuel) // 50

Llevemos esto más lejos.

Si utilizó una función Setter para fuel, puede crear una protección para los posibles límites. Aquí hay uno en el que nos aseguramos de que el combustible del automóvil nunca exceda los 100.

function Car () {
  let fuel = 50
  return {
    get fuel () { return fuel }, 
    set fuel (value) {
      fuel = value
      if (value > 100) fuel = 100
    }
  }
}

const car = Car()
car.fuel = 3000
console.log(car.fuel) // 100

En resumen, me gustan las funciones Getter y Setter por dos razones:

  1. Razones de sintaxis. Es más fácil y rápido leer el código creado con las funciones de acceso.
  2. Encapsulamiento. Puedo crear código más seguro con funciones de acceso.

¡Eso es!

Publicar un comentario

0 Comentarios