الكتب والأعضاء
جزء من قسم البرمجة كائنية التوجه في رحلة 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التحدي
سهلأكمل 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت