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
-
Clean Code
- Refactorisez du code existant
- Améliorez les noms
- Raccourcissez les méthodes
-
Conventions
- Appliquez les conventions Dart
- Organisez vos classes
- Respectez le nommage
-
Organisation
- Organisez en packages/modules
- Séparez les responsabilités
- Créez une structure claire
-
Documentation
- Ajoutez dartdoc à vos classes
- Générez la documentation
- Vérifiez le résultat
-
Linting
- Configurez analysis_options.yaml
- Exécutez dart analyze
- Corrigez les warnings
Quiz
-
Quelle convention pour les classes ?
- camelCase
- PascalCase
- UPPER_CASE
-
Comment rendre une variable privée ?
- private
- Commencer par _
- protected
-
Que signifie DRY ?
- Don't Repeat Yourself
- Don't Repeat Yourself
- Do Repeat Yourself
-
Que fait dart format ?
- Compile le code
- Formate le code selon conventions
- Exécute le code
-
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 :
- Clean Code (noms, méthodes courtes, DRY)
- Conventions Dart (nommage, structure)
- Organisation (packages, séparation responsabilités)
- Documentation dartdoc complète
- 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.