Parcours
/
JavaScript
JavaScript
/
Exercices
/
Capteurs d'usine
Capteurs d'usine

Capteurs d'usine

Exercice d'apprentissage

Introduction

Erreurs

Les erreurs sont utiles pour signaler que quelque chose ne va pas ou est inattendu dans un programme ou dans un bout de code.

Ce sont des objets JavaScript.

La propriété principale de cet objet est message :

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

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

Avec la syntaxe throw, on peut lever une erreur.

throw new Error('Oops');

Quand une erreur est levée, l'exécution en cours s'arrête et reprend dans le premier bloc catch de la pile d'appels.

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

Héritage

L'héritage est une façon de créer des relations parent-enfant entre les classes. La classe enfant (parfois appelée sous-classe) a accès au comportement et aux données définis par la classe parente (parfois appelée superclasse).

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.

Le mot-clé extends dans la déclaration de la classe enfant établit une relation avec la classe parente via la chaîne de prototypes.

Les objets créés par le constructeur de la classe enfant ont le prototype de la classe parente dans leur chaîne de prototypes, ce qui donne accès à toutes les méthodes ou données définies par la parente.

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

Comme pour toute classe en JavaScript, les sous-classes peuvent hériter de Error pour créer des erreurs personnalisées en utilisant le mot-clé extends. La syntaxe instanceof permet de vérifier si l'erreur interceptée est une instance d'une sous-classe particulière 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');
  }
}

Instructions

Elena est la nouvelle responsable qualité d'une usine de journaux. Comme elle vient d'arriver dans l'entreprise, elle a décidé de passer en revue certains processus de l'usine pour voir ce qui pourrait être amélioré. Elle a découvert que les techniciens effectuent un grand nombre de contrôles qualité à la main. Elle y voit une bonne occasion d'automatiser certaines choses et te demande, à toi qui es développeur freelance, de concevoir un logiciel pour surveiller certaines des machines.

1. Surveille le taux d'humidité de la salle

Ta première mission est d'écrire un logiciel pour surveiller le taux d'humidité de la salle de production. Un capteur est déjà connecté au logiciel de l'entreprise et renvoie régulièrement le pourcentage d'humidité de la salle.

Tu dois implémenter une fonction dans le logiciel qui lèvera une erreur si le pourcentage d'humidité est trop élevé. La fonction devra s'appeler checkHumidityLevel et prendre le pourcentage d'humidité en paramètre.

Tu dois lever une erreur (le message n'a pas d'importance) si le pourcentage dépasse 70 %.

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

2. Détecte la surchauffe

Elena est très satisfaite de ta première mission et te demande de t'occuper de la surveillance de la température des machines. Alors que tu discutes avec un technicien, Greg, tu apprends que si la température d'une machine dépasse 500 °C, les techniciens commencent à s'inquiéter d'une surchauffe.

La machine est équipée d'un capteur qui mesure sa température interne. Tu dois savoir que ce capteur est très sensible et tombe souvent en panne. Dans ce cas, les techniciens devront le remplacer.

Ton travail consiste à implémenter une fonction reportOverheating qui prend la température en paramètre et lève une erreur si le capteur est cassé ou si la machine commence à surchauffer. Sachant que tu devras plus tard réagir différemment selon l'erreur, il te faut un mécanisme pour distinguer les deux types d'erreurs. Tu pourrais te fier aux messages d'erreur, mais cela rendrait le code fragile, car il casserait si le message venait à être modifié. Donc, pour pouvoir le faire correctement, tu lèveras des instances de classes d'erreur différentes.

  • Si le capteur est cassé, la température sera null. Dans ce cas, tu dois lever une ArgumentError.
  • Quand tout fonctionne, si la température dépasse 500 °C, tu dois lever une OverheatingError. Cette classe d'erreur sera instanciée avec un argument de température. Assure-toi que l'OverheatingError que tu lèves possède bien une propriété de température.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. Surveille la machine

Maintenant que ta machine peut détecter les erreurs, tu vas implémenter une fonction qui réagit à ces erreurs de différentes manières :

  • Si le capteur est cassé, tu dois prévenir un technicien
  • Si la température est trop élevée, tu arrêteras la machine si elle dépasse 600 °C, sinon tu allumeras un voyant d'avertissement.
  • Si une autre erreur se produit, tu la relanceras.

Implémente une fonction monitorTheMachine qui prend un argument actions.

actions est un objet qui possède 4 propriétés :

propriété description
check une fonction. Vérifie la température de la machine. Elle peut lever différentes erreurs.
alertDeadSensor une fonction. Avertit un technicien que le capteur de température est hors service.
alertOverheating une fonction. Allume un voyant d'avertissement sur la machine.
shutdown une fonction. Éteint la machine.

La fonction monitorTheMachine(actions) doit appeler check() en interne. Si cet appel réussit, la fonction ne doit rien renvoyer. Si cet appel fait un throw d'erreur, on attend un comportement différent :

exception comportement attendu
ArgumentError appeler la fonction alertDeadSensor.
OverheatingError exécuter le protocole de surchauffe.
(tout autre chose) relancer l'erreur

Protocole de surchauffe Si la température est inférieure à 600 °C, allume le voyant d'avertissement en appelant la fonction alertOverheating. Si la température dépasse 600 °C, la situation est critique, donc appelle la fonction shutdown.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Capteurs d'usine ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.