Chapitre 22
Chapitre 22 — Livres Fondamentaux pour le Front-End
Chapitre 22 — Livres Fondamentaux pour le Front-End
Chapitre 22 — Livres : Cours Complet
Introduction
La lecture technique est un investissement à long terme. Ces 10 livres ont façonné la manière dont les développeurs conçoivent, écrivent et maintiennent le code. Bien qu'aucun ne soit spécifiquement dédié au front-end moderne, leurs principes sont universels et directement applicables au développement d'interfaces.
Diagramme en cours de génération...
1. "You Don't Know JS" — Kyle Simpson (6 volumes)
1.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Kyle Simpson |
| Volumes | 6 (Up & Going, Scope & Closures, this & Object Prototypes, Types & Grammar, Async & Performance, ES6 & Beyond) |
| Année | 2014-2016 (1ère édition) / 2020 (2ème édition "Yet") |
| Niveau | Intermédiaire à avancé |
| Pages | ~200 par volume |
1.2 Thèses Principales
- JavaScript n'est pas un langage "mal conçu" — la plupart des critiques viennent d'une méconnaissance de ses mécanismes internes.
- Comprendre le langage profondément avant d'utiliser des abstractions (frameworks, transpilers).
- La complexité n'est pas un défaut — elle est le reflet de contraintes réelles (compatibilité, legacy).
- Préférer la clarté à la concision — écrire du code que le lecteur comprend immédiatement.
1.3 Concepts Clés par Volume
Volume 1 : Up & Going
- Vue d'ensemble du langage
- Variables, types, fonctions
- Philosophie : apprendre à lire la spec
Volume 2 : Scope & Closures
- Lexical scope
- Function vs block scope
- Hoisting (var vs let/const, TDZ)
- Closures : le chapitre le plus complet jamais écrit sur le sujet
- Module pattern (revealing module)
Volume 3 : this & Object Prototypes
- Les 4 règles de
this(default, implicit, explicit, new) - Arrow functions et lexical
this - Prototypal inheritance vs classical OOP
Object.create(),Object.setPrototypeOf()classsyntax sugar vs prototypes
Volume 4 : Types & Grammar
- Les 7 types (undefined, null, boolean, number, string, symbol, bigint)
- Coercion (ToPrimitive, ToString, ToNumber)
===vs==(Simpson défend un usage raisonné de==)- Grammaire : ASI (Automatic Semicolon Insertion), precedence
Volume 5 : Async & Performance
- Callbacks, callback hell, inversion of control
- Promises : alors qu'au début
- Generators + Promises = coroutines (pattern pré-async/await)
- Web Workers, SIMD, asm.js
- Benchmarking (Benchmark.js)
Volume 6 : ES6 & Beyond
- let/const, destructuring, default params
- Symbols, Iterators, Generators
- Promises, Proxies, Reflect
- Classes, modules ES
- Collections (Map, Set, WeakMap, WeakSet)
1.4 Application au Front-End
| Concept | Application |
|---|---|
| Closures | Composants React, hooks, factories |
| Prototypes | Héritage de composants, polyfills |
this | Event handlers, classes React |
| Promises/async | Data fetching, API calls |
| Modules | Code splitting, tree-shaking |
| Coercion | Parsing de valeurs (formulaires, API) |
1.5 Critique
Points forts :
- Exploration la plus approfondie de JS disponible
- Corrige des années de mauvaises pratiques
- Approche par la spec (TC39)
- Exercices pratiques chaque chapitre
Points faibles :
- Parfois trop verbeux (certains chapitres auraient pu être réduits de moitié)
- Certaines positions sont controversées (usage de
==) - La 2ème édition ("Yet") n'est pas encore complète (seulement 2 volumes publiés)
- Le ton peut être condescendant envers les développeurs "framework-first"
Citation-clé : "You don't know JS, yet."
2. "JavaScript: The Good Parts" — Douglas Crockford
2.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Douglas Crockford |
| Édition | 1ère (2008) |
| Pages | 176 |
| Niveau | Débutant à intermédiaire |
2.2 Thèses Principales
- JavaScript a des "bonnes parties" et des "parties horribles" — il faut apprendre à utiliser les premières et éviter les secondes.
- La simplicité est la clé — éviter les fonctionnalités dangereuses ou ambiguës.
- JSLint n'est pas optionnel — utiliser des outils d'analyse statique systématiquement.
- JSON > XML — Crockford a popularisé JSON comme format d'échange.
2.3 Concepts Clés
// Bonnes parties
// 1. Fonctions comme citoyens de première classe
function createCounter() {
let count = 0;
return () => ++count;
}
// 2. Objets (dictionnaires)
const obj = Object.create(null); // pas de prototype
// 3. Héritage prototypal
const mammal = {
name: '',
say: function() { return `Je suis ${this.name}`; }
};
const cat = Object.create(mammal);
cat.name = 'Miaou';
// Parties à éviter
// 1. == (préférer ===)
// 2. eval (toujours dangereux)
// 3. with (supprimé en strict mode)
// 4. new (pour les types primitifs) : new Number, new String
// 5. continue (goto déguisé)
// 6. arguments (préférer rest params)
2.4 Application au Front-End
- JSON : standard d'échange API (rest, GraphQL)
- Module pattern : encapsulation dans les composants
- Douglas Crockford's style : influence sur ESLint, Prettier
- "Bad parts" awareness : éviter les pièges JS dans le code de production
2.5 Critique
Points forts :
- Court, précis, lisible en un week-end
- A changé la perception de JS (de "jouet" à langage sérieux)
- Introduction à l'analyse statique
Points faibles :
- Très daté (2008 — pré-ES6, pas de Promises, classes, modules)
- Trop dogmatique ("never use == " est une simplification excessive)
- Ignore les évolutions modernes (let/const, arrow functions)
- La variante JS "purifiée" n'est pas réaliste en pratique
3. "Clean Code" — Robert C. Martin (appliqué au JS)
3.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Robert C. Martin ("Uncle Bob") |
| Édition | 1ère (2008) |
| Pages | 464 |
| Niveau | Tous niveaux |
3.2 Thèses Principales
- Le code propre est l'affaire de tous — le ratio temps de lecture / temps d'écriture est de 10:1.
- Les noms sont la première forme de documentation.
- Les fonctions doivent être petites (max 20 lignes, une seule responsabilité).
- Les commentaires sont un aveu d'échec — le code doit s'exprimer.
- Tester n'est pas optionnel — TDD, tests avant code.
3.3 Concepts Clés Adaptés au Front-End
// ❌ Code sale (trop fréquent en front-end)
function handleClick(e) {
const d = document.getElementById('data');
const v = d.value;
if (v.length > 0) {
fetch('/api/save', { method: 'POST', body: JSON.stringify({ val: v }) })
.then(r => r.json())
.then(d => {
if (d.success) {
showToast('OK');
loadList();
} else {
showToast('Erreur');
}
});
}
}
// ✅ Clean Code version
async function handleFormSubmit(event) {
event.preventDefault();
const inputValue = readFormInputValue();
if (!isValidInput(inputValue)) return;
try {
const result = await saveUserData(inputValue);
notifySuccess(result);
refreshUserList();
} catch (error) {
notifyError(error);
}
}
function readFormInputValue() {
return document.getElementById('user-input').value;
}
function isValidInput(value) {
return value.trim().length > 0;
}
3.4 Principes pour le Front-End
| Principe | Application Front-End |
|---|---|
| Single Responsibility | Un composant = une responsabilité |
| Don't Repeat Yourself | Extraire les hooks personnalisés, utilitaires CSS |
| Law of Demeter | Ne pas chaîner les props (a.b.c) |
| Boy Scout Rule | Laisser le code plus propre qu'en arrivant |
| Small Functions | Diviser les handlers, les effets, les reducers |
| Meaningful Names | isLoading plutôt que flag, userEmail plutôt que e |
3.5 Adaptation au Front-End Moderne
Clean Code date de 2008 (Java). Certains principes sont à adapter :
- Composants React = Fonctions — les principes de "Small Functions" s'appliquent directement aux composants.
- Hooks = DRY — extraire la logique réutilisable dans des hooks personnalisés.
- Props naming —
onClick,isDisabled,variant="primary"(conventions sémantiques). - CSS Modules / Tailwind — l'organisation CSS suit les mêmes principes de nommage.
- Co-location — mettre les fichiers liés proches (composant, test, style).
3.6 Critique
Points forts :
- Standards industriels largement adoptés
- Nombreux exemples concrets
- Focus sur le travail d'équipe et la maintenabilité
Points faibles :
- Exemples en Java peu pertinents pour le front-end
- Trop dogmatique ("les commentaires sont toujours mauvais")
- Ignore les contraintes de performance (créer 10 fonctions au lieu d'une)
- Ne couvre pas React, composants, hooks
- Certains principes (error codes plutôt qu'exceptions) sont dépassés
4. "Design Patterns" (GoF) — Erich Gamma et al.
4.1 Présentation
| Aspect | Détail |
|---|---|
| Auteurs | Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides ("Gang of Four") |
| Édition | 1ère (1994) |
| Pages | 416 |
| Niveau | Intermédiaire à avancé |
4.2 Les 23 Patterns en 3 Catégories
Créationnels (5)
| Pattern | Application Front-End |
|---|---|
| Singleton | Store global (Redux store, cache), contexte React |
| Factory Method | Création de composants dynamiques (FabButton, FabInput) |
| Abstract Factory | Thèmes (LightTheme, DarkTheme → composants stylés) |
| Builder | Configuration d'APIs (Axios instance, Query client) |
| Prototype | Clonage d'objets (Immer, copy-on-write) |
Structurels (7)
| Pattern | Application Front-End |
|---|---|
| Adapter | Wrapper d'API legacy, normalize API responses |
| Decorator | Higher-Order Components, context providers |
| Proxy | Service Worker (cache proxy), API proxy (vite.config) |
| Facade | API simplifiée (React Query cache la complexité fetch) |
| Composite | Arbre de composants React |
| Bridge | Abstractions multiples (rendu + logique séparés) |
| Flyweight | Virtualisation (react-window), partage de styles |
Comportementaux (11)
| Pattern | Application Front-End |
|---|---|
| Observer | Redux, Zustand, events, EventEmitter |
| Strategy | Validation de formulaires, stratégies d'animation |
| Command | undo/redo, history (Excalidraw, tldraw) |
| State | State machine (XState), React state |
| Template Method | Composants de layout, patterns de pages |
| Iterator | Array methods, generators, pagination |
| Visitor | AST traversal (Babel, ESLint) |
| Chain of Responsibility | Middleware (Express, Redux middleware) |
| Mediator | Event bus, Redux/Sagas coordination |
| Memento | Sauvegarde de state (time travel debugging) |
| Interpreter | Template engines, expression parsers |
4.3 Critique
Points forts :
- Catalogue universel de solutions éprouvées
- Vocabulaire commun pour l'équipe
- Applicable à tous les langages
Points faibles :
- Très verbeux (les patterns sont des guides, pas des recettes)
- Certains patterns (Singleton) sont devenus des anti-patterns
- Exemples en C++/Smalltalk totalement inaccessibles
- Les frameworks modernes (React, Vue) intègrent déjà ces patterns
- Peut mener au "pattern fever" (solutions surdimensionnées)
4.4 Anti-Patterns à Éviter
// ❌ Singleton comme état global mutable
const GlobalState = {
user: null,
theme: 'light'
};
// ✅ Context React (géré par React)
const ThemeContext = createContext('light');
// ❌ Observer implémenté manuellement
class EventBus {
listeners = {};
on(event, fn) { /* ... */ }
emit(event, ...args) { /* ... */ }
}
// ✅ Utiliser un state manager existant
// Zustand, Redux, Jotai, Valtio
5. "Refactoring" — Martin Fowler
5.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Martin Fowler |
| Édition | 2ème (2018) — exemples en JavaScript |
| Pages | 448 |
| Niveau | Intermédiaire |
5.2 Thèses Principales
- Refactoring ≠ réécriture — petites transformations préservant le comportement.
- Les tests sont obligatoires — sans tests, ce n'est pas du refactoring, c'est du "refragage".
- Refactoring continu — ne pas accumuler la dette technique (boy scout rule).
- Code smell → refactoring pattern — à chaque odeur de code correspond une transformation.
5.3 Code Smells et Refactorings pour le Front-End
| Code Smell | Refactoring | Exemple Front-End |
|---|---|---|
| Long Function | Extract Function | Diviser un gros useEffect en plusieurs hooks |
| Large Component | Extract Component | Splitter un Dashboard en DashboardHeader, DashboardGrid |
| Duplicate Code | Extract Hook/Util | Même logique API → useFetch personnalisé |
| Switch Statement | Replace with Strategy | Theme variants → objet de styles |
| Long Parameter List | Introduce Parameter Object | (lat, lng, zoom, style) → { coordinates, mapOptions } |
| Feature Envy | Move Method | Logique métier dans le composant → déplacer dans un hook |
| Data Clumps | Extract Class | (email, phone, address) → ContactInfo type |
| Shotgun Surgery | Move Field/Method | Même changement dans 5 fichiers → centraliser |
| Primitive Obsession | Replace with Value Object | string email → Email type, number price → Price |
| Conditional Complexity | Replace with Polymorphism | if(type === 'a') → composants spécialisés |
| Dead Code | Delete Code | Composants non utilisés, props inutiles |
| Inappropriate Intimacy | Move Method | Composant accède aux internes d'un autre → isoler |
5.4 Workflow de Refactoring
Diagramme en cours de génération...
5.5 Refactoring React — Cas Pratique
// AVANT — gros composant
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [posts, setPosts] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
fetchUser(userId).then(u => { setUser(u); setIsLoading(false); });
fetchPosts(userId).then(p => setPosts(p));
}, [userId]);
const handleUpdate = async (data) => {
const updated = await updateUser(userId, data);
setUser(updated);
};
if (isLoading) return <Spinner />;
return (
<div>
<UserCard user={user} onUpdate={handleUpdate} />
<PostList posts={posts} />
</div>
);
}
// APRÈS — refactoring en hooks et composants
function useUser(userId) {
const [user, setUser] = useState(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
setIsLoading(true);
fetchUser(userId).then(u => { setUser(u); setIsLoading(false); });
}, [userId]);
const updateUserData = useCallback(async (data) => {
const updated = await updateUser(userId, data);
setUser(updated);
}, [userId]);
return { user, isLoading, updateUser: updateUserData };
}
function useUserPosts(userId) {
const [posts, setPosts] = useState([]);
useEffect(() => { fetchPosts(userId).then(p => setPosts(p)); }, [userId]);
return posts;
}
function UserProfile({ userId }) {
const { user, isLoading, updateUser } = useUser(userId);
const posts = useUserPosts(userId);
if (isLoading) return <Spinner />;
return (
<div>
<UserCard user={user} onUpdate={updateUser} />
<PostList posts={posts} />
</div>
);
}
5.6 Critique
Points forts :
- Catalogue de transformations éprouvées
- 2ème édition en JavaScript
- Approche pragmatique (tests d'abord)
- Applicable immédiatement
Points faibles :
- Les exemples sont trop simples (ne couvrent pas la complexité réelle)
- Ne couvre pas React Hooks, TypeScript, CSS-in-JS
- Certains refactorings ne s'appliquent pas bien aux composants (typiquement fonctionnels)
6. "The Pragmatic Programmer" — Andrew Hunt & David Thomas
6.1 Présentation
| Aspect | Détail |
|---|---|
| Auteurs | Andrew Hunt, David Thomas |
| Édition | 2ème (2019) — 20ème anniversaire |
| Pages | 352 |
| Niveau | Tous niveaux |
6.2 Thèses Principales
- Prenez la responsabilité de votre carrière — investissez dans votre boîte à outils.
- Ne vivez pas avec du code cassé — la "fenêtre brisée" est une métaphore puissante.
- DRY — chaque élément de connaissance doit avoir une représentation unique.
- Orthogonalité — les changements ne doivent pas avoir d'effets de bord imprévus.
- Tracer, ne pas planifier — l'architecture émerge des prototypes.
- Prototyper pour apprendre — le code jetable a une grande valeur d'apprentissage.
6.3 Application au Front-End
| Principe | Application |
|---|---|
| DRY | Ne pas dupliquer les composants, les styles, les types |
| Orthogonalité | Composants isolés, pas de dépendances cachées |
| Tracer | Prototyper rapidement avec Vite + composants isolés |
| Knowledge Portfolio | Apprendre régulièrement (investissement composé) |
| Broken Window | Sanitize les warnings ESLint, fixer les bugs immédiatement |
| Stone Soup | Commencer petit, démontrer la valeur, étendre |
| Good-Enough Software | MVP, itérations, ne pas sur-architecturer d'avance |
6.4 Tips Concrets
1. Maîtrisez votre éditeur (VS Code shortcuts, multi-cursors)
2. Utilisez des templates (scaffolding avec create-next-app, vite create)
3. Écrivez des scripts shell (automatiser la création de composants)
4. Versionnez tout (git, hooks pre-commit)
5. Apprenez les regex (validation, parsing, search/replace)
6. Ne répétez pas la connaissance (la doc qui dérive du code = DRY violé)
7. Automatisez les tâches répétitives (lint on save, formatter)
6.5 Critique
Points forts :
- Philosophie générale du génie logiciel
- Applicable à tous les langages et frameworks
- Plein d'astuces pratiques (outils, scripts, automation)
- 2ème édition modernisée
Points faibles :
- Peu d'exemples concrets pour le front-end
- Certains conseils sont trop génériques
- Pas de couverture des tests ou de l'architecture spécifique web
7. "CSS Secrets" — Lea Verou
7.1 Présentation
| Aspect | Détail |
|---|---|
| Auteure | Lea Verou |
| Édition | 1ère (2015) |
| Pages | 390 |
| Niveau | Intermédiaire à avancé |
7.2 Thèses Principales
- CSS n'est pas un langage limité — la plupart des designs complexes sont réalisables avec les bonnes techniques.
- Comprendre les principes sous-jacents (spécificité, héritage, box model, stacking context) plutôt que mémoriser des hacks.
- Les standards sont vos amis — utiliser les spécifications CSS officielles.
- L'élégance en CSS vient de la simplicité et de la maintenabilité.
7.3 Concepts Clés et Techniques
/* 1. Backgrounds et Bordures */
/* Bordure semi-transparente */
border: 10px solid hsla(0, 0%, 100%, 0.5);
background: white;
background-clip: padding-box;
/* 2. Formes */
/* Triangle en CSS pur */
.triangle {
width: 0;
height: 0;
border-left: 50px solid transparent;
border-right: 50px solid transparent;
border-bottom: 100px solid red;
}
/* 3. Ombres */
/* Ombre intérieure + bordure */
box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1);
/* 4. Animations */
/* Pause/play avec animation-play-state */
.card:hover {
animation-play-state: paused;
}
/* 5. Dégradés pour motifs */
background:
linear-gradient(45deg, #ccc 25%, transparent 25%),
linear-gradient(-45deg, #ccc 25%, transparent 25%);
7.4 Techniques Avancées
| Technique | Application |
|---|---|
| Striped backgrounds | Tableaux, listes alternées |
| Flexible ellipsis | Text overflow responsive |
| Custom checkbox | Accessible + stylé (sans JS) |
| Parallax avec transform | Effet 3D natif (pas de JS) |
| Sticky footer | Footer toujours en bas |
| Image rounded | border-radius + overflow: hidden |
| Multicolumn | Layout texte style presse |
| CSS counters | Numérotation automatique |
7.5 Critique
Points forts :
- Solutions élégantes et maintenables
- Chaque solution est expliquée en profondeur
- Focus sur les standards et la compatibilité
- Lea Verou est une autorité CSS (membre CSS WG)
Points faibles :
- Daté (2015 — pas de CSS Grid, Container Queries, Layers, :has())
- Certaines solutions sont des hacks qui ne sont plus nécessaires
- Ignore Tailwind CSS et l'approche utility-first
- Pas de couverture des CSS-in-JS (styled-components, Emotion)
8. "Learning React" — Alex Banks & Eve Porcello
8.1 Présentation
| Aspect | Détail |
|---|---|
| Auteurs | Alex Banks, Eve Porcello |
| Édition | 2ème (2020) |
| Pages | 300 |
| Niveau | Débutant à intermédiaire |
8.2 Thèses Principales
- React est une bibliothèque, pas un framework — il résout un problème spécifique (UI), pas l'architecture complète.
- La programmation fonctionnelle est au cœur de React (composants purs, immutabilité).
- Penser en composants — décomposer l'interface en unités atomiques.
- Les hooks changent la donne — remplacent les classes et le cycle de vie.
8.3 Concepts Clés
// 1. Composants fonctionnels
function Greeting({ name }) {
return <h1>Hello, {name}!</h1>;
}
// 2. Hooks fondamentaux
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
// useReducer pour la logique complexe
const [state, dispatch] = useReducer(reducer, initialState);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}
// 3. Context
const ThemeContext = createContext('light');
function App() {
return (
<ThemeContext.Provider value="dark">
<ThemedButton />
</ThemeContext.Provider>
);
}
// 4. Custom hooks
function useWindowSize() {
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
const handler = () => setSize({ width: window.innerWidth, height: window.innerHeight });
window.addEventListener('resize', handler);
return () => window.removeEventListener('resize', handler);
}, []);
return size;
}
8.4 Progression du Livre
| Partie | Contenu |
|---|---|
| 1. Fondamentaux | JSX, rendering, props, state |
| 2. Architecture | Composition, hooks, context, refs |
| 3. Patterns avancés | Render props, HOCs (comparaison avec hooks) |
| 4. Écosystème | React Router, testing (React Testing Library) |
| 5. Applications | Intégration API, Firebase, GraphQL |
8.5 Critique
Points forts :
- Progression pédagogique bien conçue
- Exemples React modernes (hooks, pas de classes)
- Couvre l'écosystème (Router, Testing)
Points faibles :
- Largement dépassé (2020 — pas de Server Components, Next.js App Router)
- Trop superficiel pour les développeurs expérimentés
- Ne couvre pas la performance (memo, useMemo, useCallback)
- Pas de coverage des patterns avancés (suspense, streaming)
9. "Patterns of Enterprise Application Architecture" — Martin Fowler
9.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Martin Fowler |
| Édition | 1ère (2002) |
| Pages | 560 |
| Niveau | Avancé |
9.2 Thèses Principales
- Séparation des préoccupations — présentation, logique métier, persistence, données.
- Domain Model > Transaction Script — la logique métier doit être encapsulée dans des objets.
- Les patterns d'architecture sont universels — s'appliquent quelque soit la technologie.
- Repository Pattern — abstraction de la source de données.
9.3 Patterns Clés et Application Front-End
| Pattern | Description | Application Front-End |
|---|---|---|
| Repository | Abstraction de la données | Services API (fetch/Axios), React Query |
| Unit of Work | Transactions groupées | Optimistic updates, mutations batch |
| Data Mapper | Mapping objet ↔ données | Normalizr, serializers |
| Service Layer | Logique métier centralisée | Hooks personnalisés, services |
| Gateway | Accès à une ressource externe | API client, WebSocket client |
| Table Module | Logique par table | Firebase, Supabase patterns |
| Specification | Requêtes paramétrables | Filtres, search queries |
| Value Object | Objets immuables par valeur | TypeScript types, Date, Money |
9.4 Architecture Front-End Inspirée de P of EAA
UI Layer (Composants React/Vue)
↕
Service Layer (Hooks, Services)
↕
Repository Layer (React Query, Apollo, tRPC)
↕
API Layer (REST, GraphQL, WebSocket)
↕
Backend
9.5 Critique
Points forts :
- Architecture logicielle intemporelle
- Vocabulaire commun pour équipes
- Applicable au front-end moderne
Points faibles :
- Exemples en Java/C# inaccessibles
- Ne couvre pas le front-end spécifiquement
- Patterns très abstraits, difficiles à appliquer sans expérience
- Certains patterns (Active Record) sont dépassés
10. "Domain-Driven Design" — Eric Evans
10.1 Présentation
| Aspect | Détail |
|---|---|
| Auteur | Eric Evans |
| Édition | 1ère (2003) / "Blue Book" |
| Pages | 560 |
| Niveau | Avancé |
10.2 Thèses Principales
- Le cœur du logiciel est le domaine métier — pas la technologie.
- Ubiquitous Language — le code et les discussions utilisent le même vocabulaire.
- Bounded Context — diviser le domaine en contextes avec des limites claires.
- Aggregate — racine d'un groupe d'entités, point d'accès unique.
- Domain Events — évolution du domaine par événements.
10.3 Application au Front-End
Bounded Context
Application entière
├── 🔵 User Context (auth, profil, préférences)
│ ├── Entités : User, Session, Preferences
│ ├── Aggrégat : User (root)
│ └── Events : UserLoggedIn, UserUpdated
├── 🟢 Product Context (catalogue, recherche)
│ ├── Entités : Product, Category, Review
│ ├── Aggrégat : Product (root)
│ └── Events : ProductSearched, ReviewAdded
└── 🟠 Order Context (panier, commande, paiement)
├── Entités : Order, Cart, Payment
├── Aggrégat : Order (root)
└── Events : OrderPlaced, PaymentConfirmed
Ubiquitous Language en Front-End
// ❌ Mauvais — vocabulaire technique
interface DataItem {
id: string;
fields: Record<string, unknown>;
status: number;
}
// ✅ BDD — vocabulaire métier
interface Order {
id: OrderId;
customer: CustomerSnapshot;
items: OrderLine[];
total: Money;
status: OrderStatus; // 'pending' | 'confirmed' | 'shipped' | 'delivered'
createdAt: DateTime;
}
// Les événements du domaine
type OrderDomainEvent =
| { type: 'ORDER_PLACED'; order: Order; timestamp: Date }
| { type: 'PAYMENT_CONFIRMED'; orderId: OrderId; amount: Money }
| { type: 'ORDER_SHIPPED'; orderId: OrderId; trackingNumber: string };
10.4 DDD Patterns pour le Front-End
| Pattern DDD | Application Front-End |
|---|---|
| Value Object | Email, Phone, Money, DateRange (types immutables) |
| Entity | User, Product, Order (objets avec identité) |
| Aggregate | Root d'une feature (ex: OrderRoot dans le store) |
| Repository | API abstraction (ne pas exposer fetch) |
| Domain Event | Event-driven architecture (Redux actions) |
| Application Service | Hooks de feature (useOrder, useUser) |
| Domain Service | Logique métier pure (calcul de prix, validation) |
| Factory | Création d'objets complexes (createOrder) |
| Specification | Filtres et règles métier |
10.5 Critique
Points forts :
- Approche métier-centrée, pas techno-centrée
- Patterns puissants pour les applications complexes
- Traduit la complexité métier en code maintenable
Points faibles :
- Très difficile à lire (style académique)
- Exemples en Java (Enterprise) éloignés du front-end
- Sur-dimensionné pour des applications CRUD simples
- Ne couvre ni React, ni TypeScript, ni l'architecture front-end
- Doit être adapté (front-end ≠ back-end enterprise)
11. Tableau Comparatif des Livres
| Livre | Difficulté | Année | Pages | Priorité Front-End | Applicabilité |
|---|---|---|---|---|---|
| YDKJS | Élevée | 2014-2020 | ~1200 | ⭐⭐⭐⭐⭐ | Très haute |
| JS Good Parts | Faible | 2008 | 176 | ⭐⭐ | Historique |
| Clean Code | Moyenne | 2008 | 464 | ⭐⭐⭐⭐ | Haute (adapté) |
| GoF Patterns | Élevée | 1994 | 416 | ⭐⭐⭐ | Moyenne |
| Refactoring | Moyenne | 2018 | 448 | ⭐⭐⭐⭐ | Très haute |
| Pragmatic Programmer | Faible | 2019 | 352 | ⭐⭐⭐ | Haute |
| CSS Secrets | Moyenne | 2015 | 390 | ⭐⭐⭐ | Haute (daté) |
| Learning React | Faible | 2020 | 300 | ⭐⭐⭐ | Moyenne (daté) |
| P of EAA | Élevée | 2002 | 560 | ⭐⭐⭐ | Abstraite |
| DDD | Très élevée | 2003 | 560 | ⭐⭐⭐ | Haute (adapté) |
12. Guide de Lecture par Profil
Débutant (< 1 an)
- JavaScript: The Good Parts (1 weekend)
- You Don't Know JS — Vol 1: Up & Going
- Learning React (ou équivalent framework)
- CSS Secrets (chapitres au besoin)
Intermédiaire (1-3 ans)
- YDKJS — Vol 2, 3 (Scope, this)
- Clean Code (lecture critique)
- Refactoring (Fowler, 2ème éd.)
- The Pragmatic Programmer
Avancé (3+ ans)
- YDKJS — Vol 4, 5, 6
- DDD (Eric Evans)
- GoF Design Patterns
- Patterns of EAA
Lecture Continue
- Relire Clean Code tous les 2 ans
- The Pragmatic Programmer en relecture annuelle
- Refactoring comme ouvrage de référence
- CSS Secrets pour les défis CSS
13. Conclusion
Lire ces livres ne fera pas de vous un meilleur développeur du jour au lendemain. La clé est de :
- Lire activement — prendre des notes, coder les exemples
- Appliquer immédiatement — refactorer du code existant
- Revisiter — relire chaque livre à différents stades de carrière
- Critiquer — les livres sont des guides, pas des bibles
- Adapter — les principes de 2002 (Java) doivent être traduits en 2024 (React/TypeScript)
Le meilleur investissement reste : 30 minutes de lecture technique par jour, tous les jours.