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 |