Książki i czytelnicy
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 50 z 57.
W tym projekcie zbudujesz podstawę systemu bibliotecznego. Klasa Library otrzymuje polecenia, po jednym w wierszu, i odpowiada na każde z nich. W pięciu krokach nauczysz ją dodawać książki i członków, wypożyczać i zwracać 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 i Member mają osobne pliki. Wartość borrower książki można odczytać wszędzie, ale zmienia się ją tylko za pomocą lendTo i giveBack, a obiekt członka udostępnia identyfikatory jego wypożyczeń w postaci tylko do odczytu List. Biblioteka przechowuje oba typy danych w prywatnych mapach, więc tylko jej własne metody mogą je zmieniać:
class Book(val id: Int, val title: String) {
var borrower: String? = null
private set
val isAvailable: Boolean
get() = borrower == null
fun lendTo(name: String) { borrower = name }
}Wewnątrz main:
val books = mutableMapOf<Int, Book>()
books[1] = Book(1, "Dune")
books.getValue(1).lendTo("ada")
println("${books.getValue(1).isAvailable} ${books.getValue(1).borrower}")Wynik:
false adahandle(line) dzieli polecenie i używa instrukcji when dla jego pierwszego słowa. Każda gałąź zwraca odpowiedzi jako List<String>, więc polecenie takie jak REPORT może zwrócić kilka wierszy, a wczesne return zwraca odmowę. Tytuł książki może zawierać spacje, więc obejmuje wszystko po identyfikatorze:
Wewnątrz main:
val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")Wynik:
7: The HobbitWyzwanie
ŁatwyUzupełnij Library.handle(line) dla dwóch pierwszych poleceń:
ADD_BOOK <id> <title>: zapisz nową dostępną książkę i zwróć odpowiedźadded book 1: Dune; jeśli identyfikator jest już zajęty, zwróćbook 1 exists.JOIN <name>: dodaj członka i zwróć odpowiedźwelcome ada; jeśli taka nazwa już istnieje, zwróćada is already a member.
Dostarczony kod przekazuje każdy wiersz wejściowy do library.handle(line) i wyświetla każdą zwróconą odpowiedź w osobnym wierszu. Nazwy członków są pojedynczymi słowami pisanymi małymi literami, identyfikatory książek są liczbami całkowitymi, a wejście zawiera wyłącznie opisane dotąd polecenia. Każde inne polecenie zwraca odpowiedź unknown command.
Twój kod umieść w plikach Book.kt, Member.kt i Library.kt. Plik Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
fun main() {
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
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 klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Kotlin