1. Diagramme de classes
1.1. les Attributs du livre (book)
chaque mention à livre ne correspond pas a livre dans l’énoncé. le livre reservé est different de celui emprunté. le livre emprunté est une copie du livre reservé.
Book à pour attributs:
``` Identifiant unique -ISBN : ISBN Titre du livre -title : String Date de publication -publicationDate : Date Nombre d'exemplaire -itemsNumber : integer ```
2. Le Diagramme de classes permet-il de reconnaitre
2.1. Tous les livres emprunté par un abonné:
Oui, le diagramme de classes permet de connaître tous les livres empruntés par un abonné. Cela repose sur l’association entre les classes User, Borrowed, et BookExemplary. Chaque utilisateur est associé à des enregistrements de prêts à travers la classe Borrowed. la classe Borrowed fait le lien entre l’utilisateur (User) et les exemplaires physiques des livres (instances de BookExemplary) qu’il a empruntés. Elle enregistre les détails spécifiques de chaque prêt, y compris la date de retour prévue et la date de retour réelle. Pour obtenir la liste de tous les livres empruntés par un abonné spécifique, vous pouvez suivre la relation de l’abonné aux enregistrements de prêts (Borrowed), puis de ces enregistrements aux exemplaires spécifiques des livres (BookExemplary).
2.2. Tous les abonnés qui ont emprunté un livre
Oui, le diagramme de classes fourni offre également la possibilité de déterminer tous les abonnés qui ont emprunté un livre spécifique, en utilisant les associations entre les classes User, Borrowed, et BookExemplary. Pour identifier tous les abonnés qui ont emprunté un exemplaire spécifique d’un livre, vous pouvez commencer par cet exemplaire dans BookExemplary, remonter aux enregistrements de prêts associés Borrowed, et de là aux utilisateurs concernés.
2.3. Toutes les adresses d’un abonné
Oui, chaque User est associé à une LibraryCard, qui à son tour peut être associée à plusieurs adresses en utilisant la classe Adress. Cela permet de gérer différentes adresses pour un même abonné, par exemple, des adresses précédentes et actuelle. Pour accéder à toutes les adresses d’un abonné spécifique, il faut suivre le lien de l’utilisateur à sa carte de bibliothèque, puis accéder à toutes les adresses associées à cette carte.
4. Identification des invariants
4.1. Book
context Book
inv validBookDetails:
self.title.isDefined() and
self.publicationDate.isDefined() and
self.author->notEmpty() and
self.editor->notEmpty() and
self.kind->notEmpty() and
self.keyword->notEmpty() and
(self.publicationDate > '1960-01-01' implies self.ISBN.isDefined())
4.2. BookExemplary
context BookExemplary
inv validBookExemplaryDetails:
self.barcode.isDefined() and
self.dateOfPurchase.isDefined()
4.3. Library
context Library
inv validLibraryDetails:
self.libraryId.isDefined() and
self.section.isDefined() and
(self.section = Section::Adulte or self.section = Section::Adolescent or self.section = Section::Enfant)
4.4. User
context User
inv validUserDetails:
self.id.isDefined() and
(self.nbBookBorrowed >= 0) and
((self.library.oclIsTypeOf(Subscriber) implies self.nbBookBorrowed <= 2) or
(self.library.oclIsTypeOf(SubscriberComitee) implies self.nbBookBorrowed <= 4))
4.5. LibraryCard
context LibraryCard
inv validLibraryCardDetails:
self.idNum.numero.size() = 10 and
self.idNum.validationNum.size() = 2 and
self.name.size() > 0 and
self.Prenom.size() > 0 and
self.adress.adress.size() > 0
4.6. Borrowed
Chaque emprunt doit être associé à un exemplaire de livre et à un abonné.
context Borrowed
inv validBorrowDetails:
self.borrowId.isDefined() and
self.dateRetourPrevu.isDefined() and
self.dateRetourReel.isDefined()
inv validReturnDates:
self.dateRetourPrevu >= self.bookExemplary.dateOfPurchase and
(self.dateRetourReel->notEmpty() implies self.dateRetourReel >= self.dateRetourPrevu)
5. Cas d’utilisations
5.2. Pré et post-conditions pour spécifier les cas d’utilisation "emprunter" et "rendre un livre"
5.2.1. Pré et post-conditions emprunter un livre
Pré conditions:
context Borrowed::borrowBook(user : User, bookExemplary : BookExemplary , startDate : Date) : Boolean
pre bookIsAvailableAndUserCanBorrowMore:
bookExemplary.oclInState(Available) and
((user.oclIsTypeOf(subscriber) implies user.nbBookBorrowed < 2) or
(user.oclIsTypeOf(subscriberComite) implies user.nbBookBorrowed < 4))
pre DateValidationBasedOnUserType:
if user.oclIsTypeOf(subscriber) then
self.dateRetourPrevu = startDate.addDays(30)
elseif user.oclIsTypeOf(subscriberComite) then
self.dateRetourPrevu = startDate.addDays(60)
endif
Post condition
context Borrowed::borrowBook(user : User, bookExemplary : BookExemplary, startDate : Date) : Boolean
post statusUpdatedAndBorrowerLinked:
bookExemplary.oclInState(Borrowed) and
bookExemplary.borrower = user and
user.nbBookBorrowed = user.nbBookBorrowed@pre + 1
post RecordDatesProperlySet:
self.startDate = startDate and
(user.oclIsTypeOf(RegularUser) implies self.dateRetourPrevu = startDate.addDays(30)) and
(user.oclIsTypeOf(CommitteeMember) implies self.dateRetourPrevu = startDate.addDays(60))
5.2.2. Pré et post-conditions rendre un livre
Pré conditions:
context Borrowed::returnBook(user : User, bookExemplary : BookExemplary) : Boolean
pre isValidReturn:
bookExemplary.oclInState(Borrowed) and
bookExemplary.borrower = user
Date::today() <= self.dateRetourPrevu
Post condition
context Borrowed::returnBook(user : User, bookExemplary : BookExemplary) : Boolean
post returnBookStateChanges:
bookExemplary.oclInState(Available) and
user.nbBookBorrowed = user.nbBookBorrowed@pre - 1 and
not bookExemplary.oclIsInState(Borrowed)->exists(b => b.borrower = user) and
not Borrowed.allInstances()->exists(b |
b.bookExemplary = bookExemplary and b.user = user and b.oclInState(Borrowed))
self.dateRetourReel = Date::today()
self.dateRetourReel <= self.dateRetourPrevu