المسارات
/
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 واختصارات الكتل، قررت إعادة هيكلة الكود قليلًا. فبدلًا من تخزين العناصر كـ Hash، ستستفيد من مهاراتك الجديدة.

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 لتستخدم اختصار الكتل الجديد الذي تعلمته بدلًا من Hash. وللتذكير، يجب أن تُرجع الطريقة ما يلي:

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، بدلًا من الإشارة إلى Hash. وللتذكير، يجب أن تُرجع الطريقة ما يلي:

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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.