Adloun

JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 6 · Exercice de TD

Codes de réduction

Classes et modules · niveau 3 (difficile)

Énoncé

Sans modifier la classe Panier de la Librairie, écrire une sous-classe PanierAvecCodes dont la méthode appliquerCode(code) accepte « RENTREE10 » (10 %) et « ETUDIANT5 » (5 %), sans tenir compte de la casse ni des espaces, et rend false pour un code inconnu. Les codes ne se cumulent pas : seule la plus forte réduction s'applique. Redéfinir total en réutilisant celui de la classe mère.

Corrigé


import { Panier } from "../librairie/panier.mjs";

// Une sous-classe ajoute les codes de réduction sans toucher à Panier.
class PanierAvecCodes extends Panier {
  static CODES = new Map([
    ["RENTREE10", 0.1],
    ["ETUDIANT5", 0.05],
  ]);

  #reduction = 0;

  appliquerCode(code) {
    const taux = PanierAvecCodes.CODES.get(code.trim().toUpperCase());
    if (taux === undefined) {
      return false;
    }
    this.#reduction = Math.max(this.#reduction, taux);
    return true;
  }

  total(livres) {
    return Math.round(super.total(livres) * (1 - this.#reduction) * 100) / 100;
  }
}

const livres = [{ isbn: "a", prix: 32 }, { isbn: "b", prix: 8.5 }];
const p = new PanierAvecCodes();
p.ajouter("a");
p.ajouter("b", 2);
console.log(p.total(livres));
console.log(p.appliquerCode("bidon"), p.appliquerCode(" rentree10 "), p.total(livres));
console.log(p.appliquerCode("ETUDIANT5"), p.total(livres));

49
false true 44.1
true 44.1

Sans code : . Avec 10 % : . Le code à 5 % est accepté mais ne change rien, Math.max gardant la plus forte réduction. La sous-classe n'a pas accès au champ privé #lignes de Panier (un champ privé n'est visible que dans la classe qui le déclare) : elle passe par super.total.

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 →