téléchargez les sources du devoir
les devoirs sont des travaux individuels. Vous avez évidemment la possibilité de parler entre vous, et de vous donner des idées. Mais ça s'arrête là. Aucune ligne de code ne doit être copiée sur un autre auditeur ou une autre auditrice. Nous regardons le code !
pour que le système de rendu automatique fonctionne bien, il ne faut surtout pas modifier les en-têtes des méthodes que nous vous demandons d'écrire. Vous ne devez, ni modifier les paramètres ou les types de retour, ni ajouter ou supprimer d'exception déclarée. Si nous déclarons un héritage ou une implémentation, conservez-les tels quels. Vous avez en revanche le droit de créer de nouvelles classes, ou d'ajouter des méthodes personnelles.
pour rendre le second devoir, procédez comme pour le premier devoir : lancez le code fourni dans la classe RendreProjet.java
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 :
Abonnés, qui sont des personnes inscrites à la bibliothèque, qui peuvent emprunter des exemplaires d'ouvrages, et sont identifiés par un numéro ;Ouvrages, qui sont les livres vu comme œuvres, indépendamment de l'objet physique. Mort sur le Nil, d'Agatha Christie, est un ouvrage. On peut en avoir un exemplaire au format poche. Un objet livre est complètement décrit par la liste de ses auteurs et son titre, qui ne sont pas supposés être modifiés.Exemplaires, qui sont les objets physiques qu'on peut emprunter (et rendre!!) dans la bibliothèque. Un exemplaire a un numéro d'inventaire unique dans la bibliothèque.Exemplaire : un Exemplaire sait quand il est emprunté.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 :
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 :
Exemplaire renvoie à un Ouvrage ;Exemplaire est relié optionnellement à un Emprunt (s'il est emprunté) ;Emprunt est relié à un Exemplaire et à un Abonné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.
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 :
Création d'une localdate avec la méthode statique of() : cette méthode sert à créer une nouvelle date ; elle fonctionne un peu comme un constructeur, mais sans new devant. Exemple d'utilisation :
LocalDate date1 = LocalDate.of(2019, Month.DECEMBER, 31);
Comparaison de deux dates avec compareTo (ou equals si c'est juste pour l'égalité). LocalDate est Comparable. Pour savoir si d1 est avant d2, on peut écrire
if (d1.compareTo(d2) < 0) {...}
Calcul du jour suivant: si unJour est une LocalDate, alors, étant donné le code :
LocalDate suivant = unJour.plusDays(1);
suivant est un nouvel objet qui représente le lendemain de unJour.
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.
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.
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)
Écrire la méthode rendreExemplaire de la classe Bibliotheque, en respectant ses spécifications donnée dans la javadoc.
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.
Pour construire une vraie application par dessus ces classes, il faudrait :
getOuvragesParAuteur pour récupérer les ouvrages d'un auteur donné.Mais cela demanderait un peu trop de temps, et nous ne l'avons pas mis dans ce sujet.
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.