Aller au contenu principal

Module Dart.10 – Bonnes pratiques

Objectif

Appliquer les bonnes pratiques Dart : Clean Code, conventions de nommage, organisation de projet, et patterns pour créer du code professionnel et maintenable.

Théorie

Clean Dart

Noms clairs et descriptifs

// ❌ Mauvais
int d;
String s;
void calc() {}

// ✅ Bon
int nombreJours;
String nomUtilisateur;
void calculerMoyenne() {}

Fonctions courtes et focalisées

// ❌ Mauvais : fait trop de choses
void traiterDonnees() {
// Validation
// Transformation
// Sauvegarde
// Envoi email
// ...
}

// ✅ Bon : une responsabilité
void validerDonnees() {}
void transformerDonnees() {}
void sauvegarderDonnees() {}

DRY (Don't Repeat Yourself)

// ❌ Répétition
void afficherNom1() {
print('Nom : $nom');
}
void afficherNom2() {
print('Nom : $nom');
}

// ✅ Réutilisable
void afficherNom() {
print('Nom : $nom');
}

Commentaires utiles

// ❌ Mauvais : explique le "comment"
// Incrémente i de 1
i++;

// ✅ Bon : explique le "pourquoi"
// Réinitialise le compteur pour le prochain lot
i = 0;

Conventions Dart

Nommage

  • Classes : PascalCase (Personne, GestionnaireUtilisateurs)
  • Variables/Méthodes : camelCase (calculerMoyenne, nomUtilisateur)
  • Constantes : lowerCamelCase ou UPPER_SNAKE_CASE (maxSize, MAX_SIZE)
  • Privé : Commence par _ (_age, _calculer())

Structure de classe

class MaClasse {
// 1. Constantes
static const int maxSize = 100;

// 2. Variables statiques
static int count = 0;

// 3. Variables d'instance
String nom;
int _age;

// 4. Constructeurs
MaClasse(this.nom);

// 5. Méthodes (getters/setters puis autres)
int get age => _age;

void afficher() {
// Code
}
}

Organisation de projet

Structure recommandée

mon_projet/
├── lib/
│ ├── main.dart
│ ├── models/
│ │ └── personne.dart
│ ├── services/
│ │ └── personne_service.dart
│ ├── controllers/
│ │ └── personne_controller.dart
│ └── utils/
│ └── helpers.dart
├── test/
│ └── test_personne.dart
├── pubspec.yaml
└── README.md

pubspec.yaml

Fichier de configuration du projet.

name: mon_projet
description: Description du projet
version: 1.0.0

dependencies:
http: ^1.1.0

dev_dependencies:
test: ^1.21.0

Documentation (dartdoc)

/// Classe représentant une personne
///
/// Exemple d'utilisation :
/// ```dart
/// var personne = Personne('Jean', 30);
/// personne.saluer();
/// ```
class Personne {
/// Nom de la personne
final String nom;

/// Constructeur
///
/// [nom] Le nom de la personne
/// [age] L'âge (doit être > 0)
///
/// Throws [ArgumentError] si age <= 0
Personne(this.nom, int age) : _age = age {
if (age <= 0) {
throw ArgumentError('Age doit être > 0');
}
}
}

Génération :

dart doc

Patterns Dart

Singleton

class Configuration {
static Configuration? _instance;

Configuration._(); // Constructeur privé

factory Configuration() {
_instance ??= Configuration._();
return _instance!;
}
}

// Utilisation
var config = Configuration();

Factory

class PersonneFactory {
static Personne creerEtudiant(String nom, int age, String ecole) {
return Etudiant(nom, age, ecole);
}

static Personne creerProfesseur(String nom, int age, String matiere) {
return Professeur(nom, age, matiere);
}
}

Builder

class PersonneBuilder {
String? nom;
int? age;
String? ville;

PersonneBuilder nom(String nom) {
this.nom = nom;
return this;
}

PersonneBuilder age(int age) {
this.age = age;
return this;
}

Personne build() {
return Personne(nom!, age!, ville);
}
}

// Utilisation
var p = PersonneBuilder()
.nom('Jean')
.age(30)
.build();

Linting

analysis_options.yaml :

linter:
rules:
- prefer_const_constructors
- prefer_final_fields
- avoid_print
- prefer_single_quotes

Analyse :

dart analyze

Formatage

Format automatique :

dart format .

Configuration : Respecte les conventions Dart automatiquement.

Exercice

  1. Clean Code

    • Refactorisez du code existant
    • Améliorez les noms
    • Raccourcissez les méthodes
  2. Conventions

    • Appliquez les conventions Dart
    • Organisez vos classes
    • Respectez le nommage
  3. Organisation

    • Organisez en packages/modules
    • Séparez les responsabilités
    • Créez une structure claire
  4. Documentation

    • Ajoutez dartdoc à vos classes
    • Générez la documentation
    • Vérifiez le résultat
  5. Linting

    • Configurez analysis_options.yaml
    • Exécutez dart analyze
    • Corrigez les warnings

Quiz

  1. Quelle convention pour les classes ?

    • camelCase
    • PascalCase
    • UPPER_CASE
  2. Comment rendre une variable privée ?

    • private
    • Commencer par _
    • protected
  3. Que signifie DRY ?

    • Don't Repeat Yourself
    • Don't Repeat Yourself
    • Do Repeat Yourself
  4. Que fait dart format ?

    • Compile le code
    • Formate le code selon conventions
    • Exécute le code
  5. Où se trouve la configuration du projet ?

    • package.json
    • pubspec.yaml
    • config.yaml

Mini défi

Mission : Refactoriser un projet selon les bonnes pratiques

Prenez un projet Dart existant et refactorisez-le :

Améliorations :

  1. Clean Code (noms, méthodes courtes, DRY)
  2. Conventions Dart (nommage, structure)
  3. Organisation (packages, séparation responsabilités)
  4. Documentation dartdoc complète
  5. Linting et formatage

Critères :

  • ✅ Code propre et lisible
  • ✅ Conventions respectées
  • ✅ Documentation complète
  • ✅ Structure professionnelle

Objectif : Appliquer toutes les bonnes pratiques pour créer du code professionnel.


Validation : Vous pouvez passer au module suivant quand votre code respecte les bonnes pratiques.