Sách và thành viên
Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 50 trên 57.
Trong dự án này, bạn sẽ xây dựng phần cốt lõi của một hệ thống thư viện. Đối tượng Library nhận lệnh, mỗi dòng một lệnh, rồi phản hồi từng lệnh. Qua năm bước, bạn sẽ học cách thêm sách và thành viên, cho mượn và nhận lại sách, tìm kiếm danh mục và in báo cáo.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTMô hình dữ liệu sử dụng những gì phần này đã dạy. Book cung cấp quyền chỉ đọc cho id và title, còn borrower thì truy cập thông qua một bộ truy cập, cùng với vị từ available?. Member lưu các ID của những lượt mượn trong một mảng. Mỗi lớp nằm trong tệp riêng, book.rb, member.rb và library.rb, còn thư viện lưu cả hai loại đối tượng trong các hash mà chỉ những phương thức của chính nó mới truy cập:
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?Đầu ra:
falsehandle(line) tách lệnh rồi phân nhánh theo từ đầu tiên bằng case. Mỗi nhánh trả về các phản hồi dưới dạng một mảng, vì vậy một lệnh như REPORT có thể phản hồi bằng nhiều dòng, còn return kết thúc sớm và trả về một phản hồi lỗi. Tên sách có thể chứa khoảng trắng, vì vậy tên sách là tất cả nội dung sau id:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"Đầu ra:
7: The HobbitThử thách
DễHoàn thiện Library#handle cho hai lệnh đầu tiên:
ADD_BOOK id title: lưu một cuốn sách mới đang có sẵn và trả lờiadded book 1: Dune; nếu id đã được dùng, hãy trả lờibook 1 exists.JOIN name: thêm một thành viên và trả lờiwelcome ada; nếu tên đã tồn tại, hãy trả lờiada is already a member.
Code được cung cấp truyền từng dòng đầu vào cho library.handle(line) và in mỗi câu trả lời được trả về trên một dòng riêng. Tên thành viên là các từ viết thường đơn lẻ, id sách là số nguyên và đầu vào chỉ chứa các lệnh đã mô tả đến thời điểm này. Với lệnh khác, hãy trả lời unknown command.
Code của bạn nằm trong book.rb, member.rb và library.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
require_relative 'book'
require_relative 'member'
require_relative 'library'
# Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online