💻 Développement

dev-design-patterns-advisor

Conseille le pattern de conception adapté à un problème donné.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-design-patterns-advisor --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-design-patterns-advisor -Launch"

🚀 Déjà installé ?

claude "/dev-design-patterns-advisor"

Ou tapez /dev-design-patterns-advisor dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

design patternquel patternsingletonfactoryobserverstrategySOLIDpattern adapté

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-design-patterns-advisor ~/.claude/skills/

Payload du plugin : skills/dev-design-patterns-advisor · source éditable : dev-skills/design-patterns-advisor

📖 Manuel

Design Patterns Advisor

Workflow

  1. Qualifier le problème — poser 1-2 questions précises sur la douleur actuelle : couplage fort ? code dupliqué ? difficile à tester ? trop de if/switch ? besoin d'extension sans modification ?
  2. Classifier le besoin — mapper sur la bonne famille :
    • Création : instanciation complexe, cache d'instances, familles d'objets
    • Structure : adapter une interface, décorer un comportement, encapsuler une hiérarchie
    • Comportement : algorithmes interchangeables, notifications, état interne variable
    • Architectural : séparation UI/logique, CQRS, pipeline de traitement
  3. Proposer 2-3 candidats avec critères de décision (voir tableau ci-dessous) — pas de liste exhaustive, uniquement ceux pertinents
  4. Implémenter le pattern recommandé dans le langage du projet — code complet, copiable, commenté
  5. Montrer l'avant/après — mettre en évidence les gains mesurables (testabilité, lignes supprimées, points d'extension)
  6. Signaler les garde-fous — cas où le pattern est inutile ou contre-productif
  7. Relier aux principes SOLID concernés — expliquer le lien de façon pratique

Critères de décision rapide

Symptôme du codeFamillePatterns à considérer
new ConcreteClass() éparpilléCréationFactory Method, Abstract Factory, Builder
Une seule instance globale nécessaireCréationSingleton (avec précaution), Monostate
Interfaces incompatiblesStructureAdapter, Facade
Ajout de comportement sans héritageStructureDecorator, Proxy
Plusieurs algorithmes interchangeablesComportementStrategy, Command
Couplage fort entre producteur/consommateurComportementObserver, Mediator, Event Bus
État interne qui change le comportementComportementState
Pipeline de transformationsComportementChain of Responsibility, Pipeline
Logique métier + UI mélangéesArchitecturalMVC, MVP, MVVM, Clean Architecture
Lecture/écriture asymétriquesArchitecturalCQRS, Repository

Exemples concrets par pattern

Strategy — algorithmes interchangeables

Avant (if/switch ingérable) :

// Ajout d'une méthode = modifier cette classe
public decimal CalculateFee(string type, decimal amount) {
    if (type == "standard") return amount * 0.02m;
    else if (type == "premium") return amount * 0.01m;
    else if (type == "corporate") return amount * 0.005m;
    throw new ArgumentException();
}

Après (Strategy) :

public interface IFeeStrategy { decimal Calculate(decimal amount); }

public class StandardFee : IFeeStrategy { public decimal Calculate(decimal amount) => amount * 0.02m; }
public class PremiumFee  : IFeeStrategy { public decimal Calculate(decimal amount) => amount * 0.01m; }
public class CorporateFee: IFeeStrategy { public decimal Calculate(decimal amount) => amount * 0.005m; }

public class FeeCalculator(IFeeStrategy strategy) {
    public decimal Calculate(decimal amount) => strategy.Calculate(amount);
}
// Extension = nouvelle classe, zéro modification existante (OCP)

Observer — découplage producteur/consommateur

// Implémentation légère sans dépendance externe
type Handler<T> = (payload: T) => void;

class EventBus<T> {
    private handlers: Handler<T>[] = [];
    subscribe(h: Handler<T>) { this.handlers.push(h); }
    publish(payload: T) { this.handlers.forEach(h => h(payload)); }
}

const orderBus = new EventBus<{ orderId: string; amount: number }>();
orderBus.subscribe(({ orderId }) => console.log(`Email confirmation ${orderId}`));
orderBus.subscribe(({ amount }) => updateStats(amount));
orderBus.publish({ orderId: "123", amount: 500 });

Decorator — enrichissement sans héritage

from functools import wraps

def retry(max_attempts=3):
    def decorator(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return fn(*args, **kwargs)
                except Exception as e:
                    if attempt == max_attempts - 1:
                        raise
        return wrapper
    return decorator

@retry(max_attempts=3)
def call_external_api(url: str) -> dict:
    ...  # logique inchangée

Factory Method — instanciation déléguée

// Contexte : création de parsers selon le format de fichier
public interface DocumentParser { Document parse(InputStream in); }

public class ParserFactory {
    public static DocumentParser create(String contentType) {
        return switch (contentType) {
            case "application/pdf"  -> new PdfParser();
            case "text/csv"         -> new CsvParser();
            case "application/json" -> new JsonParser();
            default -> throw new UnsupportedFormatException(contentType);
        };
    }
}
// Ajout d'un format = nouvelle classe + 1 ligne dans le switch

Repository — abstraction de la persistance

public interface IOrderRepository {
    Task<Order?> FindById(Guid id);
    Task<IEnumerable<Order>> FindByStatus(OrderStatus status);
    Task Save(Order order);
}

// Implémentation swappable : EF Core, Dapper, mock pour tests
public class EfOrderRepository(AppDbContext ctx) : IOrderRepository {
    public async Task<Order?> FindById(Guid id) => await ctx.Orders.FindAsync(id);
    public async Task Save(Order order) { ctx.Orders.Add(order); await ctx.SaveChangesAsync(); }
    // ...
}

Garde-fous et anti-patterns


Principes SOLID associés

PrincipePatterns qui l'expriment directement
S — Single ResponsibilityFacade, Command, Repository
O — Open/ClosedStrategy, Decorator, Factory Method
L — Liskov SubstitutionTemplate Method, Strategy
I — Interface SegregationAdapter, Proxy
D — Dependency InversionFactory, Abstract Factory, Repository, tous les patterns à base d'interface

Bonnes pratiques 2026

```bash dotnet test --no-build # .NET npx jest --runInBand # Node/TS pytest -x # Python ```