Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Sensores de fábrica
Sensores de fábrica

Sensores de fábrica

Ejercicio de aprendizaje

Introducción

Errores

Los errores son útiles para informar cuando algo va mal o es inesperado en un programa o en un fragmento de código.

Son objetos de JavaScript.

La propiedad principal de este objeto es message:

const error = new Error('Oops, something went wrong');

console.log(error.message);
// => "Oops, something went wrong"

Con la sintaxis throw, puedes lanzar un Error.

throw new Error('Oops');

Cuando se lanza un error, la ejecución actual se detiene y se reanuda en el primer bloque catch de la pila de llamadas.

try {
  throw new Error('Oops');
} catch (error) {
  console.log(error.message);
  // => "Oops"
}

Herencia

La herencia es una forma de crear relaciones padre-hijo entre clases. La clase hija (a veces denominada subclase) tiene acceso al comportamiento y a los datos definidos por la clase padre (a veces denominada superclase).

class Pet {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`This is my pet, ${this.name}.`);
  }
}

class Dog extends Pet {}

const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.

La palabra clave extends en la declaración de la clase hija establece una relación con la clase padre a través de la cadena de prototipos.

Los objetos creados por el constructor de la clase hija tendrán el prototipo de la clase padre en su cadena de prototipos, lo que da acceso a cualquier método o dato definido por la clase padre.

const dog = new Dog('Otis');

Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true

Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false

Como con cualquier clase en JavaScript, las subclases pueden heredar de Error para crear errores personalizados usando la palabra clave extends. La sintaxis instanceof comprobará si el error capturado es una instancia de una subclase concreta de Error.

class CustomError extends Error {}

try {
  // ... Code that may throw an error
} catch (error) {
  if (error instanceof CustomError) {
    console.log('The error thrown is an instance of the CustomError');
  }
}

Instrucciones

Elena es la nueva responsable de calidad de una fábrica de periódicos. Como acaba de llegar a la empresa, ha decidido revisar algunos de los procesos de la fábrica para ver qué se puede mejorar. Ha descubierto que los técnicos hacen un montón de controles de calidad a mano. Ve una buena oportunidad para la automatización y te pide a ti, desarrollador freelance, que desarrolles un programa para monitorizar algunas de las máquinas.

1. Monitoriza el nivel de humedad de la sala

Tu primera misión es escribir un programa para monitorizar el nivel de humedad de la sala de producción. Ya hay un sensor conectado al software de la empresa que devuelve periódicamente el porcentaje de humedad de la sala.

Debes implementar una función en el software que lance un error si el porcentaje de humedad es demasiado alto. La función debe llamarse checkHumidityLevel y recibir el porcentaje de humedad como parámetro.

Debes lanzar un error (el mensaje no es importante) si el porcentaje supera el 70 %.

checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error

2. Detecta el sobrecalentamiento

Elena está muy contenta con tu primera tarea y te pide que te encargues de monitorizar la temperatura de las máquinas. Mientras charlas con un técnico, Greg, este te cuenta que, si la temperatura de una máquina supera los 500 °C, los técnicos empiezan a preocuparse por el sobrecalentamiento.

La máquina está equipada con un sensor que mide su temperatura interna. Debes saber que el sensor es muy sensible y a menudo se rompe. En ese caso, los técnicos tendrán que cambiarlo.

Tu trabajo consiste en implementar una función reportOverheating que reciba la temperatura como parámetro y lance un error si el sensor está roto o si la máquina empieza a sobrecalentarse. Como más adelante tendrás que reaccionar de forma distinta según el error, necesitas un mecanismo para diferenciar los dos tipos de errores. Podrías basarte en los mensajes de error, pero eso haría tu código frágil, ya que se rompería si se actualiza el mensaje. Así que, para poder hacerlo correctamente, lanzarás instancias de distintas clases de error.

  • Si el sensor está roto, la temperatura será null. En ese caso, debes lanzar un ArgumentError.
  • Cuando todo funciona, si la temperatura supera los 500 °C, debes lanzar un OverheatingError. Esta clase de error se instanciará con un argumento de temperatura. Asegúrate de que el OverheatingError que lances tenga una propiedad temperature adjunta.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. Monitoriza la máquina

Ahora que tu máquina puede detectar errores, implementarás una función que reaccione a esos errores de distintas formas:

  • Si el sensor está roto, tienes que avisar a un técnico
  • Si la temperatura es demasiado alta, apagarás la máquina si la temperatura supera los 600 °C o encenderás una luz de advertencia si es inferior a esa cifra.
  • Si ocurre otro error, lo volverás a lanzar.

Implementa una función monitorTheMachine que reciba un argumento actions.

actions es un objeto que tiene 4 propiedades:

propiedad descripción
check una función. Comprueba la temperatura de la máquina. Puede lanzar varios errores.
alertDeadSensor una función. Avisa a un técnico de que el sensor de temperatura está averiado.
alertOverheating una función. Encenderá una luz de advertencia en la máquina.
shutdown una función. Apagará la máquina.

La función monitorTheMachine(actions) debe llamar internamente a check(). Si eso no lanza ningún error, la función no debe devolver nada. Si eso, al hacer throw, lanza un error, se espera un comportamiento distinto:

excepción comportamiento esperado
ArgumentError llama a la función alertDeadSensor.
OverheatingError ejecuta el protocolo de sobrecalentamiento.
(cualquier otra cosa) vuelve a lanzar el error

Protocolo de sobrecalentamiento Si la temperatura es inferior a 600 °C, enciende la luz de advertencia llamando a la función alertOverheating. Si la temperatura supera los 600 °C, la situación es crítica, así que llama a la función shutdown.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Sensores de fábrica?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.