Menu
CoddyTech

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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 عبر الإنترنت