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