Devoir numéro 2 : Collections et entrées/sorties

Consignes

Présentation

Une bibliothèque a des abonnés, qui peuvent emprunter des livres. On prépare donc la création d'un logiciel permettant de gérer tout cela. Pour commencer, on ne s'intéresse pas à l'interface utilisateur, et on vous demande simplement de vous concentrer sur les classes qui vont gérer le fonctionnement interne du logiciel, ce qu'on appelle les classes métier.

On s'aperçoit que la bibliothèque peut contenir plusieurs exemplaires d'un même ouvrage. C'est important, parce que si un abonné cherche, par exemple, Mort sur le Nil, n'importe quel exemplaire disponible fera l'affaire.

On choisit donc de modéliser :

On vous fournit les classes correspondantes, mais certaines fonctionnalités ne sont pas terminées. À vous de les compléter.

Pensez à lire attentivement le code de toutes les classes. Regardez en particulier de quelles méthodes elles disposent.

Dans la suite, nous vous guidons par des questions assez précises. Il est intéressant de faire un petit schéma pour comprendre les relations des classes entre elles :

BibliothequeAbonneExemplaireOuvrageEmprunt***10..1

Il s'agit d'un schéma UML. Les traits indiquent ici la manière dont les classes sont reliées. Le « * » indique un lien de 1 à plusieurs (par exemple, une Bibliothèque contient plusieurs Ouvrages). Quand il y a une flèche,le lien est unidirectionnel (un Emprunt sait quel Abonné il concerne, l'objet Abonné ne connaît rien des Emprunts).

Le schéma indique en particulier :

Un autre intérêt du schéma est qu'il permet de repérer les classes les plus simples, celles qui ne dépendent d'aucune autre. Par exemple, ici, Abonne et Ouvrage ne référencent aucune autre classe. On peut donc les comprendre indépendemment des autres. Exemplaire est un peu plus complexe, car elle dépend d'Ouvrage et d'Emprunt.

La classe LocalDate

Dans cet exercice, on utilisera les collections, ainsi que la classe LocalDate introduite en java 8 pour représenter de manière propre des dates.
Un objet LocalDate représente une date donnée. Une fois créé, sa valeur ne change pas.

Comme ce qui nous intéresse, c'est d'abord que vous maîtrisiez les collections, nous vous guidons un peu sur les méthodes les plus intéressantes de LocalDate :

Comme pour tous les objets, on peut savoir si deux dates sont égales en utilisant equals. Les LocalDate ont une sémantique de valeur : deux LocalDates sont égales si et seulement si leur année, leur mois et leur jour sont égaux. Un objet LocalDate est immutable (ne peut changer de valeur) ; pour modifier une LocalDate, on en crée une nouvelle, comme on le fait avec les Strings qui sont elles aussi immutables.

Question 1

Complétez la méthode compareTo de la classe Ouvrage pour que deux ouvrages soient comparés :

Remarquez qu'un ouvrage a des auteurs. Pour comparer deux listes d'éléments, l1 et l2 vous pouvez partir de l'idée suivante :

taille = min(longeur(l1), longueur(l2))
pour i = 0 à taille - 1 faire
    si pas de résultat et l1[i] et l2[i] sont différents,
      resultat = comparaison de l1[i] et l2[i]
fin pour
si on n'a pas de résultat :
    - les listes sont égales jusqu'à taille
    - la liste la plus longue est "la plus grande".

Par ailleurs, on pourra considérer que l'ordre proposé par défaut pour les Strings (qui ignore les subtilités telles que les accents) convient pour notre travail.

Les tests vous aideront à bien comprendre cet ordre.

Question 2

Complétez la méthode tousLesOuvrages de la classe Bibliotheque pour qu'elle retourne la liste des ouvrages connus de la bibliothèque, dans l'ordre précisé à la question 1 (triés par ordre alphabétique de noms d'auteurs puis de titre)

Question 3

Écrire la méthode rendreExemplaire de la classe Bibliotheque, en respectant ses spécifications donnée dans la javadoc.

Question 4

Un objet Emprunt a une date limite ; si l'abonné ne l'a pas rendu après cette date, l'emprunt est en retard. Rappel : la classe LocalDate implémente Comparable.

Écrire la méthode getEmpruntsEnRetard de la classe Bibliotheque.

Note

Pour construire une vraie application par dessus ces classes, il faudrait :

Mais cela demanderait un peu trop de temps, et nous ne l'avons pas mis dans ce sujet.

Partie II : Lecture des descriptions d'ouvrages

On désire pouvoir importer des descriptions d'ouvrages depuis des fichiers textes. Pour cela, on a définit un format de la forme :

LIVRE:titre du premier livre
AUTEUR:nom du premier auteur du premier livre
AUTEUR:nom du second auteur du premier livre
FIN LIVRE
LIVRE:titre du second livre
AUTEUR:nom de l'auteur du second livre
FIN LIVRE

Un livre est décrit par l'annotation LIVRE, suivie du titre de celui-ci, puis de ses auteurs (à raison d'un par ligne). Un livre est toujours terminé par une ligne
"FIN LIVRE".

Des exemples vous sont fournis avec le jeu de test, dans la classe LecteurOuvragesTest ; nous vous invitons à les consulter.

La question: écrire la méthode lireDescriptions de la classe LecteurOuvrages.