Książki i czytelnicy
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 50 z 57.
W tym projekcie zbudujesz rdzeń systemu bibliotecznego. Obiekt Library otrzymuje polecenia, po jednym w każdym wierszu, i odpowiada na każde z nich. W pięciu krokach nauczy się dodawać książki i członków, wypożyczać i oddawać książki, przeszukiwać katalog oraz drukować raport.
ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORTModel danych wykorzystuje to, czego uczy ta sekcja. Book udostępnia właściwości id i title tylko do odczytu, a właściwość borrower przez akcesor, oraz predykat available?. Member przechowuje identyfikatory swoich wypożyczeń w tablicy. Każda klasa znajduje się we własnym pliku: book.rb, member.rb i library.rb, a biblioteka przechowuje oba rodzaje obiektów w haszach, do których dostęp mają tylko jej własne metody:
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?Wynik:
falsehandle(line) dzieli polecenie i rozgałęzia działanie na podstawie jego pierwszego słowa za pomocą case. Każda gałąź zwraca odpowiedzi w postaci tablicy, więc polecenie takie jak REPORT może zwrócić kilka wierszy, a return kończy działanie wcześniej, zwracając odpowiedź z błędem. Tytuł książki może zawierać spacje, dlatego jest nim wszystko po identyfikatorze:
parts = "ADD_BOOK 7 The Hobbit".split
id = parts[1].to_i
title = parts[2..].join(" ")
puts "#{id}: #{title}"Wynik:
7: The HobbitWyzwanie
ŁatwyUzupełnij Library#handle dla dwóch pierwszych poleceń:
ADD_BOOK id title: zapisz nową dostępną książkę i odpowiedzadded book 1: Dune; jeśli identyfikator jest już zajęty, odpowiedzbook 1 exists.JOIN name: dodaj członka i odpowiedzwelcome ada; jeśli nazwa już istnieje, odpowiedzada is already a member.
Dostarczony kod przekazuje każdy wiersz wejściowy do library.handle(line) i wypisuje każdą zwróconą odpowiedź w osobnym wierszu. Nazwy członków to pojedyncze słowa pisane małymi literami, identyfikatory książek to liczby całkowite, a wejście zawiera tylko opisane dotąd polecenia. Każde inne polecenie zwraca odpowiedź unknown command.
Twój kod umieść w plikach book.rb, member.rb i library.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
require_relative 'book'
require_relative 'member'
require_relative 'library'
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input = []
while (line = gets)
input << line.chomp
end
library = Library.new
input.each do |line|
library.handle(line).each { |reply| puts reply }
end
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online