Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
798 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  [UML] Probleme de formalisation d'un historique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[UML] Probleme de formalisation d'un historique

n°1064747
Chronoklaz​m
Posté le 28-04-2005 à 19:33:34  profilanswer
 

Salut j'ai un probleme pour modeliser la gestion d'un historique dans le diagramme des classes.
 
C'est pour la gestion d'une bibliotheque, j'ai une classe abstraite Adherent et une classe Livre:
 
Adherent(0..1)________________________(0..3)Livre  /* Le gars peut avoir que 3 bouquins */
                        |
                        |
                        |
                        |
                    Emprunt {classe d'association}
 
Je voudrais modeliser le fait qu'on puisse gerer un historique des emprunts pour un adhérent spécifique, un exemplaire de livre ou un livre. J'ai dabord pensé a faire un attribut "de classe" (static quoi) de la classe Emprunt (de type BD ??) et de faire des methodes statiques "getHistorique()" dans les classes Adherent, Livre et Exemplaire ... le but est de pourvoir simplement faire Livre.getHistorique().
 
Faut il preciser l'existence d'un attribut historique ou pas ?  
Comment dire que a chaque instance d'emprunt on enregistre dans l'historique le nom de l'adherent et le bouquin qu'il a pris ?
Ne serait il pas mieux de creer une classe du genre Historique (une espece de BD quoi) pour plus d'abstraction ???
 
Comment on fait dans ces cas la generalement ??
 
Aidez moi svp  :hello:


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
mood
Publicité
Posté le 28-04-2005 à 19:33:34  profilanswer
 

n°1064861
IrmatDen
Posté le 28-04-2005 à 20:58:25  profilanswer
 

Salut,
Je n'ai jamais fait face à ce problème, mais je pencherais pour la solution à la sauce DB, avec une classe Historique. Je ne le mettrais pas en attribut de la classe Livre, car c'est aussi un attribut de la classe Adhérent puisque ça le concerne aussi.
Pour le gérer, Historique devrait peut-être être un singleton et fournir le service de gestion d'emprunt ?


Message édité par IrmatDen le 28-04-2005 à 20:58:44
n°1065038
Chronoklaz​m
Posté le 28-04-2005 à 22:34:21  profilanswer
 

Ok, merci de ton avis. :)
 
En supposant que j'ai une classe Historique, que mettre dedans comme attributs et methodes ... je vois pas trop :/ Le but etant de rester suffisament abstrait pour laisser libre choix à l'implementation non ?
 
Ensuite est-ce qu'il serait pertinent de mettre des methodes getHistorique() directement dans les classes Livre et Adherent ?
 
Et finalement comment lier par exemple la classe Livre (ou meme Emprunt) à la classe Historique ? une aggregation toute simple suffirait elle ??


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1065232
IrmatDen
Posté le 29-04-2005 à 00:04:53  profilanswer
 

Voilà un semblant de proposition :
 

Code :
  1. Classe : Adherent
  2. -id : int
  3. -bibliotheque : Bibliotheque
  4. +getID() : int
  5. +emprunteLivre(idLivre : int) : bool
  6. Classe : Livre
  7. -id : int
  8. +getID() : int
  9. Classe : Emprunt
  10. -id : int
  11. #idAdherent : int
  12. #idLivre : int
  13. #dateDeb : date
  14. #dateFin : date
  15. +getID() : int
  16. +getIDLivre() : int
  17. +getIDAdherent() : int
  18. +getDDeb() : date
  19. +getDFin() : date
  20. // Classe utilisable uniquement par Historique, hérite de Emprunt
  21. Classe : EmpruntEditable : public Emprunt
  22. +setIDLivre(idL : int)
  23. +setIDAdherent(idA : int)
  24. +setDDeb(ddeb : date)
  25. +setDFin(dfin : date)
  26. Classe : Historique
  27. -emprunt : liste d'EmpruntEditable
  28. // Crée un nouvel emprunt, l'insere et renvoit l'id de l'emprunt ou -1 si erreur (3 emprunts en cours par exemple)
  29. +creerEmprunt(idLivre : int, idAdherent : int, dateDeb : date) : int
  30. // Finalise un emprunt et renvoit si oui ou non la modif a put se faire
  31. +finEmprunt(idEmprunt : int, dateFin : date) : bool
  32. // Renvoit une liste des emprunts fait par un adherent entre dateDeb et dateFin
  33. +getHistoriqueAdherent(idAdherent : int, dateDeb : date, dateFin : date) : liste d'Emprunt
  34. // Renvoit une liste des emprunts fait sur un livre entre dateDeb et dateFin
  35. +getHistoriqueLivre(idLivre : int, dateDeb : date, dateFin : date) : liste d'Emprunt
  36. // Renvoit une liste des emprunts fait entre dateDeb et dateFin
  37. +getHistoriqueLivre(dateDeb : date, dateFin : date) : liste d'Emprunt
  38. Classe : Bibliotheque
  39. -livres : liste de Livre
  40. -adherents : liste d'Adherent
  41. +historique : Historique
  42. +creerAdherent() : bool
  43. +supprAdherent() : void
  44. +creerLivre() : void
  45. +supprLivre() : void


 
Transposé en cardinalité, ça donnerait ça:
 

Bibliotheque -{0..*}----------{1}- Adherent -{0..*}--------------{1}--|
             -{0..*}----------{1}- Livre -{0..*}-----------------{1}--|
             -{1}-------------{1}- Historique -{0..*}------------{1}- Emprunt


 
Pour la gestion des erreurs, tu devrais définir tes propres types.
 
Maintenant, je vais peut-être me faire hacher menu par les guru de la modélisation objet (taper pas trop fort hein)...
 
Edit: La classe EmpruntEditable devrait sans doute être une déclaration interne à Historique pour empécher l'accès aux autres classes ?
 
Edit 2: J'ai (stupidement) oublié la possibilité de l'interface. Avec une classe Emprunt qui regrouperait Emprunt et EmpruntEditable, et l'interface iEmprunt qui ne contiendrait que les getters de Emprunt et qui serait retourné par Historique::getHistorique*()...


Message édité par IrmatDen le 29-04-2005 à 15:56:22
n°1066478
Chronoklaz​m
Posté le 30-04-2005 à 01:25:35  profilanswer
 

Ok merci :)
 
" +setIDLivre(idL : int) " A quoi ca sert de mettre à jour l'id du Livre emprunté ? (une fois qu'on la sauvegardé ... quoi)
 
Est-ce que une fois que l'instance d'un Livre a disparu on peut toujours recuperer des infos dessus quelque part ???
 
" -emprunt : liste d'EmpruntEditable " => Le fait de preciser la structure de donnée ça ne s'eloignerai pas de la politique de UML qui est de laisser libre choix en se qui concerne l'implementation ? Est-ce suffisament abstrait pour de l'UML ? Tu voudrais simuler la plus part des requetes d'une BD ?
 
J'ai pas mal polemiqué aujourd'hui avec mes camarades du projet et finalement on est arrivé à la conclusion (ou plutot question) suivante :  
 
Un historique est-ce simplement la savegarde de toutes les instances de la classe Emprunt ou une sauvegarde de textuelle (ou une autre forme quelquonque) des emprunts effectués ?  
 
Dans le premier cas, sachant que la classe Emprunt est une classe d'association entre Livre et Adherent si on supprime l'un des deux element du couple (Livre, Adherent) l'instance  
d'Emprunt adequate devrais dispraitre aussi je pense.
 
Je pense que par le terme "historique" on sous entend que l'on voudrais avoir des infos sur un bouquin qui n'existe plus dans le Bibliotheque (ca parrait bizzare mais c'est logique). Si quelqu'un a un contre-argument ...
 
 
Et derniere question, tu m'a conseiller de faire de Historique un "Singleton" (une instance d'un objet qui existe une et une seule fois durant le prog), est-ce que le stereotype <<Application>> est un "Singleton" ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1067072
IrmatDen
Posté le 30-04-2005 à 19:17:08  profilanswer
 


Y'a vraiment pas de quoi. On verra quand tu auras un modèle valide ;)
 

Chronoklazm a écrit :

" +setIDLivre(idL : int) " A quoi ca sert de mettre à jour l'id du Livre emprunté ? (une fois qu'on la sauvegardé ... quoi)


J'ai mis ça un peu bétement j'ai plutôt essayé de faire attention à l'historique, c'est vrai que ça a plus sa place dans le constructeur, sauf si tu veux que ce soit un auto_increment auquel cas l'ID ne serait pas définissable par l'utilisateur... Et puis je ferais bien la différence entre id et référence (par exemple, j'ai vu dans pas mal de biblio quelques lettres du type de livre (SF, LITT, ...) suivi des 3 premieres lettres du nom de l'auteur, et ensuite l'identifiant. Enfin, a toi de voir quoi...
 

Chronoklazm a écrit :

Est-ce que une fois que l'instance d'un Livre a disparu on peut toujours recuperer des infos dessus quelque part ???


Tout dépend de ce que tu veux dire par "instance" et "disparu". Si l'objet n'existe plus dans le système alors non, on ne peut plus accéder à aucune de ses informations. Mais si par disparu tu entends n'a pas été rendu ou en gros a disparu de la bibliothèque, alors tu peux faire un attribut (ex: -dispo : bool). De cette façon tu donne un moyen de savoir quel sont les livres que la bibliothèque posséde, y compris ceux empruntés, et ceux qui ne sont plus du tout disponible, tout en pouvant accéder à leurs informations et, plus important, leur historique d'emprunts.
 

Chronoklazm a écrit :

" -emprunt : liste d'EmpruntEditable " => Le fait de preciser la structure de donnée ça ne s'eloignerai pas de la politique de UML qui est de laisser libre choix en se qui concerne l'implementation ? Est-ce suffisament abstrait pour de l'UML ?


Tu as raison puisque les cardinalités sont là pour ça... Comme tu vois je suis aussi loin d'être un pro de l'UML :whistle: mais ça aide bien de pouvoir échanger des idées...
 

Chronoklazm a écrit :

Tu voudrais simuler la plupart des requetes d'une BD ?


A toi de voir les besoins du système défini dans ton cahier des charges... Mais oui c'est un peu l'idée.
 

Chronoklazm a écrit :

J'ai pas mal polemiqué aujourd'hui avec mes camarades du projet et finalement on est arrivé à la conclusion (ou plutot question) suivante :  
 
Un historique est-ce simplement la savegarde de toutes les instances de la classe Emprunt ou une sauvegarde de textuelle (ou une autre forme quelquonque) des emprunts effectués ?  
 
Dans le premier cas, sachant que la classe Emprunt est une classe d'association entre Livre et Adherent si on supprime l'un des deux element du couple (Livre, Adherent) l'instance  
d'Emprunt adequate devrais dispraitre aussi je pense.
 
Je pense que par le terme "historique" on sous entend que l'on voudrais avoir des infos sur un bouquin qui n'existe plus dans le Bibliotheque (ca parrait bizzare mais c'est logique). Si quelqu'un a un contre-argument ...


Ca ne parait pas bizarre. Le gérant de la bibliothèque serait content de savoir les types de bouquins les plus empruntés (même s'ils ne sont plus disponibles au sens que j'ai donné plus haut) avant de réinvestir dans d'autres livres. J'ai eu l'occasion de développer une appli de gestion de prêt il y a quelques temps, et c'est là que j'ai compris qu'une information ne doit pas disparaître du système, mais plutôt être rendue inaccessible de la gestion actuelle. Pour transposer ça à la gestion d'une bibliothèque, il ne faut pas stocker les adhérents inscrits actuellement, ni les livres disponibles actuellement, mais plutôt les adhérents qui sont et ont été inscrits ainsi que les livres qui sont ou ont été disponibles. Il ne faut pas avoir le point de vue "La bibliothèque possède..." mais "La bibliothèque possède ou a possédée...".
 

Chronoklazm a écrit :

Et derniere question, tu m'a conseiller de faire de Historique un "Singleton" (une instance d'un objet qui existe une et une seule fois durant le prog), est-ce que le stereotype <<Application>> est un "Singleton" ?


Oublie le singleton, c'est sans doute la pire idée que j'ai pu te donner. Sinon <<Application>> n'a pas l'air de faire parti des stéréotypes prédéfinis par UML, donc tu peux en faire ce que tu veux, mais vu son nom, je dirais que ça irait avec la classe servant de point d'entrée au système, Bibliothèque par exemple... Et puis tu peux créer tes propres stéréotypes du moment qu'ils sont documentés, peu nombreux (pour la lisibité future).
La seule chose qui m'ait fait envisager le singleton, c'est que l'historique soit accessible à partir de toutes les classes. Mais il y a de forte chance que ça n'ait pas à s'appliquer ici et que ce soit une erreur de conception.

n°1067129
Chronoklaz​m
Posté le 30-04-2005 à 20:10:14  profilanswer
 

Merci pour ces precieux conseils !
 
Voila une formalisation mais j'ai un souci avec le fait que la bibliotequaire puisse passer des commandes (et donc consulter  des catalogues) sur Internet ... enfin c'est plus voyant sur le schema sinon pour l'Historique j'ai fait le plus bete possible pour le moment (c'est dur de se mettre d'accord avec les 2 autres energumens :) )
 
http://img140.echo.cx/my.php?image [...] ses8kf.png


Message édité par Chronoklazm le 30-04-2005 à 20:11:00

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1067162
IrmatDen
Posté le 30-04-2005 à 20:42:09  profilanswer
 

Avec la remarque que tu as fait précédemment, je serais d'avis que Historique::emprunts disparaisse puisqu'il est représenté par ton association 1..*.
 
J'ai un peu de mal à comprendre ce que tu veux dire par la bibliotequaire puisse passer des commandes (et donc consulter  des catalogues) sur Internet .
Si je saisis bien, il te faudrait créer une classe Opérateur qui représenterait le/la bibliothéquaire, qui serait liée en 1..* à Bibliothèque. Un/une opérateur/trice serait capable de passer des commandes à partir d'un catalogue, lequel serait dispo sur intranet et/ou internet.
La relation que j'imagine serait du genre:


 
Bibliotheque -{1..*}-------{1}- Operateur -{0..*}-----------{1..*}- Catalogue
                                                   {0..*}
                                                     |
                                                    {1}
                                                  Commande


 
Si j'ai mal compris, explicite un peu plus...
Et, sinon qu'est ce qu'en dise tes potes ?

n°1067328
Chronoklaz​m
Posté le 30-04-2005 à 23:22:04  profilanswer
 

A mon avis la bibliotecaire, qui est donc un acteur (si on se projete dans le diag des cas d'utilisations) peut interagir avec l'application grace au methodes de cette application. Genre si elle veut ajouter un Adherent elle lance la methode ajouterAdherent() qui elle verifie par exemple qu'il n'y a pas deja un adherent avec cet identifiant et si c'est le cas alors crée un nouveau Adherent.
(dans le diag des sequence j'ai ce genre de truc ... mais le hic c'est que Poseidon n'a pas l'air de gerer des acteurs dans les diag de sequence :/ )
 
Donc de la meme maniere, pour commander des ouvrages elle devrait pouvoir lancer simplement commanderOuvrage(..) je pense. (ou consulter un catalogue grace a une sortie vers Internet ou un truc dans le style, j'ai peur de dire Interface Internet)
 
Pour ce qui est de ta proposition sur l'operateur j'avais aussi pensé à faire un truc dans ce style mais plus dans le sens "Connexion Internet" ou "Session", justement pour exprimer le fait qu'elle accede à un Catalogue qui n'est pas dans le systeme proprement dit.
 
Voila d'ailleurs une question, doit on expliciter le fait qu'il peut y avoir des choses qu'on recupere de l'exterieur "grace à"   ... bref specifier l'emplacement des données ?
 
Sinon mes potes ont tous un avis assez different en ce qui concerne la gestion de l'historique, y en a un qui est partisan d'une simple methode "historiser(e : Emprunt)" dans la classe Emprunt et l'autre penche vers la variable "-dispo : boolean" dans Ouvrage (et donc pareil pour un Adherent -actuellementInscrit). Mais le probleme avec les variables c'est SI on a un bouquin avec "dispo" à FAUX alors c'est que le Livre n'est plus present ... et si on en rachete un avec le meme nom ?  
 
L'UML c'est bien mais j'ai l'impression de me noyer defois :(
 
EDIT : Ah mais pour les variables c'est pas un souci enfait avec ton systeme de ID qui s'auto incremente à la creation et puis meme avec la date c'est gerable ... donc les variables sont en fait une bonne idée je pense.


Message édité par Chronoklazm le 01-05-2005 à 11:39:25

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1067849
IrmatDen
Posté le 01-05-2005 à 19:06:56  profilanswer
 

Chronoklazm a écrit :

A mon avis la bibliotecaire, qui est donc un acteur (si on se projete dans le diag des cas d'utilisations) peut interagir avec l'application grace au methodes de cette application. Genre si elle veut ajouter un Adherent elle lance la methode ajouterAdherent() qui elle verifie par exemple qu'il n'y a pas deja un adherent avec cet identifiant et si c'est le cas alors crée un nouveau Adherent.
 
Donc de la meme maniere, pour commander des ouvrages elle devrait pouvoir lancer simplement commanderOuvrage(..) je pense. (ou consulter un catalogue grace a une sortie vers Internet ou un truc dans le style, j'ai peur de dire Interface Internet)
 
Pour ce qui est de ta proposition sur l'operateur j'avais aussi pensé à faire un truc dans ce style mais plus dans le sens "Connexion Internet" ou "Session", justement pour exprimer le fait qu'elle accede à un Catalogue qui n'est pas dans le systeme proprement dit.


Ok... Dans la notion de commande, j'envisageais aussi la traçabilité (qui a passé la commande), d'où la classe Opérateur. La méthode commanderOuvrage(..) n'aurait-elle pas plus sa place dans la classe Catalogue ? Car c'est une action qui est réalisable uniquement à partir d'un catalogue, non ?
A part ça, qu'est-ce qu'une commande ? Une liste d'éléments, choisis dans un catalogue, demandés à une date donnée à l'éditeur du catalogue. Pour définir un élément de commande, il faut trouver un moyen d'identifier chaque produit indépendamment de son origine pour faciliter la gestion de cette partie du sysème. Si tu fais une bibliothèque (et pas une médiathèque, donc rien d'autre que des livres), tu peux utiliser le numéro ISBN qui rempli parfaitement la définition précédente. Tu peux lui associer un titre et un prix. La commande sera associée à un Cataloue et donc à son origine/éditeur/livreur...
Dernière chose pour la commande, on y retrouve aussi un historique, je suppose.
 

Chronoklazm a écrit :

Voila d'ailleurs une question, doit on expliciter le fait qu'il peut y avoir des choses qu'on recupere de l'exterieur "grace à"   ... bref specifier l'emplacement des données ?


Spécifier l'emplacement des données appartient peut-être à l'implémentation et pas à l'UML. Cependant, tu peux peut-être faire un package "Externe" pour représenter ceci ?
 

Chronoklazm a écrit :

L'UML c'est bien mais j'ai l'impression de me noyer defois :(


A qui le dis-tu ?! Il m'arrive de relire plusieurs fois le même chapitre avant de rééllement le comprendre !! Mais le jeu en vaut tellement la chandelle :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  [UML] Probleme de formalisation d'un historique

 

Sujets relatifs
Problème de pied en CSS.[C++/OpenGl] probleme affichage polygone
[JAVA] Petit problème de centrage [résolu][Flash] Problème texte vectoriel
Probleme affichage de pages[MYSQL 4.1] Probleme pour recreer une base a partir d'un dump
thread : probleme avec startProbleme de log
[RESOLU][XSL/JavaScript]problème d'intégration code JS dans le XSLProblème MD5
Plus de sujets relatifs à : [UML] Probleme de formalisation d'un historique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR