1. Dessinez un diagramme de classes représentant la bibliothèque.

Diagram

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

Diagram

1.1.2. Est-ce chaque mention à "livre" dans l’énoncé correspond au même concept ?

Non, un livre peut faire référence à :

l’objet physique livre.

Diagram

un bien qu’un abonné peut emprunter.

Diagram

un bien qu’un comité peut emprunter.

Diagram

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

Diagram

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

Diagram

1.3.2. Est-ce chaque mention à "abonne" dans l’énoncé correspond au même concept ?

Oui, un abonné reste une personne qui souhaite emprunter un livre.

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

Diagram

1.4.2. Est-ce chaque mention à "bibliotecaire" dans l’énoncé correspond au même concept ?

Oui, un bibliothécaire reste une personne qui s’occupe de la gestion d’un livre.

1.5. Le concept "comité"

1.5.1. Un comité a pour attributs :

un comité a pour attribut

  • l’identifiant du comité

  • le nom du comité

  • un nombre de participants

  • une liste des livres empruntés

  • une liste de personnes membres

  • une liste d’exemplaires reçus

Diagram

1.5.2. Est-ce chaque mention à "comité" dans l’énoncé correspond au même concept ?

Oui, un comité est juste un rassemblement de plusieurs personnes pour parler de plusieurs livres.

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

Diagram

1.6.2. Est-ce chaque mention à "section" dans l’énoncé correspond au même concept ?

Oui, une section est juste un endroit où les livres sont rangés.

2. Le diagramme de classes permet-il de connaître :

2.1. tous les livres empruntés par un abonné ?

Oui, car chaque abonnée a un historique de livre emprunté avec la date d’emprunt

Diagram

2.2. tous les abonnés qui ont emprunté un livre ?

Oui, il suffira de regarder tout les abbonées qui n’ont pas d’historique de livre emprunté vide

Diagram

2.3. toutes les adresses d’un abonné ?

Oui, car avec notre modelisation, nous avons les adresse de toutes les persones qui sont soit abonées ou bibliotécaire.

Diagram

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

Diagram

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

Diagram

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

Diagram

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

Diagram

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()

4.2.1. abonnee

Diagram

context Abone

inv :

  • self.EmpruntEncours→size() < = 2

4.2.2. bibliotecaire

Herite des invariants de personnes

4.3. section

Diagram

context section

inv :

  • self.nomSection→size() >= 1

  • self.listeBibliotecaireResponsable→size() >=1

  • self.listeLivre→size() >= 1

  • self.listExemplaire→size() >= 1

4.4. comité

Diagram

context comité

inv :

  • self.nomComiter→size() >= 1

  • self.listePersone→size() >= 2

  • self.listeLivreEmpruntee→size() < = 4

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.

Diagram

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

Diagram

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)

5.3. diagrames d’objets

5.3.1. Abone::emprunter livres

Diagram

5.3.2. Abone::rendre livres

Diagram

5.3.3. Comite::emprunter livres

Diagram

5.3.4. Comite::rendre livres

Diagram