Les classes en pratique : une boutique
Tu connais les classes, les objets et les fonctions de classe. Mettons tout cela en pratique sur un cas concret : gérer les produits d'une petite boutique.
Le modèle : la classe produit
Un produit a un nom, un prix et une quantité en stock. On ajoute trois fonctions de classe, qui sont les calculs propres aux produits :
classe produit:
nom est un texte
prix est un nombre
stock est un nombre
fonction valeurStock(unPrix, unStock)
retourne unPrix * unStock
fin fonction
fonction etiquette(unNom, unPrix)
retourne majuscules(unNom) + ' - ' + decimal(unPrix, 2) + ' €'
fin fonction
procédure alerter(unNom, unStock)
si unStock = 0 alors
affiche 'RUPTURE : ' + unNom
sinon si unStock < 5 alors
affiche 'Stock faible : ' + unNom + ' (' + unStock + ')'
fin si
fin procédure
fin classe
Rappel de la règle la plus importante : une fonction de classe ne voit pas les champs de l'objet. Elle reçoit tout ce dont elle a besoin par ses paramètres. C'est pour cela qu'ils s'appellent unPrix, unStock : ce sont des valeurs qu'on lui passe.
Créer les objets
Sous la classe, on crée trois produits et on remplit leurs champs :
p1, p2, p3 est un objet produit
p1.nom vaut 'cahier'
p1.prix vaut 2.5
p1.stock vaut 40
p2.nom vaut 'stylo'
p2.prix vaut 1.2
p2.stock vaut 3
p3.nom vaut 'gomme'
p3.prix vaut 0.8
p3.stock vaut 0
affiche p1.etiquette(p1.nom, p1.prix) // CAHIER - 2,5 €
affiche p2.etiquette(p2.nom, p2.prix) // STYLO - 1,2 €
Chaque objet a ses propres valeurs. Pour appeler une fonction de classe, on écrit l'objet, un point, le nom de la fonction, et on lui passe les champs utiles.
Question : Comment obtenir la valeur du stock du produit p2 ? — p2.valeurStock(p2.prix, p2.stock). La fonction s'appelle à partir de l'objet, et reçoit en arguments les champs dont elle a besoin.
Faire travailler les objets
Toujours sous la classe et les objets, on calcule la valeur totale du stock et on lance les alertes :
total est un nombre vaut 0
total ajoute p1.valeurStock(p1.prix, p1.stock)
total ajoute p2.valeurStock(p2.prix, p2.stock)
total ajoute p3.valeurStock(p3.prix, p3.stock)
affiche 'Valeur du stock : ' + decimal(total, 2) + ' €' // 103,6 €
appelle p1.alerter(p1.nom, p1.stock)
appelle p2.alerter(p2.nom, p2.stock)
appelle p3.alerter(p3.nom, p3.stock)
alerter est une procédure de classe : elle se lance avec appelle. Elle n'affiche rien pour le cahier, signale le stock faible du stylo et la rupture de la gomme.
40 × 2,5 + 3 × 1,2 + 0 × 0,8 = 100 + 3,6 + 0 = 103,6 €.
Vendre un produit
Une vente modifie le champ stock d'un objet. Les champs se modifient comme des variables :
quantite est un nombre vaut 2
si p2.stock >= quantite alors
p2.stock soustrait quantite
affiche 'Vendu : ' + quantite + ' x ' + p2.nom
affiche 'À payer : ' + decimal(p2.prix * quantite, 2) + ' €'
sinon
affiche 'Stock insuffisant pour ' + p2.nom
fin si
appelle p2.alerter(p2.nom, p2.stock)
Après la vente, il reste 1 stylo : l'alerte « Stock faible » s'affiche.
Une fonction utilitaire, sans objet
Une fonction de classe peut aussi s'appeler avec le nom de la classe, sans objet. Pratique pour un calcul général :
affiche produit.etiquette('trousse', 12) // TROUSSE - 12 €
Quelques règles à garder en tête : les parenthèses sont obligatoires à l'appel, même sans argument ; un champ et une fonction d'une même classe ne peuvent pas porter le même nom ; et il n'y a ni constructeur ni héritage.
Classe ou dictionnaire ?
- Un dictionnaire convient pour une information par objet (une quantité par produit), avec un nombre d'objets qui change souvent.
- Une classe convient quand chaque objet a plusieurs informations de types différents, et des calculs qui vont avec.
En résumé
- Une classe regroupe les champs d'un objet et les fonctions qui le concernent.
- Chaque objet créé avec
est un objet a ses propres valeurs. - Une fonction de classe reçoit les champs utiles en paramètres :
p1.valeurStock(p1.prix, p1.stock). - Une procédure de classe se lance avec
appelle.