La composition exprime une association forte qui fait en sorte que lorsque l'élément conteneur est détruit ses éléments composites sont également détruits.
Il implique toujours une multiplicité de 1 ou 0..1, car un seul objet conteneur peut avoir la responsabilité d'un autre objet composite.
Représente le modèle logique du système d’information.
Une entité externe est une personne, groupe ou organisation qui fournit ou reçoit de l’information.
On distingue plusieurs niveaux de diagramme de flux de données (DFD).
Ce document pourra être agrandi et sera une aide précieuse pour la présentation à toute personne qui est concernée par le système d’information (Opération, conception, entretien, administration).
Un dictionnaire de données (aussi appelé dictionnaire de système) doit contenir les définitions de toutes les composantes constituant les modèles d’un système d’information. Les deux modèles de l’approche classique sont le diagramme de flux de données (DFD) et le diagramme entité-relation (DER). D’autres modèles peuvent aussi être utilisés, mais le DFD et le DER sont les plus utilisés.
Dans un dictionnaire de données, chaque processus de niveau inférieur doit être décrit en détail. En outre, l’analyste doit définir chaque flux et chaque dépôt de données reliés à ces processus, en termes de structures et d’éléments de données. Enfin, l’analyste doit aussi décrire chacun de ces éléments de données.
Construire un dictionnaire de données consiste à identifier chaque composante, lui donner un nom significatif, la définir et l’organiser pour pouvoir facilement y accéder.
Les diagrammes de flux de données ne décrivent pas complètement le sujet étudié. C’est pourquoi il est primordial de fournir des informations supplémentaires sur le système. Le dictionnaire de données fournit ces informations supplémentaires.
L’intérêt d’un dictionnaire de données comme outil de développement dépend de l’utilisation que les autres outils de développement peuvent faire des définitions qui y sont emmagasinées. Si le dictionnaire est bien conçu et régulièrement mis à jour, les définitions qui y sont emmagasinées sont directement utilisées par le système d’information lors de son exploitation. Le dictionnaire devient alors dynamique.
Enfin, il aide l’analyste à déterminer les besoins du système. Il sert également à la conception du système. Par exemple, si l’analyste veut connaître le nombre de caractères d’une donnée ou encore quels sont les différents noms d’une donnée et où elle est utilisée, il devrait trouver la réponse dans un bon dictionnaire de données.
Dans un DFD, nous avons donné des noms à des flux et à des dépôts de données. Mais que signifie réellement ces noms? Par exemple, que voulons nous dire par commande? Dans un dictionnaire, on pourrait expliquer le flux de données commande par la structure de données suivante :
COMMANDE : Détails commande Numéro de la commande Date de la commande Détails client Nom de l’organisme Personne responsable Prénom Nom Téléphone Indicatif régional Numéro Poste Adresse d’expédition Rue Ville Province Code postal Adresse de facturation Rue Ville Province Code postal Détails livre Nom de l’auteur Titre ISBN Nom de l’éditeur
Linsting ci-haut → Définition d’un flux de données COMMANDE dans un dictionnaire de données.
Chaque définition est présentée sous la forme d’une fiche descriptive. Examinons ces composantes pour voir ce que nous désirerions enregistrer sur chacune d’elles. Cela nous donnera des éléments de base pour évaluer n’importe quel dictionnaire de données ou pour organiser le nôtre.
Non seulement les flux et les dépôts de données doivent être définis, mais aussi la logique des processus qui transforment ces données. Chaque processus de niveau inférieur doit être décrit en détail. Par exemple, que voulons-nous dire par Vérifier le montant de la facture du processus 2.4? Les méthodes utilisées pour décrire cette logique est :
Voici quelques exemples de description de la logique d’un processus.
Exemple 1 : Vérifier la solvabilité du client
Retrouver historique des paiements. Si nouveau client Envoyer demande de paiement d’avance Si client régulier (2 cmdes par mois en moyenne) Expédier, sauf si dette de plus de deux mois Pour les clients connus qui ne sont pas réguliers Expédier, sauf s’ils doivent quelque chose
Exemple 2 : Enregistrer les informations du client
Demander si le client possède un compte (ou a déjà placé une commande) Si le client possède un compte, alors Demander les informations d’identification Interroger la base de données avec les informations d’identification Copier les données de la réponse à l’interrogation dans Commande Sinon Créer un enregistrement vide de client dans la base de données Demander au client les attributs du client Remplir l’enregistrement vides de client avec les attributs du client Fin Si Demander au client les informations sur la commande pour le premier article Tant que sont exécutés d’autres articles pour la commande Ajouter les informations sur la commande dans Commande Fin Tant que
F1 | Nouvelle commande |
F2 | Détails client |
F3 | Nouveau client |
F4 | Détails sur la commande |
Une vidéo empruntée est nécessairement une vidéo de l’inventaire
context Succursale inv: self.videos->includesAll(self.clients.videos)
Deux clients distincts ne peuvent avoir des vidéos en commun.
context Succursale inv: self.clients->forAll(c1, c2 | c1.videos->intersect(c2.videos) implies c1 = c2)
class Person attributes firstname: String lastname: String email: Set(String) operations fullname(prefix:String) : String = prefix.concat(' ').concat(firstname).concat(' ').concat(lastname) end prefix= 'Mr' ou 'Dr' ou 'Mad.' etc.
context Typename::operationName(param1 : Type1, ...): ReturnType pre precondname1 : ...param1... ...self... pre precondname2 : ...param1... ...self... ... post postcondname1 : ...result... ...param1... ...self... post postcondname2 : ...result... ...param1... ...self...
class Cours attributes titre: String sigle: String operations addPreRequis(c : Cours) end class Etudiant < Personne operations abandonCours(c : Cours) nouveauCode(n : String) end
context Etudiant::abandonCours(c: Cours) pre Estinscrit: self.cours->includes(c) post Plusinscrit: self.cours = cours@pre->excluding(c)
La partie self.cours = cours@pre->excluding(c)
est préférable à self.cours->excludes(c)
car il peut arriver qu'après l'opération l'ensemble soit vide par erreur, donc qu'il exclus effectivement c
, mais qu'en réalité, l'ensemble ne devait pas être vide et exclure c
. @pre
permet de faire référence à l'état de cours
avant l'opération et de pouvoir comparer les deux états avant et après.
context A::sort(s : Sequence(Integer)) : Sequence(Integer) post MemeTaille:result->size = s->size post MemesElements: result->forAll(i | result->count(i) = s->count(i)) post EstTriee: Sequence{1..( result->size-1)}->forAll(i | result.at(i) <= result.at(i+1))
Notez l’utilisation d’une séquence ici pour imiter une boucle de 1 à result->size-1
.
Operations | ||
---|---|---|
+ (r: Real): Real | abs(): Real | < (r: Real): Boolean |
- (r: Real): Real | floor(): Integer | > (r: Real): Boolean |
* (r: Real): Real | round(): Integer | <= (r: Real): Boolean |
/ (r: Real): Real | max(r: Real): Real | >= (r: Real): Boolean |
-: Real | min(r: Real): Real |
Operations | |
---|---|
−: Integer ⇒ Valeur négative de self . | abs(): Integer |
+ (i: Integer): Integer | div(i: Integer): Integer ⇒ Le nombre de fois que i entre complètement dans self . |
- (i: Integer): Integer | mod(i: Integer): Integer ⇒ Modulo |
* (i: Integer): Integer | max (i: Integer): Integer |
/ (i: Integer): Real | min(i: Integer): Integer |
Operations |
---|
size(): Integer |
concat(s: String): String |
substring(lower: Integer, upper: Integer): String |
toInteger(): Integer |
toReal(): Real |
Operations |
---|
or (b: Boolean): Boolean |
xor (b: Boolean): Boolean |
and (b: Boolean): Boolean |
not: Boolean |
implies (b: Boolean): Boolean |