Треки
/
Ruby
Ruby
/
Вправи
/
Покращення інвентарю бутика
Покращення інвентарю бутика

Покращення інвентарю бутика

Навчальна вправа

Вступ

OpenStruct дає змогу легко створити обʼєкт із Hash. Замість того щоб звертатися до значень за ключами Hash, OpenStruct дає нам змогу читати й присвоювати значення методами.

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

Ще одна перевага цього підходу в тому, що ми можемо скористатися скороченням, коли використовуємо синтаксис блоку. Коли блок викликає лише один метод, його можна замінити на &:, після якого стоїть назва методу. Наприклад, ці два рядки коду рівнозначні:

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

Стандартна бібліотека

Усі класи, які ми бачили в попередніх вправах, належали до основної бібліотеки Ruby.

OpenStruct належить до стандартної бібліотеки Ruby (її часто скорочують до «stdlib»), яка містить класи для роботи з датами, json і мережами. Вона також містить корисну функціональність, яка спрощує роботу з нашим кодом.

Коли ми маємо справу з класами не з основної бібліотеки (власний код в інших файлах, класи зі stdlib або зовнішні залежності), їх потрібно імпортувати методом require, перш ніж використовувати. Наприклад:

require 'ostruct'

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

Вказівки

Ми продовжуємо працювати над системою керування запасами, яку створили раніше. Відколи ми відкрили для себе OpenStruct і скорочені записи блоків, ми вирішили трохи відрефакторити код. Замість того щоб зберігати товари як хеші, ми застосуємо нові набуті навички.

1. Дозволити отримання списку товарів

Нам потрібно й надалі отримувати список товарів на складі, але цього разу це мають бути обʼєкти, у яких можна викликати методи.

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. Відрефакторити item_names

Відрефакторте item_names, щоб використовувати новий скорочений запис блоку, який ми вивчили, а не хеші. Нагадаємо, метод має повертати:

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. Відрефакторити total_stock

Відрефакторте total_stock, щоб використовувати метод OpenStruct, а не звертатися до хешу. Нагадаємо, метод має повертати:

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
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Ruby Exercism

Час розпочати Покращення інвентарю бутика?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Ruby, а також 21 концепція121 вправа та справжнє наставництво від людей, і все це безкоштовно.