Parcours
/
Ruby
Ruby
/
Exercices
/
Améliorations de l'inventaire de la boutique
Améliorations de l'inventaire de la boutique

Améliorations de l'inventaire de la boutique

Exercice d'apprentissage

Introduction

OpenStruct permet de créer facilement un objet à partir d'un Hash. Plutôt que d'y accéder par les clés du Hash, OpenStruct nous permet d'utiliser des méthodes pour lire et définir les valeurs.

attributes = { name: "Jeremy Walker", age: 21, location: "Nomadic" }
person = OpenStruct.new(attributes)

person.name
#=> Jeremy Walker

person.location
#=> Nomadic

# Update the age
person.age = 35

# It sets correctly
person.age
#=> 35

Un avantage de cette approche est qu'on peut profiter d'un raccourci quand on utilise la syntaxe de bloc. Quand un bloc appelle une seule méthode, tu peux remplacer le bloc par &: suivi du nom de la méthode. Par exemple, ces deux lignes sont équivalentes :

people.sum { |person| person.age }
people.sum(&:age)

Bibliothèque standard

Toutes les classes que tu as vues dans les exercices précédents font partie de la bibliothèque de base de Ruby.

OpenStruct fait partie de la bibliothèque standard de Ruby (souvent abrégée en « stdlib ») : un ensemble de classes pour travailler avec des choses comme les dates, le JSON ou la mise en réseau. Elle propose aussi des fonctionnalités utiles pour rendre ton code plus facile à manipuler.

Quand on utilise des classes qui ne viennent pas de la bibliothèque de base (ton propre code dans d'autres fichiers, des classes de la bibliothèque standard ou des dépendances externes), il faut les importer avec la méthode require avant de pouvoir s'en servir. Par exemple :

require 'ostruct'

person = OpenStruct.new(name: "Jeremy Walker")
# ...

Instructions

Tu continues de travailler sur le système de gestion des stocks que tu as construit précédemment. Depuis que tu as découvert OpenStruct et les raccourcis de bloc, tu as décidé de réécrire un peu le code. Plutôt que de stocker les articles sous forme de hashes, tu vas mettre à profit tes nouvelles compétences.

1. Permettre la récupération des articles

Tu veux continuer à récupérer la liste des articles en stock, mais cette fois ils doivent être des objets sur lesquels on peut appeler des méthodes.

inventory = BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
])

inventory.items.first.name
# => "Maxi Brown Dress"

inventory.items.first.price
# => 65

inventory.items.size
# => 4

2. Réécrire item_names

Réécris item_names pour utiliser le nouveau raccourci de bloc que tu as appris plutôt que des hashes. Pour rappel, la méthode doit renvoyer :

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).item_names

# => ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"]

3. Réécrire total_stock

Réécris total_stock pour utiliser la méthode de l'OpenStruct plutôt que de référencer un hash. Pour rappel, la méthode doit renvoyer :

BoutiqueInventory.new([
  {price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
  {price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
  {price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
  {price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).total_stock

# => 36
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Ruby Exercism

Prêt à commencer Améliorations de l'inventaire de la boutique ?

Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.