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, tu construis le cœur d’un système de bibliothèque. Une classe Library reçoit des commandes, une par ligne, et répond à chacune. 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
REPORTLe modèle de données utilise ce que cette section vous a appris. Book et Member se trouvent 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 }
}À l’intérieur de 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 adahandle(line) sépare la commande et utilise un when sur son premier mot. Chaque branche renvoie ses réponses sous forme de List<String>, ainsi une commande comme REPORT peut répondre sur plusieurs lignes, et un return anticipé renvoie un refus. Le titre d’un livre peut contenir des espaces ; il correspond donc à tout ce qui suit l’identifiant :
Dans 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 HobbitDéfi
FacileComplétez Library.handle(line) pour les deux premières commandes :
ADD_BOOK <id> <title>: enregistrez un nouveau livre disponible et répondezadded book 1: Dune; si l’id est déjà utilisé, répondezbook 1 exists.JOIN <name>: ajoutez un membre et répondezwelcome ada; si le nom existe déjà, répondezada 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 simples en minuscules, les identifiants des livres sont des nombres entiers et l’entrée ne contient que les commandes décrites jusqu’ici. Toute autre commande renvoie unknown command.
Votre code doit être placé dans Book.kt, Member.kt et Library.kt. Main.kt contient le code fourni pour les entrées/sorties et ne peut pas être modifié.
Essayez vous-même
fun main() {
// Code d'entrée/sortie fourni : conservez-le tel quel
val input = generateSequence(::readLine).toList()
val library = Library()
for (line in input) {
for (reply in library.handle(line)) println(reply)
}
}
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin