Conception Orientee Objet UML - Semestre 7

Annee Universitaire : 2023-2024
Semestre : 7
Credits : 2.5 ECTS
Specialite : Genie Logiciel et Methodologie


PART A - Presentation Generale du Module

Vue d'ensemble

Ce cours enseigne la conception orientee objet et le langage UML (Unified Modeling Language) pour analyser, concevoir et documenter des systemes logiciels complexes. Il fournit une methodologie structuree pour passer de l'analyse des besoins a une architecture logicielle robuste avant l'implementation.

Objectifs pedagogiques :

  • Maitriser les diagrammes UML structurels et comportementaux
  • Appliquer les principes de conception objet (SOLID)
  • Utiliser les design patterns classiques (GoF)
  • Concevoir des architectures logicielles maintenables
  • Documenter efficacement un projet logiciel

Position dans le cursus

Ce module complete :

  • Programmation Orientee Objets C++ (S7) : concepts POO en pratique
  • Programmation Orientee Objets Java (S7) : implementation des designs
  • Langage C (S5) : transition vers la POO

Il prepare a :

  • Projets de genie logiciel : architectures complexes
  • Travail en equipe : communication via UML
  • Ingenierie logicielle industrielle : documentation standardisee
  • Maintenance et evolution : code structure et extensible

PART B - Experience Personnelle et Contexte d'Apprentissage

Organisation et ressources

Le module etait structure en plusieurs volets :

Cours magistraux (12h) :

  • Introduction a UML et a la conception objet
  • Diagrammes structurels (classes, objets, composants, deploiement)
  • Diagrammes comportementaux (sequence, activite, etats)
  • Principes SOLID et bonnes pratiques
  • Design patterns du Gang of Four

Travaux diriges (12h) :

  • Exercices de modelisation sur cas d'etude
  • Correction et discussion des TD
  • Ressource disponible : Correction_TD.txt avec lien Notion detaille
  • Analyse de problemes reels (bibliotheque, e-commerce, systeme embarque)

Projet de conception (16h) :

Realisation complete d'un systeme avec :

  • Analyse des besoins (cas d'utilisation)
  • Modelisation structurelle (diagrammes de classes)
  • Modelisation comportementale (sequence, etats)
  • Prototypage en Java ou C++
  • Documentation UML complete

Ressources pedagogiques :

  • Cours_ConceptionArchitectures.pdf (support de cours)
  • Notes partagees Notion (correction des TD)
  • Outils : Enterprise Architect, StarUML, PlantUML
  • Livres de reference : "Design Patterns" (GoF), "UML 2" (Pascal Roques)

Methodologie d'apprentissage

Phase 1 : Analyse des besoins :

Identifier les acteurs, definir les cas d'utilisation, specifier les exigences fonctionnelles et non-fonctionnelles.

Phase 2 : Modelisation structurelle :

Creer les diagrammes de classes (entites, relations, multiplicites), definir les interfaces et l'architecture en couches.

Phase 3 : Modelisation comportementale :

Decrire les interactions (diagrammes de sequence), les workflows (diagrammes d'activite), les etats (machines a etats).

Phase 4 : Application des patterns :

Identifier les problemes recurrents et appliquer les patterns appropries (Factory, Observer, Strategy, etc.).

Phase 5 : Implementation :

Generer le code squelette depuis les diagrammes, implementer la logique metier, maintenir la coherence UML/code.

Difficultes rencontrees

Niveau d'abstraction :

Trouver le bon equilibre entre detail et abstraction. Trop detaille rend les diagrammes illisibles, trop abstrait les rend inutiles.

Multiplicite des diagrammes :

UML propose 14 types de diagrammes. Savoir lesquels utiliser selon le contexte n'est pas immediat.

Maintien de la coherence :

Garder les diagrammes synchronises avec le code lors des evolutions demande de la rigueur et du temps.

Over-engineering :

Tendance a vouloir appliquer trop de patterns ou creer des architectures trop complexes pour le probleme donne.


PART C - Aspects Techniques Detailles

1. Introduction a UML

UML = Unified Modeling Language

Langage de modelisation graphique standardise (ISO/IEC 19505) pour visualiser, specifier, construire et documenter des systemes logiciels.

Historique :

  • Annees 1990 : fusion des methodes Booch, OMT, OOSE
  • Version 1.0 en 1997
  • Version 2.5 actuelle (2015)

Les 14 diagrammes UML :

CategorieDiagrammes
StructurelsClasses, Objets, Composants, Deploiement, Packages, Structure composite, Profil
ComportementauxCas d'utilisation, Activite, Etats-transitions, Sequence, Communication, Timing, Vue d'ensemble interaction

En pratique : On utilise principalement 5-6 diagrammes (classes, sequence, activite, etats, cas d'utilisation, composants).

2. Diagramme de cas d'utilisation

Objectif : Decrire les fonctionnalites du systeme du point de vue utilisateur.

Elements :

  • Acteur : Utilisateur ou systeme externe
  • Cas d'utilisation : Fonctionnalite offerte
  • Relations : include (inclusion obligatoire), extend (extension conditionnelle), generalisation

Exemple : Systeme de bibliotheque

Acteurs :

  • Lecteur (emprunter livre, consulter catalogue)
  • Bibliothecaire (enregistrer retour, gerer amendes)
  • Administrateur (ajouter livre, gerer utilisateurs)

Relations :

  • "Emprunter livre" include "Verifier disponibilite"
  • "Rechercher livre" extend "Filtrer par auteur"

Notation :

  • Acteur : bonhomme stylise
  • Cas d'utilisation : ellipse avec nom
  • Relations : fleches avec stereotypes

3. Diagramme de classes

Objectif : Decrire la structure statique du systeme (classes, attributs, methodes, relations).

Classe :

Une classe contient trois compartiments :

  • Nom de la classe
  • Attributs (visibilite nom : type)
  • Methodes (visibilite nom(parametres) : type_retour)

Visibilites :

  • + public (accessible partout)
  • - private (accessible seulement dans la classe)
  • # protected (accessible dans la classe et ses sous-classes)
  • ~ package (accessible dans le package)

Exemple :

Livre
--------------
- isbn : String
- titre : String
- auteur : String
- disponible : Boolean
--------------
+ emprunter() : Boolean
+ retourner() : void
+ estDisponible() : Boolean

Relations entre classes :

RelationSymboleSignificationExemple
Associationligne simpleLes classes se connaissentLecteur --- Livre
Agregationlosange vide"A des" (partie peut exister seule)Bibliotheque --- Livre
Compositionlosange plein"Compose de" (partie liee au tout)Voiture --- Moteur
Heritagefleche triangle vide"Est un"LivreNumerique ---|> Livre
Realisationfleche triangle pointilleeImplemente interfaceClasseConcrete ..|> Interface
Dependancefleche pointilleeUtilise temporairementClient ...> Service

Multiplicites :

  • 1 : exactement un
  • 0..1 : zero ou un
  • * : zero ou plusieurs
  • 1..* : un ou plusieurs
  • 2..5 : entre 2 et 5

Exemple complet :

Bibliotheque (1) --- (0..*) Livre
Lecteur (1) --- (0..5) Emprunt
Emprunt (*) --- (1) Livre

Un lecteur peut avoir au maximum 5 emprunts simultanes.

4. Diagramme d'objets

Objectif : Montrer des instances concretes a un instant donne (snapshot).

Difference avec diagramme de classes :

  • Classes : structure generale
  • Objets : instances particulieres avec valeurs

Exemple :

livre1 : Livre
- isbn = "978-2-1234"
- titre = "Design Patterns"
- disponible = false

lecteur1 : Lecteur
- nom = "Dupont"
- numeroCarte = "12345"

emprunt1 : Emprunt
- dateEmprunt = "2024-11-15"
- dateRetourPrevue = "2024-12-15"

Utilite : Valider le diagramme de classes avec des exemples concrets, illustrer des configurations complexes.

5. Diagramme de sequence

Objectif : Montrer les interactions entre objets dans le temps (ordre chronologique des messages).

Elements :

  • Lignes de vie : lignes verticales representant les objets
  • Messages : fleches horizontales entre lignes de vie
  • Activation : rectangle sur ligne de vie (objet actif)
  • Fragments : alt (alternative), loop (boucle), opt (optionnel), par (parallele)

Types de messages :

  • Synchrone : fleche pleine (appelant attend la reponse)
  • Asynchrone : fleche ouverte (appelant continue sans attendre)
  • Retour : fleche pointillee

Exemple : Emprunter un livre

Lecteur -> Bibliotheque : emprunterLivre(isbn)
Bibliotheque -> Catalogue : rechercherLivre(isbn)
Catalogue -> Bibliotheque : livre
alt livre disponible
    Bibliotheque -> Emprunt : creerEmprunt(lecteur, livre)
    Emprunt -> Livre : marquerEmprunte()
    Bibliotheque -> Lecteur : confirmationEmprunt
else livre indisponible
    Bibliotheque -> Lecteur : messageErreur
end

Fragments utiles :

  • alt : if/else (branches alternatives)
  • loop : boucle (condition et iteration)
  • opt : optionnel (execute si condition vraie)
  • par : parallele (execution simultanee)
  • ref : reference a un autre diagramme

6. Diagramme d'activite

Objectif : Modeliser les workflows, processus metier, algorithmes (similaire a un organigramme ameliore).

Elements :

  • Noeud initial : cercle noir plein
  • Noeud final : cercle noir avec cercle autour
  • Activite : rectangle arrondi
  • Decision : losange (condition)
  • Fork/Join : barre horizontale (parallelisme)
  • Swimlanes : partitions par acteur/systeme

Exemple : Processus d'emprunt

[Debut]
|
Lecteur presente carte
|
<Carte valide?>
  Non -> Refuser emprunt -> [Fin]
  Oui |
Scanner code-barres livre
|
<Livre disponible?>
  Non -> Proposer reservation -> [Fin]
  Oui |
Enregistrer emprunt
|
Imprimer ticket
|
[Fin]

Parallelisme avec fork/join :

Fork (barre horizontale) :
-> Activite A
-> Activite B (en parallele)

Join : synchronisation (attendre que A et B soient terminees)

7. Diagramme d'etats-transitions

Objectif : Modeliser le cycle de vie d'un objet (etats possibles et transitions).

Elements :

  • Etat : rectangle arrondi
  • Transition : fleche avec evenement declencheur
  • Etat initial : cercle noir
  • Etat final : cercle noir avec cercle
  • Actions : entry/ (a l'entree), do/ (pendant), exit/ (a la sortie)

Exemple : Etats d'un livre

[Initial]
|
Disponible
  entry/ afficherDisponible()

Disponible --[emprunter]--> Emprunte
  entry/ enregistrerEmprunt()
  do/ decrementerDisponibilites()

Emprunte --[retourner]--> Disponible
  exit/ libererExemplaire()

Emprunte --[depasser delai]--> EnRetard
  entry/ calculerAmende()

EnRetard --[retourner + payer amende]--> Disponible

Disponible --[retirer du catalogue]--> [Final]

Etats composites :

Un etat peut contenir des sous-etats (hierarchie).

Etats concurrents :

Plusieurs etats actifs simultanement (separes par ligne pointillee).

8. Diagrammes de composants et deploiement

Diagramme de composants :

Montre l'organisation logicielle en modules/bibliotheques avec leurs dependances.

Composants typiques :

  • Interface Utilisateur (UI)
  • Logique metier (Business Logic)
  • Acces aux donnees (DAO)
  • Bibliotheques externes

Relations :

  • Dependances entre composants
  • Interfaces fournies (cercle) et requises (demi-cercle)

Diagramme de deploiement :

Montre l'architecture physique (serveurs, reseaux, artefacts deployes).

Elements :

  • Noeuds : materiel (serveur, PC, mobile)
  • Artefacts : fichiers deployes (JAR, EXE, WAR)
  • Communications : protocoles (HTTP, TCP, etc.)

Exemple :

Serveur Web
  - Apache Tomcat
  - Application.war

Base de donnees
  - MySQL Server
  - Schema bibliotheque

Poste client
  - Navigateur Web
  - Interface HTML/CSS/JS

9. Principes de conception SOLID

Ensemble de 5 principes pour creer du code maintenable et extensible.

S - Single Responsibility Principle (SRP) :

Une classe doit avoir une seule raison de changer (une seule responsabilite).

Mauvais :

class Livre
  + sauvegarderDansBaseDeDonnees()  // responsabilite persistance
  + envoyerEmailNotification()       // responsabilite notification

Bon :

class Livre
  // seulement logique metier livre

class LivreRepository
  + sauvegarder(livre)

class NotificationService
  + envoyerEmail(destinataire, message)

O - Open/Closed Principle (OCP) :

Les classes doivent etre ouvertes a l'extension, fermees a la modification.

Utiliser l'heritage, la composition, ou les interfaces pour etendre sans modifier le code existant.

L - Liskov Substitution Principle (LSP) :

Les objets d'une classe derivee doivent pouvoir remplacer les objets de la classe de base sans alterer le comportement.

I - Interface Segregation Principle (ISP) :

Mieux vaut plusieurs interfaces specifiques qu'une interface generale.

Mauvais :

interface DocumentActions
  + imprimer()
  + scanner()
  + faxer()

Une imprimante simple doit implementer scanner() et faxer() meme si elle ne les supporte pas.

Bon :

interface Imprimable
  + imprimer()

interface Scannable
  + scanner()

class ImprimanteSimple implements Imprimable
class ImprimanteMultifonction implements Imprimable, Scannable

D - Dependency Inversion Principle (DIP) :

Dependre des abstractions (interfaces), pas des implementations concretes.

Mauvais :

class Bibliotheque
  private MySQLDatabase db  // dependance concrete

Bon :

interface Database
  + sauvegarder(data)
  + charger(id)

class Bibliotheque
  private Database db  // dependance abstraite

class MySQLDatabase implements Database
class MongoDBDatabase implements Database

Permet de changer facilement de base de donnees sans modifier Bibliotheque.

10. Design Patterns (Patrons de conception)

Solutions eprouvees a des problemes recurrents de conception.

Patterns creationnels : gestion de la creation d'objets

Singleton :

Garantir une seule instance d'une classe.

class ConfigurationManager
  private static instance : ConfigurationManager

  private ConfigurationManager()  // constructeur prive

  public static getInstance() : ConfigurationManager
    if instance == null
      instance = new ConfigurationManager()
    return instance

Utilisation : gestionnaires uniques (configuration, logging, pool de connexions).

Factory Method :

Deleguer la creation d'objets aux sous-classes.

abstract class DocumentFactory
  abstract creerDocument() : Document

class PDFFactory extends DocumentFactory
  creerDocument() : Document
    return new PDFDocument()

class WordFactory extends DocumentFactory
  creerDocument() : Document
    return new WordDocument()

Abstract Factory :

Creer des familles d'objets lies sans specifier leurs classes concretes.

Patterns structurels : organisation des classes et objets

Adapter :

Convertir l'interface d'une classe en une autre interface attendue.

interface LecteurMultimedia
  + lire(fichier)

class LecteurMP3
  + jouerMP3(fichier)

class AdapterMP3 implements LecteurMultimedia
  private lecteurMP3 : LecteurMP3

  lire(fichier)
    lecteurMP3.jouerMP3(fichier)

Decorator :

Ajouter dynamiquement des responsabilites a un objet.

interface Cafe
  + cout() : double

class CafeSimple implements Cafe
  cout() : double
    return 2.0

class AvecLait implements Cafe
  private cafe : Cafe

  cout() : double
    return cafe.cout() + 0.5

class AvecSucre implements Cafe
  private cafe : Cafe

  cout() : double
    return cafe.cout() + 0.2

Usage :

Cafe monCafe = new AvecLait(new AvecSucre(new CafeSimple()))
// cout = 2.0 + 0.2 + 0.5 = 2.7

Composite :

Composer des objets en structures arborescentes (traiter uniformement objets individuels et compositions).

Patterns comportementaux : interactions entre objets

Observer :

Notifier automatiquement des objets lors d'un changement d'etat.

interface Observer
  + update(sujet)

class Sujet
  private observateurs : List<Observer>

  + attacher(observateur)
    observateurs.add(observateur)

  + notifier()
    for each observateur in observateurs
      observateur.update(this)

class AffichageTemperature implements Observer
  update(sujet)
    temperature = sujet.getTemperature()
    afficher(temperature)

Utilisation : interfaces graphiques (MVC), systemes evenementiels.

Strategy :

Encapsuler des algorithmes interchangeables.

interface StrategieCalculAmende
  + calculer(joursRetard) : double

class AmendeStandard implements StrategieCalculAmende
  calculer(joursRetard) : double
    return joursRetard * 0.5

class AmendeEtudiant implements StrategieCalculAmende
  calculer(joursRetard) : double
    return joursRetard * 0.2

class GestionnaireEmprunt
  private strategie : StrategieCalculAmende

  definirStrategie(strategie)
    this.strategie = strategie

  calculerAmende(joursRetard)
    return strategie.calculer(joursRetard)

Command :

Encapsuler une requete comme un objet.

Permet : annulation (undo), file d'attente de commandes, journalisation.

State :

Modifier le comportement d'un objet selon son etat interne.

Template Method :

Definir le squelette d'un algorithme, les sous-classes redefinissent certaines etapes.

11. De UML au code

Forward Engineering : generer du code depuis les diagrammes UML.

Outils :

  • Enterprise Architect (generation Java, C++, C#, Python)
  • StarUML (generation code basique)
  • PlantUML + scripts custom

Exemple : diagramme de classes -> classes Java avec attributs et signatures de methodes (squelettes).

Reverse Engineering : generer des diagrammes UML depuis le code existant.

Utile pour :

  • Documenter du legacy code
  • Analyser une base de code inconnue
  • Maintenir coherence code/documentation

Round-trip Engineering : synchronisation bidirectionnelle code / UML.

Modifications du code refletees dans les diagrammes et vice-versa.

En pratique : difficile a maintenir, necessite discipline et outillage adapte.

12. Outils de modelisation

OutilTypeAvantagesInconvenients
Enterprise ArchitectCommercialComplet, generation code, collaborationCouteux, interface complexe
StarUMLOpen-source/CommercialInterface intuitive, legereteFonctionnalites limitees version gratuite
PlantUMLOpen-sourceTextuel, integration CI/CD, versioningCourbe apprentissage syntaxe
LucidchartWebCollaboratif, facileLimite version gratuite
draw.ioWeb/OpenGratuit, simplePas specialise UML
Visual ParadigmCommercialPuissant, formation incluseCouteux

Recommandation personnelle :

  • Projets personnels : PlantUML (versionnable avec Git)
  • Entreprise : Enterprise Architect ou Visual Paradigm
  • Collaboration rapide : Lucidchart ou Miro

PART D - Analyse Reflexive et Perspectives

Competences acquises

Modelisation et abstraction :

Capacite a analyser un probleme complexe et a le decomposer en entites, relations et comportements modelisables.

Communication technique :

UML fournit un langage universel pour communiquer des architectures entre developpeurs, chefs de projet, et clients.

Anticipation et planification :

Concevoir avant d'implementer permet d'identifier les problemes d'architecture tot, reduisant les couts de refactoring.

Qualite logicielle :

Application des principes SOLID et patterns produit du code plus maintenable, testable et extensible.

Projet realise : Systeme de gestion de bibliotheque

Contexte :

Conception complete d'un systeme de bibliotheque multimedia (livres, DVDs, periodiques) avec gestion des emprunts, reservations, amendes, et utilisateurs.

Livrables :

  • Diagramme de cas d'utilisation (12 cas, 4 acteurs)
  • Diagramme de classes complet (35+ classes)
  • Diagrammes de sequence (emprunter, retourner, reserver, payer amende)
  • Diagrammes d'etats (cycle de vie livre, emprunt)
  • Diagramme d'activite (processus d'emprunt complet)
  • Prototype Java avec patterns appliques

Patterns utilises :

  • Singleton : BibliothequeManager (instance unique)
  • Factory : DocumentFactory pour creer Livre, DVD, Periodique
  • Observer : notification disponibilite pour reservations
  • Strategy : calcul amendes selon type utilisateur (standard, etudiant, enseignant)
  • State : gestion etats emprunt (en cours, en retard, termine)

Resultats :

Architecture claire et extensible. Ajout de nouveaux types de documents ou nouvelles regles d'amende facile grace aux patterns. Code bien structure avec separation des responsabilites.

Points cles a retenir

1. UML = outil, pas objectif :

L'objectif est une bonne conception, pas de beaux diagrammes. Utiliser UML de maniere pragmatique.

2. Tous les diagrammes ne sont pas necessaires :

Identifier ceux qui apportent de la valeur selon le contexte (classes et sequence souvent suffisants).

3. SOLID avant patterns :

Comprendre et appliquer SOLID est plus important que connaitre tous les patterns.

4. Patterns = solutions, pas recettes magiques :

Ne pas forcer l'utilisation d'un pattern. L'appliquer seulement si le probleme correspond.

5. Documentation vivante :

La documentation doit evoluer avec le code, sinon elle devient obsolete et trompeuse.

Retour d'experience

Courbe d'apprentissage :

UML semblait complexe initialement (14 diagrammes, notations specifiques). Avec la pratique, on identifie rapidement les 5-6 diagrammes essentiels.

Lien avec la POO :

Ce cours a renforce ma comprehension de la POO au-dela de la syntaxe. Concepts comme l'encapsulation, l'abstraction, le polymorphisme deviennent concrets.

Application en projets :

Utiliser UML sur des projets reels (meme simplifies) a prouve son utilite. Gain de temps et moins de bugs grace a la reflexion en amont.

Collaboration facilitee :

Travailler en equipe avec UML comme langage commun a grandement ameliore la communication et reduit les malentendus.

Applications pratiques

Developpement logiciel :

  • Applications d'entreprise (ERP, CRM)
  • Systemes embarques (modelisation etats et sequences critiques)
  • Applications web (architecture MVC/MVVM)

Refactoring :

Reverse engineering de code legacy, identification des problemes (couplage fort, responsabilites mixtes), puis refactoring guide par SOLID.

Documentation :

Generer automatiquement documentation technique a partir des diagrammes UML. Integration dans wikis d'entreprise.

Communication client :

Diagrammes de cas d'utilisation et d'activite comprehensibles par non-developpeurs pour valider les besoins.

Limites et critiques

UML lourd et verbeux :

Creer et maintenir tous les diagrammes prend du temps. Approche agile prefere "UML leger" (quelques diagrammes cles).

Decalage documentation/code :

Sans discipline ou outils de synchronisation, les diagrammes deviennent rapidement obsoletes.

Over-engineering :

Risque de creer des architectures trop complexes, avec trop de patterns, pour des problemes simples.

Alternatives modernes :

  • C4 Model : documentation architecturale pragmatique (Context, Containers, Components, Code)
  • Architecture Decision Records (ADR) : documenter les decisions plutot que les diagrammes
  • Living Documentation : tests et code comme documentation

Evolutions et perspectives

Domain-Driven Design (DDD) :

Approche centree sur le domaine metier. Utilise UML mais ajoute concepts (Entities, Value Objects, Aggregates, Repositories).

SysML :

Extension UML pour ingenierie systeme (pas seulement logiciel). Utilise en aeronautique, automobile, defense.

Outils modernes :

  • Generation automatique de diagrammes depuis le code (Doxygen, Javadoc UML)
  • Documentation as Code (PlantUML en Markdown, versioning Git)
  • Collaboration temps reel (Miro, Lucidchart, Figma pour UML)

Intelligence Artificielle :

IA generatrice de diagrammes UML depuis descriptions textuelles, detection automatique de violations SOLID, suggestions de patterns.

Conseils pour reussir

1. Pratiquer sur projets concrets :

Modeliser des systemes reels (e-commerce, reseau social, jeu) plutot que des exercices abstraits.

2. Commencer simple :

Debuter avec diagrammes de classes et sequence. Ajouter d'autres types selon les besoins.

3. Valider avec du code :

Implementer les designs pour verifier leur coherence et faisabilite.

4. Etudier du code open-source :

Analyser l'architecture de projets populaires (Spring Framework, Apache Commons) pour voir SOLID et patterns en pratique.

5. Iterer :

La conception n'est jamais parfaite du premier coup. Reviser et ameliorer au fur et a mesure.

Conclusion

Ce module fournit une methodologie essentielle pour concevoir des systemes logiciels robustes et maintenables. Au-dela de la syntaxe UML, ce sont les principes de conception objet (SOLID) et les patterns qui constituent l'apport majeur.

Competences transferables :

  • Pensee architecturale et abstraite
  • Conception avant implementation
  • Communication technique efficace
  • Code de qualite professionnelle

Pertinence professionnelle :

En entreprise, la conception et documentation sont attendues, surtout pour projets critiques ou reglementes. Savoir modeliser et justifier ses choix d'architecture est un atout majeur.

Message principal :

UML est un outil parmi d'autres. L'essentiel est de developper une demarche de conception structuree, applicable quel que soit le formalisme. Les principes SOLID et patterns sont universels et transcendent les langages et outils.

Recommandations :

  • Utiliser UML de maniere pragmatique (eviter dogmatisme)
  • Privilegier les diagrammes qui apportent de la valeur
  • Maintenir documentation a jour (automatisation si possible)
  • Continuer a apprendre patterns avances et architectures (microservices, event-driven)
  • Explorer DDD pour approfondir modelisation metier

Liens avec les autres cours :


Documents de CoursCourse Documents

Cours Conception et ArchitecturesDesign and Architecture Course

Cours complet UML : diagrammes de classes, sequences, cas d'utilisation, patterns de conception et principes SOLID.Complete UML course: class diagrams, sequence diagrams, use cases, design patterns and SOLID principles.

TelechargerDownload

Sujet TDTutorial Subject

Travaux diriges sur la conception orientee objet : modelisation de systemes embarques et architectures logicielles.Tutorials on object-oriented design: modeling of embedded systems and software architectures.

TelechargerDownload


Cours suivi en 2023-2024 a l'INSA Toulouse, Departement Genie Electrique et Informatique.Course taken in 2023-2024 at INSA Toulouse, Department of Electrical Engineering and Computer Science.

Object-Oriented Design UML - Semester 7

Academic Year: 2023-2024
Semester: 7
Credits: 2.5 ECTS
Specialty: Software Engineering and Methodology


PART A - General Module Overview

Overview

This course teaches object-oriented design and the UML (Unified Modeling Language) language for analyzing, designing and documenting complex software systems. It provides a structured methodology for moving from requirements analysis to a robust software architecture before implementation.

Learning objectives:

  • Master structural and behavioral UML diagrams
  • Apply object-oriented design principles (SOLID)
  • Use classic design patterns (GoF)
  • Design maintainable software architectures
  • Effectively document a software project

Position in the Curriculum

This module complements:

  • Object-Oriented Programming C++ (S7): OOP concepts in practice
  • Object-Oriented Programming Java (S7): design implementation
  • C Language (S5): transition to OOP

It prepares for:

  • Software engineering projects: complex architectures
  • Teamwork: communication via UML
  • Industrial software engineering: standardized documentation
  • Maintenance and evolution: structured and extensible code

PART B - Personal Experience and Learning Context

Organization and Resources

The module was structured in several components:

Lectures (12h):

  • Introduction to UML and object-oriented design
  • Structural diagrams (classes, objects, components, deployment)
  • Behavioral diagrams (sequence, activity, states)
  • SOLID principles and best practices
  • Gang of Four design patterns

Tutorials (12h):

  • Modeling exercises on case studies
  • Correction and discussion of tutorials
  • Available resource: Correction_TD.txt with detailed Notion link
  • Analysis of real-world problems (library, e-commerce, embedded system)

Design project (16h):

Complete implementation of a system with:

  • Requirements analysis (use cases)
  • Structural modeling (class diagrams)
  • Behavioral modeling (sequence, states)
  • Prototyping in Java or C++
  • Complete UML documentation

Teaching resources:

  • Cours_ConceptionArchitectures.pdf (course material)
  • Shared Notion notes (tutorial corrections)
  • Tools: Enterprise Architect, StarUML, PlantUML
  • Reference books: "Design Patterns" (GoF), "UML 2" (Pascal Roques)

Learning Methodology

Phase 1: Requirements Analysis:

Identify actors, define use cases, specify functional and non-functional requirements.

Phase 2: Structural Modeling:

Create class diagrams (entities, relationships, multiplicities), define interfaces and layered architecture.

Phase 3: Behavioral Modeling:

Describe interactions (sequence diagrams), workflows (activity diagrams), states (state machines).

Phase 4: Applying Patterns:

Identify recurring problems and apply appropriate patterns (Factory, Observer, Strategy, etc.).

Phase 5: Implementation:

Generate skeleton code from diagrams, implement business logic, maintain UML/code consistency.

Difficulties Encountered

Level of abstraction:

Finding the right balance between detail and abstraction. Too detailed makes diagrams unreadable, too abstract makes them useless.

Multiplicity of diagrams:

UML offers 14 types of diagrams. Knowing which to use depending on the context is not immediate.

Maintaining consistency:

Keeping diagrams synchronized with the code during evolution requires rigor and time.

Over-engineering:

Tendency to apply too many patterns or create overly complex architectures for the given problem.


PART C - Detailed Technical Aspects

1. Introduction to UML

UML = Unified Modeling Language

A standardized graphical modeling language (ISO/IEC 19505) for visualizing, specifying, constructing and documenting software systems.

History:

  • 1990s: merger of Booch, OMT, OOSE methods
  • Version 1.0 in 1997
  • Current version 2.5 (2015)

The 14 UML diagrams:

CategoryDiagrams
StructuralClasses, Objects, Components, Deployment, Packages, Composite structure, Profile
BehavioralUse case, Activity, State machine, Sequence, Communication, Timing, Interaction overview

In practice: Mainly 5-6 diagrams are used (classes, sequence, activity, states, use cases, components).

2. Use Case Diagram

Objective: Describe system functionalities from the user's perspective.

Elements:

  • Actor: User or external system
  • Use case: Offered functionality
  • Relationships: include (mandatory inclusion), extend (conditional extension), generalization

Example: Library System

Actors:

  • Reader (borrow book, browse catalog)
  • Librarian (register return, manage fines)
  • Administrator (add book, manage users)

Relationships:

  • "Borrow book" include "Check availability"
  • "Search book" extend "Filter by author"

Notation:

  • Actor: stick figure
  • Use case: ellipse with name
  • Relationships: arrows with stereotypes

3. Class Diagram

Objective: Describe the static structure of the system (classes, attributes, methods, relationships).

Class:

A class contains three compartments:

  • Class name
  • Attributes (visibility name : type)
  • Methods (visibility name(parameters) : return_type)

Visibilities:

  • + public (accessible everywhere)
  • - private (accessible only within the class)
  • # protected (accessible in the class and its subclasses)
  • ~ package (accessible within the package)

Example:

Book
--------------
- isbn : String
- title : String
- author : String
- available : Boolean
--------------
+ borrow() : Boolean
+ return() : void
+ isAvailable() : Boolean

Relationships between classes:

RelationshipSymbolMeaningExample
Associationsimple lineClasses know each otherReader --- Book
Aggregationempty diamond"Has" (part can exist alone)Library --- Book
Compositionfilled diamond"Composed of" (part tied to whole)Car --- Engine
Inheritanceempty triangle arrow"Is a"DigitalBook ---|> Book
Realizationdotted triangle arrowImplements interfaceConcreteClass ..|> Interface
Dependencydotted arrowUses temporarilyClient ...> Service

Multiplicities:

  • 1 : exactly one
  • 0..1 : zero or one
  • * : zero or many
  • 1..* : one or many
  • 2..5 : between 2 and 5

Complete example:

Library (1) --- (0..*) Book
Reader (1) --- (0..5) Loan
Loan (*) --- (1) Book

A reader can have a maximum of 5 simultaneous loans.

4. Object Diagram

Objective: Show concrete instances at a given point in time (snapshot).

Difference from class diagram:

  • Classes: general structure
  • Objects: particular instances with values

Example:

book1 : Book
- isbn = "978-2-1234"
- title = "Design Patterns"
- available = false

reader1 : Reader
- name = "Dupont"
- cardNumber = "12345"

loan1 : Loan
- loanDate = "2024-11-15"
- expectedReturnDate = "2024-12-15"

Usefulness: Validate the class diagram with concrete examples, illustrate complex configurations.

5. Sequence Diagram

Objective: Show interactions between objects over time (chronological order of messages).

Elements:

  • Lifelines: vertical lines representing objects
  • Messages: horizontal arrows between lifelines
  • Activation: rectangle on lifeline (active object)
  • Fragments: alt (alternative), loop (loop), opt (optional), par (parallel)

Message types:

  • Synchronous: solid arrow (caller waits for response)
  • Asynchronous: open arrow (caller continues without waiting)
  • Return: dotted arrow

Example: Borrowing a book

Reader -> Library : borrowBook(isbn)
Library -> Catalog : searchBook(isbn)
Catalog -> Library : book
alt book available
    Library -> Loan : createLoan(reader, book)
    Loan -> Book : markBorrowed()
    Library -> Reader : borrowConfirmation
else book unavailable
    Library -> Reader : errorMessage
end

Useful fragments:

  • alt: if/else (alternative branches)
  • loop: loop (condition and iteration)
  • opt: optional (executed if condition is true)
  • par: parallel (simultaneous execution)
  • ref: reference to another diagram

6. Activity Diagram

Objective: Model workflows, business processes, algorithms (similar to an enhanced flowchart).

Elements:

  • Initial node: filled black circle
  • Final node: black circle with surrounding circle
  • Activity: rounded rectangle
  • Decision: diamond (condition)
  • Fork/Join: horizontal bar (parallelism)
  • Swimlanes: partitions by actor/system

Example: Borrowing process

[Start]
|
Reader presents card
|
<Card valid?>
  No -> Refuse loan -> [End]
  Yes |
Scan book barcode
|
<Book available?>
  No -> Offer reservation -> [End]
  Yes |
Register loan
|
Print receipt
|
[End]

Parallelism with fork/join:

Fork (horizontal bar):
-> Activity A
-> Activity B (in parallel)

Join: synchronization (wait for both A and B to complete)

7. State Machine Diagram

Objective: Model the lifecycle of an object (possible states and transitions).

Elements:

  • State: rounded rectangle
  • Transition: arrow with triggering event
  • Initial state: black circle
  • Final state: black circle with surrounding circle
  • Actions: entry/ (on entry), do/ (during), exit/ (on exit)

Example: States of a book

[Initial]
|
Available
  entry/ displayAvailable()

Available --[borrow]--> Borrowed
  entry/ registerLoan()
  do/ decrementAvailability()

Borrowed --[return]--> Available
  exit/ releaseItem()

Borrowed --[exceed deadline]--> Overdue
  entry/ calculateFine()

Overdue --[return + pay fine]--> Available

Available --[remove from catalog]--> [Final]

Composite states:

A state can contain sub-states (hierarchy).

Concurrent states:

Multiple states active simultaneously (separated by dotted line).

8. Component and Deployment Diagrams

Component diagram:

Shows the software organization in modules/libraries with their dependencies.

Typical components:

  • User Interface (UI)
  • Business Logic
  • Data Access (DAO)
  • External libraries

Relationships:

  • Dependencies between components
  • Provided interfaces (circle) and required interfaces (half-circle)

Deployment diagram:

Shows the physical architecture (servers, networks, deployed artifacts).

Elements:

  • Nodes: hardware (server, PC, mobile)
  • Artifacts: deployed files (JAR, EXE, WAR)
  • Communications: protocols (HTTP, TCP, etc.)

Example:

Web Server
  - Apache Tomcat
  - Application.war

Database
  - MySQL Server
  - Library schema

Client Workstation
  - Web Browser
  - HTML/CSS/JS Interface

9. SOLID Design Principles

A set of 5 principles for creating maintainable and extensible code.

S - Single Responsibility Principle (SRP):

A class should have only one reason to change (a single responsibility).

Bad:

class Book
  + saveToDatabase()          // persistence responsibility
  + sendEmailNotification()   // notification responsibility

Good:

class Book
  // only book business logic

class BookRepository
  + save(book)

class NotificationService
  + sendEmail(recipient, message)

O - Open/Closed Principle (OCP):

Classes should be open for extension, closed for modification.

Use inheritance, composition, or interfaces to extend without modifying existing code.

L - Liskov Substitution Principle (LSP):

Objects of a derived class should be able to replace objects of the base class without altering behavior.

I - Interface Segregation Principle (ISP):

Several specific interfaces are better than one general interface.

Bad:

interface DocumentActions
  + print()
  + scan()
  + fax()

A simple printer must implement scan() and fax() even if it doesn't support them.

Good:

interface Printable
  + print()

interface Scannable
  + scan()

class SimplePrinter implements Printable
class MultifunctionPrinter implements Printable, Scannable

D - Dependency Inversion Principle (DIP):

Depend on abstractions (interfaces), not on concrete implementations.

Bad:

class Library
  private MySQLDatabase db  // concrete dependency

Good:

interface Database
  + save(data)
  + load(id)

class Library
  private Database db  // abstract dependency

class MySQLDatabase implements Database
class MongoDBDatabase implements Database

Allows easily switching databases without modifying Library.

10. Design Patterns

Proven solutions to recurring design problems.

Creational patterns: managing object creation

Singleton:

Guarantee a single instance of a class.

class ConfigurationManager
  private static instance : ConfigurationManager

  private ConfigurationManager()  // private constructor

  public static getInstance() : ConfigurationManager
    if instance == null
      instance = new ConfigurationManager()
    return instance

Usage: unique managers (configuration, logging, connection pool).

Factory Method:

Delegate object creation to subclasses.

abstract class DocumentFactory
  abstract createDocument() : Document

class PDFFactory extends DocumentFactory
  createDocument() : Document
    return new PDFDocument()

class WordFactory extends DocumentFactory
  createDocument() : Document
    return new WordDocument()

Abstract Factory:

Create families of related objects without specifying their concrete classes.

Structural patterns: organizing classes and objects

Adapter:

Convert the interface of a class into another expected interface.

interface MultimediaPlayer
  + play(file)

class MP3Player
  + playMP3(file)

class MP3Adapter implements MultimediaPlayer
  private mp3Player : MP3Player

  play(file)
    mp3Player.playMP3(file)

Decorator:

Dynamically add responsibilities to an object.

interface Coffee
  + cost() : double

class SimpleCoffee implements Coffee
  cost() : double
    return 2.0

class WithMilk implements Coffee
  private coffee : Coffee

  cost() : double
    return coffee.cost() + 0.5

class WithSugar implements Coffee
  private coffee : Coffee

  cost() : double
    return coffee.cost() + 0.2

Usage:

Coffee myCoffee = new WithMilk(new WithSugar(new SimpleCoffee()))
// cost = 2.0 + 0.2 + 0.5 = 2.7

Composite:

Compose objects into tree structures (treat individual objects and compositions uniformly).

Behavioral patterns: interactions between objects

Observer:

Automatically notify objects when a state change occurs.

interface Observer
  + update(subject)

class Subject
  private observers : List<Observer>

  + attach(observer)
    observers.add(observer)

  + notify()
    for each observer in observers
      observer.update(this)

class TemperatureDisplay implements Observer
  update(subject)
    temperature = subject.getTemperature()
    display(temperature)

Usage: graphical interfaces (MVC), event-driven systems.

Strategy:

Encapsulate interchangeable algorithms.

interface FineCalculationStrategy
  + calculate(daysOverdue) : double

class StandardFine implements FineCalculationStrategy
  calculate(daysOverdue) : double
    return daysOverdue * 0.5

class StudentFine implements FineCalculationStrategy
  calculate(daysOverdue) : double
    return daysOverdue * 0.2

class LoanManager
  private strategy : FineCalculationStrategy

  setStrategy(strategy)
    this.strategy = strategy

  calculateFine(daysOverdue)
    return strategy.calculate(daysOverdue)

Command:

Encapsulate a request as an object.

Enables: undo, command queues, logging.

State:

Modify an object's behavior according to its internal state.

Template Method:

Define the skeleton of an algorithm; subclasses redefine certain steps.

11. From UML to Code

Forward Engineering: generate code from UML diagrams.

Tools:

  • Enterprise Architect (Java, C++, C#, Python generation)
  • StarUML (basic code generation)
  • PlantUML + custom scripts

Example: class diagram -> Java classes with attributes and method signatures (skeletons).

Reverse Engineering: generate UML diagrams from existing code.

Useful for:

  • Documenting legacy code
  • Analyzing an unknown codebase
  • Maintaining code/documentation consistency

Round-trip Engineering: bidirectional code / UML synchronization.

Code modifications reflected in diagrams and vice versa.

In practice: difficult to maintain, requires discipline and appropriate tooling.

12. Modeling Tools

ToolTypeAdvantagesDisadvantages
Enterprise ArchitectCommercialComplete, code generation, collaborationExpensive, complex interface
StarUMLOpen-source/CommercialIntuitive interface, lightweightLimited features in free version
PlantUMLOpen-sourceText-based, CI/CD integration, versioningSyntax learning curve
LucidchartWebCollaborative, easyLimited free version
draw.ioWeb/OpenFree, simpleNot specialized for UML
Visual ParadigmCommercialPowerful, training includedExpensive

Personal recommendation:

  • Personal projects: PlantUML (versionable with Git)
  • Enterprise: Enterprise Architect or Visual Paradigm
  • Quick collaboration: Lucidchart or Miro

PART D - Reflective Analysis and Perspectives

Skills Acquired

Modeling and abstraction:

Ability to analyze a complex problem and decompose it into modelable entities, relationships and behaviors.

Technical communication:

UML provides a universal language for communicating architectures between developers, project managers, and clients.

Anticipation and planning:

Designing before implementing allows identifying architecture problems early, reducing refactoring costs.

Software quality:

Applying SOLID principles and patterns produces more maintainable, testable and extensible code.

Completed Project: Library Management System

Context:

Complete design of a multimedia library system (books, DVDs, periodicals) with loan management, reservations, fines, and users.

Deliverables:

  • Use case diagram (12 cases, 4 actors)
  • Complete class diagram (35+ classes)
  • Sequence diagrams (borrow, return, reserve, pay fine)
  • State diagrams (book lifecycle, loan)
  • Activity diagram (complete borrowing process)
  • Java prototype with applied patterns

Patterns used:

  • Singleton: LibraryManager (single instance)
  • Factory: DocumentFactory to create Book, DVD, Periodical
  • Observer: availability notification for reservations
  • Strategy: fine calculation by user type (standard, student, teacher)
  • State: loan state management (in progress, overdue, completed)

Results:

Clear and extensible architecture. Adding new document types or new fine rules was easy thanks to patterns. Well-structured code with separation of responsibilities.

Key Takeaways

1. UML = tool, not objective:

The goal is good design, not beautiful diagrams. Use UML pragmatically.

2. Not all diagrams are necessary:

Identify those that add value depending on the context (class and sequence often suffice).

3. SOLID before patterns:

Understanding and applying SOLID is more important than knowing all patterns.

4. Patterns = solutions, not magic recipes:

Do not force the use of a pattern. Apply it only if the problem matches.

5. Living documentation:

Documentation must evolve with the code, otherwise it becomes obsolete and misleading.

Experience Feedback

Learning curve:

UML seemed complex initially (14 diagrams, specific notations). With practice, one quickly identifies the 5-6 essential diagrams.

Link with OOP:

This course strengthened my understanding of OOP beyond syntax. Concepts like encapsulation, abstraction, and polymorphism became concrete.

Application in projects:

Using UML on real projects (even simplified ones) proved its usefulness. Time savings and fewer bugs thanks to upfront thinking.

Facilitated collaboration:

Working as a team with UML as a common language greatly improved communication and reduced misunderstandings.

Practical Applications

Software development:

  • Enterprise applications (ERP, CRM)
  • Embedded systems (modeling critical states and sequences)
  • Web applications (MVC/MVVM architecture)

Refactoring:

Reverse engineering of legacy code, identifying problems (tight coupling, mixed responsibilities), then SOLID-guided refactoring.

Documentation:

Automatically generate technical documentation from UML diagrams. Integration into enterprise wikis.

Client communication:

Use case and activity diagrams understandable by non-developers to validate requirements.

Limitations and Criticisms

Heavy and verbose UML:

Creating and maintaining all diagrams takes time. Agile approach prefers "lightweight UML" (a few key diagrams).

Documentation/code gap:

Without discipline or synchronization tools, diagrams quickly become obsolete.

Over-engineering:

Risk of creating overly complex architectures, with too many patterns, for simple problems.

Modern alternatives:

  • C4 Model: pragmatic architectural documentation (Context, Containers, Components, Code)
  • Architecture Decision Records (ADR): documenting decisions rather than diagrams
  • Living Documentation: tests and code as documentation

Evolutions and Perspectives

Domain-Driven Design (DDD):

Business domain-centered approach. Uses UML but adds concepts (Entities, Value Objects, Aggregates, Repositories).

SysML:

UML extension for systems engineering (not just software). Used in aerospace, automotive, defense.

Modern tools:

  • Automatic diagram generation from code (Doxygen, Javadoc UML)
  • Documentation as Code (PlantUML in Markdown, Git versioning)
  • Real-time collaboration (Miro, Lucidchart, Figma for UML)

Artificial Intelligence:

AI generating UML diagrams from text descriptions, automatic detection of SOLID violations, pattern suggestions.

Tips for Success

1. Practice on concrete projects:

Model real systems (e-commerce, social network, game) rather than abstract exercises.

2. Start simple:

Begin with class and sequence diagrams. Add other types as needed.

3. Validate with code:

Implement designs to verify their consistency and feasibility.

4. Study open-source code:

Analyze the architecture of popular projects (Spring Framework, Apache Commons) to see SOLID and patterns in practice.

5. Iterate:

Design is never perfect on the first try. Revise and improve as you go.

Conclusion

This module provides an essential methodology for designing robust and maintainable software systems. Beyond UML syntax, it is the object-oriented design principles (SOLID) and patterns that constitute the major contribution.

Transferable skills:

  • Architectural and abstract thinking
  • Design before implementation
  • Effective technical communication
  • Professional quality code

Professional relevance:

In the workplace, design and documentation are expected, especially for critical or regulated projects. Knowing how to model and justify architecture choices is a major asset.

Key message:

UML is one tool among many. The essential thing is to develop a structured design approach, applicable regardless of the formalism. SOLID principles and patterns are universal and transcend languages and tools.

Recommendations:

  • Use UML pragmatically (avoid dogmatism)
  • Prioritize diagrams that add value
  • Keep documentation up to date (automate if possible)
  • Continue learning advanced patterns and architectures (microservices, event-driven)
  • Explore DDD to deepen business modeling

Links with other courses:


Course Documents

Design and Architecture Course

Complete UML course: class diagrams, sequence diagrams, use cases, design patterns and SOLID principles.

Download

Tutorial Subject

Tutorials on object-oriented design: modeling of embedded systems and software architectures.

Download


Course taken in 2023-2024 at INSA Toulouse, Department of Electrical Engineering and Computer Science.