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 |