Adloun

JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 6 · Application directe du cours

Réserver dans un stock

Classes et modules · niveau 2

Énoncé

Écrire une classe Stock à deux champs privés, la quantité en rayon et la quantité réservée. L'accesseur disponible rend leur différence ; reserver(n) réserve si c'est possible et rend true, sinon false sans rien changer ; annuler(n) libère n réservations (sans descendre sous zéro). Que se passe-t-il si l'on écrit s.disponible = 99 ?

Corrigé


class Stock {
  #disponible;
  #reserve = 0;

  constructor(quantite) {
    this.#disponible = quantite;
  }

  get disponible() {
    return this.#disponible - this.#reserve;
  }

  reserver(n) {
    if (n > this.disponible) {
      return false;
    }
    this.#reserve += n;
    return true;
  }

  annuler(n) {
    this.#reserve = Math.max(0, this.#reserve - n);
  }
}

const s = new Stock(5);
console.log(s.reserver(3), s.disponible);
console.log(s.reserver(3), s.disponible);
s.annuler(10);
console.log(s.disponible);
s.disponible = 99;

true 2
false 2
5
Uncaught TypeError: Cannot set property disponible of #<Stock> which has only a getter

La seconde réservation de 3 échoue (il n'en reste que 2) et ne change rien ; annuler(10) ramène les réservations à 0 grâce à Math.max. disponible n'a pas de mutateur : dans un module (mode strict), l'affectation lève une TypeError. C'est voulu : la valeur est calculée, on ne peut pas l'imposer.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →