- 1. Dessinez un diagramme de classes représentant la bibliothèque.
- 2. Le diagramme de classes permet-il de connaître :
- 3. Dessinez une machine d’états pour chaque classe dont le comportement dépend de son état.
- 4. Identifiez les invariants de votre diagramme. Utilisez OCL pour les exprimer.
- 5. Identifiez les cas d’utilisation de la bibliothèque.
1. Dessinez un diagramme de classes représentant la bibliothèque.
1.1. Commencez par le concept de "Livre". Quels sont ses attributs ? Est-ce chaque mention à "livre" dans l’énoncé correspond au même concept ?
1.1.1. Commencez par le concept de "Livre". Quels sont ses attributs ?
un livre a pour attribut :
-
un identifiant
-
un numéro ISBN (si le livre est sorti après 1960)
-
un titre
-
une liste d’auteurs
-
son état qui peut être soit "neuf", "légèrement abîmé", "catastrophique"
-
la section de la bibliothèque où il se situe
-
une liste d’exemplaires
-
une liste de comités qui l’ont emprunté
-
une liste d’abonnés qui l’ont emprunté
-
une liste d’abonnés où il est en cours d’emprunt
-
une liste des bibliothécaires qui sont en charge de ce livre
1.2. Le concept "personne"
Une personne a pour attributs :
-
un nom
-
un prénom
-
une adresse email
-
une adresse
-
une date de naissance
-
une liste de comités dans lesquels elle participe
1.3. Le concept "abonné".
1.3.1. Un abonné a pour attributs :
Un abonné hérite de tous les attributs de personne, et il a en plus :
-
un numéro d’abonné
-
un nombre de pénalités initialisé à 0 mais qui augmente lorsque l’abonné rend des livres en retard ou endommagés
-
un booléen puni qui indique si l’abonné est puni parce qu’il a eu trop de pénalités et donc ne pourra pas emprunter de livres
-
la liste des livres qu’il a empruntés avec les dates d’emprunt (historique)
-
la liste des livres en cours d’emprunt
-
la liste d’exemplaires de livres qu’il a reçus
1.4. Le concept "bibliothécaire"
1.4.1. Un bibliothécaire a pour attributs :
Un bibliothécaire hérite de tous les attributs de personne, et il a en plus :
-
un numéro d’agent
-
une liste de livres qu’il a eu à prendre en charge
-
une liste de sections qu’il a en charge.
-
une liste d’exemplaires qu’il a eu à envoyer à des comités ou à des abonnés
1.5. Le concept "comité"
1.6. Le concept "section"
1.6.1. Les attributs d’une section peuvent inclure :
Une section a pour attributs :
-
L’identifiant de la section
-
Le nom de la section
-
La catégorie de la section
-
La liste de livres que contient cette section
-
La liste des personnes responsables de cette section
-
La liste des exemplaires de livres qui y sont rangés
2. Le diagramme de classes permet-il de connaître :
3. Dessinez une machine d’états pour chaque classe dont le comportement dépend de son état.
3.1. Commencez à nouveau par "Livre". Quels sont ses états ?
3.1.1. livre
diagramme
Les états possibles d’un livre sont :
-
En cours de commande : lorsque la bibliothécaire commande un livre.
-
Disponible : lorsque le livre est arrivé à la bibliothèque.
-
En attente d’emprunt : lorsque un abonné souhaite emprunter un livre.
-
Annulée : lorsque la bibliothécaire décide de ne pas accepter l’emprunt pour une quelconque raison.
-
Empruntée : lorsque l’emprunt est validé par la bibliothécaire.
-
Rendu : lorsque l’abonné rend le livre qu’il a emprunté.
-
Supprimée : en cas de conflit éditorial
3.1.2. abonné
diagramme
Les états d’un abonné sont:
-
Actif : lorsque l’abonné est en mesure d’emprunter des livres.
-
Suspendu : lorsque l’abonné a dépassé le nombre de pénalités autorisées et ne peut plus emprunter de livres pour le moment.
-
Inactif : lorsque l’abonné a annulé son abonnement ou n’est plus autorisé à emprunter des livres pour d’autres raisons.
4. Identifiez les invariants de votre diagramme. Utilisez OCL pour les exprimer.
4.1. livre et exemplaire
context Livre
inv :
-
self.titre→size() >= 1
-
self.listeAuteur→size() >= 1
-
self.datePublication→after() >= -800
-
self.section <> null
-
self.isbn = null implies self.datePublication < Date(1960,1,1)
-
self.datePublication < Date.oclNow()
context Exemplaire
inv :
-
self.livreReference <> null
4.2. personnes
context Personne
inv :
-
self.nomPersone→size() >= 1
-
self.prenomPersone→size() >= 1
-
self.adresse→size() >= 1
-
self.emailPerson→size() >= 1
-
self.anneeDeNaissance >= 1910
-
self.anneeDeNaissance < Date.oclNow()
5. Identifiez les cas d’utilisation de la bibliothèque.
-
Emprunter un livre : Un abonné demande à emprunter un livre de la bibliothèque.
-
Rendre un livre : Un abonné retourne un livre emprunté à la bibliothèque.
-
Chercher un livre : Un utilisateur cherche un livre dans le catalogue de la bibliothèque, ou un bibliothécaire recherche un livre dans une section.
-
Ajouter un livre : Un bibliothécaire ajoute un nouveau livre à la bibliothèque.
-
Supprimer un livre : Un bibliothécaire retire un livre de la bibliothèque.
-
Gérer les abonnés : Un bibliothécaire gère les informations des abonnés, comme l’inscription et la suspension d’un abonnement.
-
Vérifier l’état d’un exemplaire de livre que l’abonné a rendu : Un bibliothécaire vérifie l’état d’un livre retourné pour déterminer s’il doit être réparé ou retiré de la collection.
-
Organiser des sessions de lecture : Un comité s’assemble pour discuter d’un ou plusieurs livres.
5.1. Quels sont les acteurs qui interagissent avec elle ?
-
Abonné : peut :
-
rechercher un livre à la bibliothèque,
-
emprunter un livre,
-
rendre un livre,
-
rejoindre un comité,
-
sortir d’un comité,
-
s’abonner à la bibliothèque,
-
se désabonner de la bibliothèque.
-
-
Bibliothécaire :
-
vérifier l’état des livres,
-
transmettre des exemplaires de livres aux comités et aux abonnés,
-
gérer les abonnements d’un abonné,
-
vérifier l’état d’un exemplaire d’un livre,
-
changer la section d’un ou plusieurs livres,
-
rejoindre un comité,
-
sortir d’un comité,
-
annuler l’emprunt d’un livre,
-
supprimer un livre.
-
-
Comité de lecture peut :
-
emprunter des livres,
-
rendre des livres,
-
changer la section d’un ou plusieurs livres.
-
5.2. Utilisez des pré- et post-conditions pour spécifier les cas d’utilisation "Emprunter" et "Rendre" un livre.
En se basant sur les règles
voici un le tableau de de pre et poste condition d’emprunter et rendre un livre
Abone::Emprunter_Livre | Abone::Rendre_Livre | Comite::emprunter_livre | Comite:rendre_Livre | |
---|---|---|---|---|
pre-condition |
Le livre doit exister dans la base de données. L’exemplaire que l’abonné prend doit correspondre au livre qu’il emprunte. Il doit y avoir un exemplaire disponible pour l’emprunt. L’abonné doit exister dans la base de données. L’abonné qui veut emprunter le livre ne doit pas être puni. L’abonné qui veut emprunter le livre ne doit pas avoir 2 emprunts en cours. |
L’exemplaire que l’abonné rend correspond bien au livre qu’il a emprunté. L’abonné existe dans la base de données. Le livre appartient à la bibliothèque. L’abonné doit avoir dans sa liste d’emprunts le livre qu’il veut rendre. |
Le livre doit exister dans la base de données. L’exemplaire que le comité prend doit correspondre au livre que le comité emprunte. Il doit y avoir un exemplaire disponible pour le comité qui demande. Le comité doit exister dans la base de données. Le comité qui veut emprunter le livre ne doit pas avoir 4 emprunts en cours. Le bibliothécaire qui s’occupera de la gestion du livre pour le comité ne doit pas être membre du comité. Le bibliothécaire qui s’occupera de la gestion de l’exemplaire du livre pour le comité ne doit pas être membre du comité. |
L’exemplaire que le comité rend correspond bien au livre que le comité a emprunté. Le comité existe dans la base de données. Le livre appartient à la bibliothèque. Le comité doit avoir dans sa liste d’emprunts le livre qu’il veut rendre. Le bibliothécaire qui s’occupera de la gestion du livre pour le comité ne doit pas être membre du comité. Le bibliothécaire qui s’occupera de la gestion de l’exemplaire du livre pour le comité ne doit pas être membre du comité. |
post-condition |
Le livre est ajouté à la liste des emprunts en cours de l’abonné à la date à laquelle il a emprunté le livre. L’abonné est ajouté à la liste des emprunts en cours du livre. Le livre est ajouté à l’historique de l’abonné. L’abonné est ajouté à l’historique de ceux qui ont emprunté le livre. L’exemplaire du livre est ajouté à la liste des exemplaires de l’abonné qui l’a commandé. L’abonné est ajouté à la liste des personnes qui ont reçu l’exemplaire. Si il n’y a plus d’exemplaire, alors le statut du livre passe à "non disponible". Le livre est ajouté à la liste des livres manipulés par la bibliothèque avec la date de l’envoi et comme motif "envoi du livre". Le bibliothécaire est ajouté à la liste des bibliothécaires ayant manipulé le livre. |
Si le livre est en mauvais état, alors la pénalité de l’abonné augmente de 1. Si la date de rendu réelle est supérieure à la date de rendu prévue, alors la pénalité de l’abonné augmente de 1. Si le nombre de pénalités de l’abonné atteint un nombre critique donné, alors l’abonné est puni (punis = true). Le livre est retiré de la liste des emprunts en cours de l’abonnée. L’abonnée est retirée de la liste des emprunts en cours du livre. L’exemplaire est retiré de la liste des exemplaires de l’abonnée. L’abonné est retiré de l’exemplaire du livre. L’exemplaire est retiré de la liste des exemplaires de l’abonnée. Le bibliothécaire qui a effectué le rendu est également ajouté à la liste des personnes ayant manipulé le livre. Le livre est ajouté dans la liste des livres pris en charge par la bibliothécaire avec la date de retour, et comme motif "retour du livre". L’exemplaire est supprimé de la liste des exemplaires envoyés par la bibliothécaire. Le bibliothécaire est supprimé de la liste de l’exemplaire. L’abonné est supprimé de la liste de l’exemplaire. L’exemplaire est supprimé de la liste des exemplaires reçus. |
Le livre est ajouté à la liste des Emprunt encours de du comité à la date à laquelle le comite a emprunté le livre. Le comité est ajouté dans la liste des emprunts en cours du livre. Le livre est ajouté à l’historique du comité. Le comité est ajouté dans l’historique de ceux qui ont emprunté le livre. L’exemplaire du livre est ajouté à la liste des exemplaires du comité qui l’a commandé. Le comité est ajouté à la liste des comités qui ont reçu l’exemplaire. Si il n’y a plus d’exemplaire, alors le statut du livre passe à "non disponible". Le livre est ajouté à la liste des livres manipulés par la bibliothèque avec la date de l’envoi et comme motif "envoi du livre". Le bibliothécaire est ajouté à la liste des bibliothécaires ayant manipulé le livre. |
Le livre est retiré de la liste d’emprunts en cours du comité. Le comité est retiré de la liste d’emprunts en cours du livre. L’exemplaire est retiré de la liste des exemplaires du comité. Le comité est retiré de l’exemplaire du livre. L’exemplaire est retiré de la liste des exemplaires du comité. Le bibliothécaire qui a effectué le rendu est également ajouté à la liste des personnes ayant manipulé le livre. Le livre est ajouté dans la liste des livres pris en charge par la bibliothécaire avec la date de retour, et comme motif "retour du livre". L’exemplaire est supprimé de la liste des exemplaires envoyés de la bibliothécaire. Le bibliothécaire est supprimé de la liste des exemplaires. L’abonné est supprimé de la liste des exemplaires. L’exemplaire est supprimé de la liste des exemplaires reçus. |
5.2.1. Abone::emprunter livre
context Abone::emprunterLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateEmprunt Date)
pre :
-
exemplaire.livreReference = livre
-
self.estPresent(),
-
not self.estPunis()
-
self.livreEncoursEmprunt→size() < = 2
-
livre.estPresent(),
-
livre.Exemplaire→size() > 1
context Abone::emprunterLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateEmprunt Date)
post :
-
self.empruntEnCour→includes(livre)
-
livre.empruntEncour→includes(self)
-
self.Historique→includes(livre)
-
livre.Historique→includes(self)
-
self.Historique→includes(livre)
-
self.exemplaires→includes(exemplaire)
-
exemplaire.listAbonnee→includes(self)
-
bibliotecaire.livreEnCharge→includes(livre)
-
livre.Bibliotecaire →include(bibliotecaire)
-
bibliotecaire.exemplaireTransmis→includes(exemplaire)
-
exemplaire.listBibliotecaire→includes(bibliotecaire)
5.2.2. Abone::rendre livre
context Abonnee::rendreLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateRenduReel Date, dateRenduPrevu Date)
pre :
-
exemplaire.livreReference = livre
-
self.estPresent(),
-
livre.estPresent(),
-
self.enCoursDEmprunt→includes(livre)
-
self.Exemplaire()→includes(exemplaire)
context Abone::rendreLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateRenduReel Date, dateRenduPrevu Date)
post :
-
not self.empruntEnCour→includes(livre)
-
not livre.empruntEncour→includes(self)
-
not exemplaire.listAbonnee→includes(self)
-
not bibliotecaire.livreEnCharge→includes(livre)
-
not livre.Bibliotecaire →include(bibliotecaire)
-
not bibliotecaire.exemplaireTransmis→includes(exemplaire)
-
not exemplaire.listBibliotecaire→includes(bibliotecaire)
5.2.3. Comite::emprunter livre
context Comite::emprunterLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateEmprunt Date)
pre :
-
exemplaire.livreReference = livre
-
self.estPresent(),
-
self.livreEncoursEmprunt→size() < = 4
-
livre.estPresent(),
-
livre.Exemplaire→size() > 1
context Comite::emprunterLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateEmprunt Date)
post :
-
not comite.membres→includes(bibliotecaires)
-
self.empruntEnCour→includes(livre)
-
livre.empruntEncour→includes(self)
-
self.Historique→includes(livre)
-
livre.Historique→includes(self)
-
self.Historique→includes(livre)
-
self.exemplaires→includes(exemplaire)
-
exemplaire.listComite→includes(self)
-
bibliotecaire.livreEnCharge→includes(livre)
-
livre.Bibliotecaire →include(bibliotecaire)
-
bibliotecaire.exemplaireTransmis→includes(exemplaire)
-
exemplaire.listBibliotecaire→includes(bibliotecaire)
5.2.4. Comite::rendre livre
context Comite::rendreLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateRenduReel Date, dateRenduPrevu Date)
pre :
-
not comite.membres→includes(bibliotecaires)
-
exemplaire.livreReference = livre
-
self.estPresent(),
-
livre.estPresent(),
-
self.enCoursDEmprunt→includes(livre)
-
self.Exemplaire()→includes(exemplaire)
context Comite::rendreLivre(livre Livre, bibliotecaire Bibliotecaire, exemplaire Exemplaire, dateRenduReel Date, dateRenduPrevu Date)
post :
-
not self.empruntEnCour→includes(livre)
-
not livre.empruntEncour→includes(self)
-
not exemplaire.listComite→includes(self)
-
not bibliotecaire.livreEnCharge→includes(livre)
-
not livre.Bibliotecaire →include(bibliotecaire)
-
not bibliotecaire.exemplaireTransmis→includes(exemplaire)
-
not exemplaire.listBibliotecaire→includes(bibliotecaire)