Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكتب والأعضاء

جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 50 من 57.

في هذا المشروع، تبني نواة نظام مكتبة. يتلقى كائن Library أوامر، أمرًا واحدًا في كل سطر، ويرد على كل منها. وخلال خمس خطوات، يتعلم إضافة الكتب والأعضاء، وإعارة الكتب واسترجاعها، والبحث في الفهرس، وطباعة تقرير.

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

يستخدم نموذج البيانات ما تم شرحه في هذا القسم. يوفّر Book حقلي id وtitle للقراءة فقط، وborrower من خلال موصّل وصول، مع المسند available?. يحتفظ Member بمعرّفات قروضه في مصفوفة. تعيش كل فئة في ملفها الخاص، book.rb وmember.rb وlibrary.rb، وتحتفظ المكتبة بكلا نوعَي الكائنات في تجزئتين لا تلمسهما إلا أساليبها الخاصة:

class Book
  attr_reader :id, :title
  attr_accessor :borrower

  def initialize(id, title)
    @id = id
    @title = title
    @borrower = nil
  end

  def available?
    borrower.nil?
  end
end

books = { 1 => Book.new(1, "Dune") }
books[1].borrower = "ada"
puts books[1].available?

الناتج:

false

handle(line) تقسّم الأمر وتتفرّع بناءً على كلمته الأولى باستخدام case. يعيد كل فرع ردوده في صورة مصفوفة، لذلك يمكن لأمر مثل REPORT أن يرد بعدة أسطر، بينما يخرج return مبكرًا مع ردّ خطأ. يمكن أن يحتوي عنوان الكتاب على مسافات، لذا فهو كل ما يأتي بعد المعرّف:

parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"

الناتج:

7: The Hobbit
challenge icon

التحدي

سهل

أكمل Library#handle للأمرين الأولين:

  • ADD_BOOK id title: خزّن كتابًا جديدًا متاحًا وأعد added book 1: Dune؛ وعندما يكون المعرّف مستخدمًا، أعد book 1 exists.
  • JOIN name: أضف عضوًا وأعد welcome ada؛ وعندما يكون الاسم موجودًا، أعد ada is already a member.

يمرّر الكود المزوّد كل سطر إدخال إلى library.handle(line) ويطبع كل رد مُعاد في سطر مستقل. أسماء الأعضاء كلمات مفردة مكتوبة بأحرف لاتينية صغيرة، ومعرّفات الكتب أعداد صحيحة، ولا يحتوي الإدخال إلا على الأوامر الموضّحة حتى الآن. أي أمر آخر يُعيد unknown command.

ضع الكود في book.rb وmember.rb وlibrary.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوّد ولا يمكن تعديله.

جرّب بنفسك

require_relative 'book'
require_relative 'member'
require_relative 'library'

# كود الإدخال/الإخراج المُزوَّد: أبقه كما هو
input = []
while (line = gets)
  input << line.chomp
end
library = Library.new
input.each do |line|
  library.handle(line).each { |reply| puts reply }
end
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت