🚀 B2.6 - Projets d'Applications C
📋 Objectifs du cours
À la fin de ce cours, vous serez capable de : - ✅ Concevoir une application avec UML - ✅ Structurer un projet C# professionnel - ✅ Implémenter des applications complètes - ✅ Appliquer les bonnes pratiques de développement - ✅ Gérer les erreurs et la validation - ✅ Créer des interfaces utilisateur simples
📐 Introduction à UML
Unified Modeling Language (UML)
UML est un langage de modélisation graphique qui permet de concevoir et documenter des systèmes logiciels. Il aide à visualiser la structure et le comportement d'une application avant de la développer.
🎯 Diagrammes UML essentiels :
- Diagramme de classes : Structure des classes et leurs relations
- Diagramme de cas d'usage : Fonctionnalités du système
- Diagramme de séquence : Interactions entre objets
- Diagramme d'activité : Flux de travail et processus
📊 Diagramme de classes
Exemple : Système de gestion de bibliothèque
┌─────────────────────────┐
│ Document │
├─────────────────────────┤
│ - titre: string │
│ - auteur: string │
│ - anneePublication: int │
│ - estEmprunte: bool │
├─────────────────────────┤
│ + Emprunter(): bool │
│ + Retourner(): void │
│ + AfficherInfos(): void │
└─────────────────────────┘
△
│
┌───────┴───────┐
│ │
┌───▽───────┐ ┌───▽──────┐
│ Livre │ │ Magazine │
├────────────┤ ├──────────┤
│ - isbn │ │ - numero │
│ - pages │ │ - period │
├────────────┤ ├──────────┤
│ + Lire() │ │ + Lire() │
└────────────┘ └──────────┘
┌─────────────────────────┐
│ Utilisateur │
├─────────────────────────┤
│ - nom: string │
│ - email: string │
│ - documentsEmpruntes │
├─────────────────────────┤
│ + EmprunterDocument() │
│ + RetournerDocument() │
└─────────────────────────┘
│
│ 1..*
▽
┌─────────────────────────┐
│ Emprunt │
├─────────────────────────┤
│ - dateEmprunt: DateTime │
│ - dateRetour: DateTime │
│ - document: Document │
├─────────────────────────┤
│ + CalculerRetard(): int │
│ + CalculerAmende(): dec │
└─────────────────────────┘
🎯 Projet 1 : Gestionnaire de Tâches
📝 Description du projet
Créer une application console pour gérer des tâches personnelles avec : - Création, modification, suppression de tâches - Catégorisation et priorités - Suivi des échéances - Sauvegarde en fichier JSON📐 Conception UML
Diagramme de classes - Gestionnaire de Tâches
┌─────────────────────────┐
│ Tache │
├─────────────────────────┤
│ - id: int │
│ - titre: string │
│ - description: string │
│ - dateCreation: DateTime│
│ - dateEcheance: DateTime│
│ - estTerminee: bool │
│ - priorite: Priorite │
│ - categorie: Categorie │
├─────────────────────────┤
│ + Terminer(): void │
│ + ModifierTitre(): void │
│ + EstEnRetard(): bool │
│ + AfficherDetails(): void│
└─────────────────────────┘
│
│ *
▽
┌─────────────────────────┐
│ GestionnaireTaches │
├─────────────────────────┤
│ - taches: List<Tache> │
│ - prochainId: int │
├─────────────────────────┤
│ + AjouterTache(): void │
│ + SupprimerTache(): bool│
│ + ListerTaches(): void │
│ + FiltrerParCategorie() │
│ + SauvegarderFichier() │
│ + ChargerFichier(): void│
└─────────────────────────┘
┌─────────────────┐ ┌─────────────────┐
│ Priorite │ │ Categorie │
├─────────────────┤ ├─────────────────┤
│ + Basse │ │ + Travail │
│ + Normale │ │ + Personnel │
│ + Haute │ │ + Urgent │
│ + Critique │ │ + Loisir │
└─────────────────┘ └─────────────────┘
💻 Implémentation
```csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
// Énumérations
public enum Priorite
{
Basse = 1,
Normale = 2,
Haute = 3,
Critique = 4
}
public enum Categorie
{
Travail,
Personnel,
Urgent,
Loisir,
Etudes,
Sante
}
// Classe Tache
public class Tache
{
public int Id { get; set; }
public string Titre { get; set; }
public string Description { get; set; }
public DateTime DateCreation { get; set; }
public DateTime? DateEcheance { get; set; }
public bool EstTerminee { get; set; }
public Priorite Priorite { get; set; }
public Categorie Categorie { get; set; }
public Tache()
{
DateCreation = DateTime.Now;
EstTerminee = false;
Priorite = Priorite.Normale;
}
public Tache(string titre, string description, Categorie categorie, Priorite priorite = Priorite.Normale)
{
Titre = titre;
Description = description;
Categorie = categorie;
Priorite = priorite;
DateCreation = DateTime.Now;
EstTerminee = false;
}
public void Terminer()
{
EstTerminee = true;
Console.WriteLine($"✅ Tâche '{Titre}' marquée comme terminée !");
}
public void ModifierTitre(string nouveauTitre)
{
string ancienTitre = Titre;
Titre = nouveauTitre;
Console.WriteLine($"📝 Titre modifié : '{ancienTitre}' → '{nouveauTitre}'");
}
public bool EstEnRetard()
{
return DateEcheance.HasValue &&
DateTime.Now > DateEcheance.Value &&
!EstTerminee;
}
public void AfficherDetails()
{
Console.WriteLine($"\n📋 Tâche #{Id}");
Console.WriteLine($" Titre : {Titre}");
Console.WriteLine($" Description : {Description}");
Console.WriteLine($" Catégorie : {Categorie}");
Console.WriteLine($" Priorité : {Priorite}");
Console.WriteLine($" Créée le : {DateCreation:dd/MM/yyyy HH:mm}");
if (DateEcheance.HasValue)
{
Console.WriteLine($" Échéance : {DateEcheance:dd/MM/yyyy HH:mm}");
if (EstEnRetard())
Console.WriteLine(" ⚠️ EN RETARD !");
}
Console.WriteLine($" Statut : {(EstTerminee ? "✅ Terminée" : "⏳ En cours")}");
}
public string ObtenirIconePriorite()
{
return Priorite switch
{
Priorite.Basse => "🟢",
Priorite.Normale => "🟡",
Priorite.Haute => "🟠",
Priorite.Critique => "🔴",
_ => "⚪"
};
}
}
// Classe GestionnaireTaches
public class GestionnaireTaches
{
private List taches;
private int prochainId;
private const string FICHIER_SAUVEGARDE = "taches.json";
public GestionnaireTaches()
{
taches = new List();
prochainId = 1;
ChargerFichier();
}
public void AjouterTache(string titre, string description, Categorie categorie,
Priorite priorite = Priorite.Normale, DateTime? echeance = null)
{
if (string.IsNullOrWhiteSpace(titre))
{
Console.WriteLine("❌ Le titre ne peut pas être vide !");
return;
}
var nouvelleTache = new Tache(titre, description, categorie, priorite)
{
Id = prochainId++,
DateEcheance = echeance
};
taches.Add(nouvelleTache);
Console.WriteLine($"✅ Tâche '{titre}' ajoutée avec succès !");
SauvegarderFichier();
}
public bool SupprimerTache(int id)
{
var tache = taches.FirstOrDefault(t => t.Id == id);
if (tache == null)
{
Console.WriteLine($"❌ Aucune tâche trouvée avec l'ID {id}");
return false;
}
taches.Remove(tache);
Console.WriteLine($"🗑️ Tâche '{tache.Titre}' supprimée");
SauvegarderFichier();
return true;
}
public void ListerTaches(bool afficherTerminees = true)
{
var tachesAfficher = afficherTerminees ?
taches : taches.Where(t => !t.EstTerminee).ToList();
if (!tachesAfficher.Any())
{
Console.WriteLine("📭 Aucune tâche à afficher");
return;
}
Console.WriteLine("\n📋 LISTE DES TÂCHES");
Console.WriteLine("==================");
foreach (var tache in tachesAfficher.OrderBy(t => t.EstTerminee)
.ThenByDescending(t => t.Priorite)
.ThenBy(t => t.DateEcheance))
{
string statut = tache.EstTerminee ? "✅" : "⏳";
string retard = tache.EstEnRetard() ? " ⚠️" : "";
string echeance = tache.DateEcheance?.ToString("dd/MM") ?? "Sans échéance";
Console.WriteLine($"{statut} #{tache.Id:D2} {tache.ObtenirIconePriorite()} " +
$"{tache.Titre} ({tache.Categorie}) - {echeance}{retard}");
}
}
public void FiltrerParCategorie(Categorie categorie)
{
var tachesFiltrees = taches.Where(t => t.Categorie == categorie).ToList();
Console.WriteLine($"\n📂 Tâches de la catégorie : {categorie}");
Console.WriteLine("=====================================");
if (!tachesFiltrees.Any())
{
Console.WriteLine("📭 Aucune tâche dans cette catégorie");
return;
}
foreach (var tache in tachesFiltrees)
{
tache.AfficherDetails();
}
}
public void AfficherStatistiques()
{
int total = taches.Count;
int terminees = taches.Count(t => t.EstTerminee);
int enRetard = taches.Count(t => t.EstEnRetard());
int critiques = taches.Count(t => t.Priorite == Priorite.Critique && !t.EstTerminee);
Console.WriteLine("\n📊 STATISTIQUES");
Console.WriteLine("================");
Console.WriteLine($"Total des tâches : {total}");
Console.WriteLine($"Terminées : {terminees} ({(total > 0 ? (terminees * 100.0 / total):0):F1}%)");
Console.WriteLine($"En retard : {enRetard}");
Console.WriteLine($"Critiques en cours : {critiques}");
if (total > 0)
{
var categorieStats = taches.GroupBy(t => t.Categorie)
.Select(g => new { Categorie = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
Console.WriteLine("\nRépartition par catégorie :");
foreach (var stat in categorieStats)
{
Console.WriteLine($" {stat.Categorie} : {stat.Count}");
}
}
}
public Tache ObtenirTache(int id)
{
return taches.FirstOrDefault(t => t.Id == id);
}
public void SauvegarderFichier()
{
try
{
var json = JsonConvert.SerializeObject(taches, Formatting.Indented);
File.WriteAllText(FICHIER_SAUVEGARDE, json);
}
catch (Exception ex)
{
Console.WriteLine($"❌ Erreur lors de la sauvegarde : {ex.Message}");
}
}
public void ChargerFichier()
{
try
{
if (File.Exists(FICHIER_SAUVEGARDE))
{
var json = File.ReadAllText(FICHIER_SAUVEGARDE);
taches = JsonConvert.DeserializeObject
- >(json) ?? new List