Je vous propose de nous concentrer aujourd'hui sur 4 Design Patterns incontournables que j'utilise au quotidien !
Vous utilisez probablement des Proxys sans même le savoir. Imaginez un intermédiaire capable de gérer, enrichir ou sécuriser les interactions entre un client et un service :
Exemples concrets :
Voici une illustration du fonctionnement qu'un Proxy peut avoir lorsque l'on souhaite mettre automatiquement en cache des retours de fonction :
Imaginez : au lieu de vérifier en boucle si votre pizza est prête, votre four vous envoie un message. C'est exactement ce que fait le pattern Observer : il notifie automatiquement vos applications des changements !
Avantages :
Applications pratiques :
Attention : Pensez bien à vous désabonner quand un Observateur n'est plus nécessaire pour éviter les fuites mémoire !
type Observer = (message: string) => void;
class Subject {
private observers: Observer[] = [];
addObserver(observer: Observer): void {
this.observers.push(observer);
}
removeObserver(observer: Observer): void {
this.observers = this.observers.filter(obs => obs !== observer);
}
notify(message: string): void {
this.observers.forEach(observer => observer(message));
}
}
const observer: Observer = (message: string) => console.log(`Received message : ${message}`);
subject.addObserver(observer);
subject.notify('IMPORTANT MESSAGE TO SHARE');
subject.removeObserver(observer);
Le Strategy Pattern brille par sa simplicité : il permet d'implémenter plusieurs variantes d'un comportement, sans alourdir votre code avec des conditions complexes.
Principes clés :
Exemple :
Plutôt que d'avoir un switch interminable dans une classe, choisissez dynamiquement la méthode adaptée en fonction du contexte. Cela améliore la lisibilité, la maintenance et la réutilisabilité de votre code.
// Interface Strategy : définit une méthode commune pour toutes les stratégies
interface Strategy {
void execute();
}
// Implémentation 1 : Stratégie A
class StrategyA implements Strategy {
public void execute() {
console.log("Exécution de la stratégie A");
}
}
// Implémentation 2 : Stratégie B
class StrategyB implements Strategy {
public void execute() {
console.log("Exécution de la stratégie B");
}
}
// Contexte : utilise une stratégie sans connaître son implémentation concrète
class Context {
private Strategy strategy;
constructor(private readonly strategy: Strategy) {}
// La méthode 'apply' appelle la méthode 'execute' de la stratégie actuelle
// Avantage : le contexte n'a pas besoin de savoir quelle est l'implémentation utilisée.
// Il se contente d'utiliser la méthode 'execute()' définie par l'interface.
public void apply() {
this.strategy.execute();
}
}
Le Singleton est un design pattern simple mais puissant, idéal pour garantir qu'une classe donnée n'a qu'une seule instance partagée dans l'ensemble d'un projet.
Quand utiliser le Singleton ?
Singleton et Scopes en développement
Le Singleton est souvent mentionné aux côtés d'autres scopes dans des frameworks modernes comme .NET ou NestJS. Voici un aperçu des trois principaux scopes :
Attention !
Le Singleton peut devenir un anti-pattern s'il est mal utilisé. Sur des projets complexes, il peut introduire des dépendances cachées difficiles à maintenir. Soyez vigilant !
public class Singleton {
private static Singleton _instance;
// Si _instance est différent de null on le retourne
// Sinon on crée une nouvelle instance
public static Singleton Instance => _instance ??= new Singleton();
// Constructeur privé pour empêcher l'instanciation directe
private Singleton() { }
public void DoSomething() {
Console.WriteLine("Singleton en action !");
}
}
// Exemple d'utilisation
class Program {
static void Main() {
Singleton.Instance.DoSomething();
}
}
Maîtriser les Design Patterns, c'est comme apprendre une langue universelle pour le développement. Cela vous rend plus efficace, améliore la qualité de vos projets et renforce votre collaboration avec vos équipes.
Mais si j'ai un conseil à vous donner, soyez curieux ! Je viens de vous montrer 4 design patterns incontournables à mes yeux, mais il en existe encore plein d'autres ! Et, même si vous ne les utilisez pas au quotidien, c'est important de les connaître. Cela permet d'avoir toute une palette d'outils pour répondre aux nombreuses problématiques que vous rencontrerez dans votre vie de développeur (et on le sait, elles sont nombreuses !).
Bon après, vous n'allez pas tout résoudre avec des Design Patterns, mais c'est une très bonne base de réflexion :) Maintenant, à vous de savoir quand il est pertinent de les utiliser sur vos projets !
Découvrez la planche #18 !
Très populaires dans le monde du développement web et de l’IT, les termes de "méthode agile” ou encore "scrum” font référence à des notions de gestion de projets qui s’opposent aux méthodes traditionnelles telles que le cycle en V ou la méthode en cascade. Mais quelles sont les différences entre l’agilité et le scrum ? Quels sont les avantages des méthodes agiles ? On va vous aider à y voir un peu plus clair dans cet article, notamment en mettant en avant les différences et les similarités entre l’agilité et le scrum. Nous vous donnerons également notre retour d’expérience sur le sujet en tant qu’entreprise de développement informatique. C’est parti !
Glide, c’est quoi ? Définition, implémentation et retour d’expériences sur la meilleure librairie Android de chargement d’images distantes ou locales !