Outils de modélisation UML

Il en existe beaucoup. Nous utiliserons https://online.visual-paradigm.com/drive/#infoart:proj=0&documents :

  • Il semble raisonnablement complet (même s’il ne semble pas possible de représenter un acteur par autre chose qu’un stick-man)

  • Il permet de stocker des schémas en ligne

  • Il permet d’exporter des images de ces schémas.

Créez-vous un compte sur cet outil, pour que nous puissions l’utiliser pendant les TD.

Environnement de développement Python

Nous utiliserons une plateforme en ligne : https://replit.com/~. Créez un compte, puis naviguez vers Templates, puis Python pour vous créer un environnement de développement pour ce TD.

1. Identification des acteurs

2. Identification des acteurs et de cas simples

Le système considéré est une station service de distribution de carburant. Les clients se servent en carburant, et le pompiste remplit les cuves.

  1. Le client se sert de la façon suivante : il prend un pistolet accroché à une pompe et appuie sur la gachette pour faire couler le carburant. Qui est l’acteur dans ce cas d’utilisation ? Le client, le pistolet ou la pompe ?

  2. Pierre est pompiste. De temps en temps, il vient à la station pour remplir le réservoir de sa voiture. Pour modéliser cette activité, faut-il un nouvel acteur ?

  3. Certains pompistes sont qualifiés pour effectuer des opérations que tous les pompistes ne peuvent pas faire, comme des opérations de maintenance. Ils sont donc réparateurs en plus d’être pompistes. Comment modéliser cela ?

3. Contenus de cas d’utilisation

4. Exemples de cas d’utilisation : la bibliothèque

Le système étudié est le poste de travail (unique) muni du matériel et du logiciel de gestion des emprunts de documents dans une bibliothèque, ainsi que de la base de données. Les utilisateurs possèdent une carte de la bibliothèque. Pour emprunter des documents, ils la présentent à un bibliothécaire avant que celui-ci scanne les documents.

  1. Rédigez le cas d’utilisation "Identification d’un utilisateur" par lequel le bibliothécaire scanne la carte d’un utilisateur, retrouve les informations correspondant à cet utilisateur et peut vérifier qu’il n’a pas de documents en retard.

  2. On veut permettre à un bibliothécaire de scanner un document pour vérifer s’il appartient à la bibliothèque, et son statut (libre, emprunté ou réservé). Rédigez ce cas d’utilisation.

  3. Rédigez le cas d’utilisation "Emprunt d’un document", qui utilisera le cas "Scan d’un document". Prevoyez un nombre maxi de documents empruntés simultanément.

  4. Dessinez le diagramme de séquence correspondant à l’ensemble "Identification d’un utilisateur" et plusieurs "Emprunts de document". On ajoutera les messages correspondant à la fermeture de session utilisateur par le bibliothécaire pour sortir de l’état "Utilisateur identifié".

5. Autres cas d’utilisation : l’ascenseur

  1. Creez un diagramme de cas d’utilisation d’après les besoins suivants pour le système de contrôle d’un ascenseur :

    1. Le système de contrôle permet aux passagers d’appeler l’ascenseur ou de sélectionner l’étage de destination.

    2. Quand le passager pousse un bouton extérieur (pour appeler l’ascenseur), ou un bouton intérieur (pour choisir un étage), le système de contrôle allume ce bouton.

    3. Quand un passager appelle l’ascenseur ou choisit un étage, le système de contrôle ferme la porte de l’ascenseur, et déplace l’ascenseur vers le passager ou vers l’étage choisi.

    4. Quand l’ascenseur arrive à l’étage où il a été appelé, le système de contrôle ouvre la porte et éteint le bouton d’appel.

    5. Quand l’ascenseur arrive à un étage, le système de contrôle éteint le bouton de l’étage.

  2. Rédigez le cas d’utilisation "Choix d’étage"

6. Diagramme d’activité : Traitement d’une commande

Le traitement d’une commande par une entreprise s’effectue ainsi :

  • Réception de la commande

  • D’une part :

    • émission de la facture

    • réception du paiement

  • D’autre part, en parallèle :

    • Préparation du colis

  • Attendre que le colis soit prêt et que le paiement ait été reçu.

  • Si la commande est urgente, envoi par coursier

  • Si non, envoi par la poste

  • Archivage de la commande

7. Types de relation

8. Diagramme de classe : contrat de travail

Créez les classes et associations nécessaires à la modélisation du problème suivant :

  • Les employés sont liés aux entreprises qui les emploient par des contrats de travail

  • Pour un employé et une entreprise donnés, il y a au plus un contrat de travail.

  • Une entreprise emploie potentiellement plusieurs salariés

  • Un salarié peut signer plusieurs contrats de travail

  • Tous les contrats de travail ont une date de début

  • Les contrats de travail de type CDD ont une date de fin

  • Les contrats de travail de type CDI ont une durée de période d’essai

9. Diagramme de classe : arbre généalogique

Créez les classes et associations nécessaires à la modélisation du problème suivant :

  • On souhaite représenter les données d’un arbre généalogique

  • Pour chaque personne, on connait la date de naissance, la date de décès et le rang dans la fratrie

  • Une union est une association (arf !) entre deux personnes si les deux personnes sont connues, ou une seule si la deuxième personne n’est pas connue

  • Une union peut être privée, être un PACS ou un mariage

  • Le PACS et le mariage ont une date de début et une date de fin

  • Les enfants naissent d’une union

10. Diagramme de classe : compagnie aerienne

Créez les classes et associations nécessaires à la modélisation du problème suivant :

  • Une compagnie aérienne propose des places sur différents vols à des passagers.

  • Un vol est une succession de segments de vol.

  • Un segment de vol a un aéroport de départ et un aéroport d’arrivée.

  • Les aéroports desservent des villes.

  • Chaque pilote a un unique contrat de travail avec la compagnie, qui a une date de début et une date de fin.

  • Un pilote est soit commandant de bord, soit copilote. Il peut passer d’un état à l’autre.

  • Un commandant de bord, un copilote et un avion sont affectés à chaque segment.

  • Une réservation concerne un passager et un segment de vol pour une date donnée.

  • Les passagers sont identifiés par un nom, un prénom et un numéro de passeport.

11. Python : Vehicles

Implémentez en Python les classes suivantes:

  • Une classe Vehicle:

    • Son constructeur accepte deux arguments name et capacity

    • Une méthode fare retourne le prix de location des véhicules de cette classe, soit 100 fois la capacité du véhicule

    • Une méthode __repr__ renvoie une chaîne de caractère contenant le nom du véhicule et son tarif. La méthode __repr__ est automatiquement appelée lorsque l’objet doit être affiché par la fonction print.

  • Une classe Car hérite de Vehicle. Son constructeur n’accepte qu’un seul argument name, et positionne automatiquement la capacité à 5.

  • Une classe Bus hérite de Vehicle et redéfinit le tarif comme étant 10% de plus que le tarif standard.

  • Vérifiez que le code suivant s’exécute correctement

v = Car("VW Touran")
print(v)

v = Bus("School Volvo", 50)
print(v)

et qu’il affiche le texte suivant:

VW Touran: 500
School Volvo: 5500.0

12. Python : un robot très simple

Un robot se déplace sur un plateau à cases carrées. Les cases ont des coordonnées x et y (entiers) qui peuvent éventuellement être négatives. Écrire une classe Robot possédant les caractéristiques suivantes:

  • Le constructeur accepte deux arguments qui sont les coordonnées de départ

  • Le robot possède une orientation ('Nord', 'Sud', 'Est', ou 'Ouest').

  • Lors de sa création, un robot est toujours tourné vers le nord.

  • Une méthode 'droite()' permet au robot d’effectuer un quart de tour sur lui-même vers la droite.

  • Une méthode avance() permet d’avancer le robot d’une case dans la direction courante du robot.

Écrire également une nouvelle classe de robot amélioré, le RobotNG. Cette classe aura les mêmes caractéristiques que le robot de base, et saura en plus:

  • Effectuer un demitour()

  • Courir de 5 cases dans sa direction courante.

Tester ces deux classes avec ce programme.

class Robot:

    def __init__...

    def __repr__(self):
        return [self.x, self.y, self.direction].__repr__()

    ...


r = Robot(2,4)
assert(r.x == 2 and r.y == 4 and r.direction == 'Nord')
r.avance()
print(r)
assert(r.x == 2 and r.y == 5)
r.droite()
r.avance()
r.avance()
print(r)
assert(r.x == 4 and r.y == 5)
r.droite()
r.droite()
r.avance()
print(r)
assert(r.x == 3 and r.y == 5)


class RobotNG...

    def demitour...

    def courir...

r = RobotNG(0,0)
assert(r.x == 0 and r.y == 0 and r.direction == 'Nord')
r.demitour()
r.courir()
print(r)
assert(r.x == 0 and r.y == -5)

13. Python : que fait ce programme ?

class Personne:

    def __init__(self):
        self.stock = {'pain': 1, 'ble': 0, 'farine': 0}

    def mange(self):
        if self.stock['pain'] <= 0:
            print("J'ai faim !")
            return
        self.stock['pain'] -= 1
        print("J'ai bien mangé.")

    def souhaite_obtenir(self):
        return [('pain', 1)]

    def donne_a(self, personne):
        assert (self != personne)
        list_of_pairs = personne.souhaite_obtenir()
        for p, q in list_of_pairs:
            q = min(q, self.stock[p])
            if q > 0:
                self.stock[p] -= q
                personne.stock[p] += q

    def transforme(self, ingredient, produit):
        q = self.stock[ingredient]
        if q > 0:
            self.stock[ingredient] -= q
            self.stock[produit] += q

class Paysan(Personne):
    def produit(self):
        self.stock['ble'] += 3

class Meunier(Personne):
    def produit(self):
        self.transforme('ble', 'farine')
    def souhaite_obtenir(self):
        return [('pain', 1), ('ble', 3)]

class Boulanger(Personne):
    def produit(self):
        self.transforme('farine', 'pain')
    def souhaite_obtenir(self):
        return [('farine', 3)]

personnes = [Paysan(), Meunier(), Boulanger()]
for i in range(4):
    for p in personnes:
        p.mange()
    for p in personnes:
        p.produit()
    for p in personnes:
        for p_prime in personnes:
            if p != p_prime:
                p.donne_a(p_prime)
    print()

for p in personnes:
    print(p.stock)

14. Python : les Mangenombres

Pour obtenir les nombres premiers compris entre 2 et un certain entier N on va construire une liste chaînée d’objets appelés des MangeNombres, chacun comportant deux variables d’instance : un nombre premier p et une référence sur le MangeNombres suivant de la liste.

Le comportement d’un MangeNombres se réduit à l’opération ”manger un nombre”, implémentée par une méthode mange acceptant un entier q en paramètre. Le MangeNombres mp associé au nombre p mange les multiples de p : si on lui donne à manger un nombre q qui n’est pas multiple de p, mp le donne à manger à son MangeNombres suivant, s’il existe. Si mp n’a pas de suivant, il en crée un, associé à q, et le stocke comme suivant. La création d’un MangeNombres mp provoque l’affichage de p. Définissez la classe MangeNombres et écrivez un programme affichant les nombres premiers entre 2 et 20.

Complétez ce programme.

class MangeNombres:

  def __init__(self, p):
    self.p = p
    print(p)
    self.suivant = None

  def mange(self, q):
     ...

N = 2
m = MangeNombres(N)
for i in range(N+1, 20):
  m.mange(i)

15. Python : A budget app

Create a Budget class that can instantiate objects based on different budget categories like food, clothing, and entertainment. These objects should allow for depositing and withdrawing funds from each category, as well as computing category balances and transferring balance amounts between categories.

As a bonus, define a function that computes how much money you are spending across class categories as a % of your total expenses.

Here’s a skeleton of program to get you started…​

class Category:
  """
  Records an amount, a list of expenses.
  Amount can be updated later
  """

  def __init__...


class Budget:
  """
  This class allows to record expenses and
  categorize them into various types of
  expenses
  """

  def __init__...


b = Budget(100)
b.print_status()
b.add_category('Food', 20)
b.add_category('Transport', 10)
b.print_status()
b.add_expense('Food', 1.4)
b.add_expense('Transport', 4.6)
b.print_status()
b.balance('Food', 'Transport', 2.8)
b.print_status()
print(b.proportions())