Menu
Coddy logo textTech

Książki i czytelnicy

Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 50 z 57.

W tym projekcie zbudujesz podstawy systemu bibliotecznego. Klasa Library otrzymuje polecenia, po jednym w każdym 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, wyszukiwać w katalogu oraz drukować raport:

ADD_BOOK 1 Dune
JOIN ada
BORROW ada 1
RETURN ada 1
SEARCH dune
REPORT

Model danych wykorzystuje to, czego nauczyła ta sekcja. Book i Member znajdują się każdy we własnym pliku. Wartość borrower książki można odczytać wszędzie, ale można ją zmienić tylko za pomocą lendTo i giveBack, a obiekt członka udostępnia identyfikatory jego wypożyczeń jako tylko do odczytu List. Biblioteka przechowuje oba obiekty w prywatnych mapach, więc zmieniać je mogą tylko jej własne metody:

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 ada

handle(line) dzieli polecenie i używa 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, co występuje 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 Hobbit
challenge icon

Wyzwanie

Łatwy

Uzupełnij Library.handle(line) dla dwóch pierwszych poleceń:

  • ADD_BOOK <id> <title>: zapisz nową dostępną książkę i zwróć added book 1: Dune; jeśli identyfikator jest zajęty, zwróć book 1 exists.
  • JOIN <name>: dodaj członka i zwróć 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 wypisuje każdą zwróconą odpowiedź w osobnym wierszu. Nazwy członków to pojedyncze słowa zapisane małymi literami, identyfikatory książek są liczbami całkowitymi, a wejście zawiera tylko opisane dotąd polecenia. Każde inne polecenie zwraca unknown command.

Umieść swój kod 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)
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Kotlin