Menu
Coddy logo textTech

Livres et membres

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 50 sur 57.

Dans ce projet, vous construisez le cœur d’un système de bibliothèque. Une classe Library reçoit des commandes, une par ligne, et répond à chacune d’elles. En cinq étapes, elle apprend à ajouter des livres et des membres, à prêter et à reprendre des livres, à rechercher dans le catalogue et à imprimer un rapport :

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

Le modèle de données utilise ce que cette section a enseigné. Book et Member résident chacun dans leur propre fichier. Le borrower d’un livre peut être lu partout, mais ne peut être modifié qu’avec lendTo et giveBack, et un membre expose les identifiants de ses emprunts sous la forme d’une List en lecture seule. La bibliothèque conserve les deux dans des maps privées, de sorte que seules ses propres méthodes peuvent les modifier :

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 }
}

Dans 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}")

Sortie :

false ada

handle(line) divise la commande et utilise un when sur son premier mot. Chaque branche renvoie ses réponses sous forme de List<String>, ainsi une commande telle que REPORT peut répondre avec plusieurs lignes, et un return anticipé renvoie un refus. Le titre d’un livre peut contenir des espaces, donc il correspond à tout ce qui suit l’id :

À l’intérieur de main :

val p = "ADD_BOOK 7 The Hobbit".split(" ")
val id = p[1].toInt()
val title = p.drop(2).joinToString(" ")
println("$id: $title")

Sortie :

7: The Hobbit
challenge icon

Défi

Facile

Complète Library.handle(line) pour les deux premières commandes :

  • ADD_BOOK <id> <title> : stocke un nouveau livre disponible et répond added book 1: Dune ; lorsque l’id est déjà utilisé, répond book 1 exists.
  • JOIN <name> : ajoute un membre et répond welcome ada ; lorsque le nom existe déjà, répond ada is already a member.

Le code fourni transmet chaque ligne d’entrée à library.handle(line) et affiche chaque réponse renvoyée sur sa propre ligne. Les noms des membres sont des mots uniques en minuscules, les identifiants des livres sont des nombres entiers, et l’entrée contient uniquement les commandes décrites jusqu’à présent. Toute autre commande répond unknown command.

Ton code doit être placé dans Book.kt, Member.kt et Library.kt. Main.kt contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    val input = generateSequence(::readLine).toList()
    val library = Library()
    for (line in input) {
        for (reply in library.handle(line)) println(reply)
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin