MFormations
Modern Frontend Engineering

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

AspectDétail
AuteurKyle Simpson
Volumes6 (Up & Going, Scope & Closures, this & Object Prototypes, Types & Grammar, Async & Performance, ES6 & Beyond)
Année2014-2016 (1ère édition) / 2020 (2ème édition "Yet")
NiveauIntermédiaire à avancé
Pages~200 par volume

1.2 Thèses Principales

  1. JavaScript n'est pas un langage "mal conçu" — la plupart des critiques viennent d'une méconnaissance de ses mécanismes internes.
  2. Comprendre le langage profondément avant d'utiliser des abstractions (frameworks, transpilers).
  3. La complexité n'est pas un défaut — elle est le reflet de contraintes réelles (compatibilité, legacy).
  4. 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()
  • class syntax 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

ConceptApplication
ClosuresComposants React, hooks, factories
PrototypesHéritage de composants, polyfills
thisEvent handlers, classes React
Promises/asyncData fetching, API calls
ModulesCode splitting, tree-shaking
CoercionParsing 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

AspectDétail
AuteurDouglas Crockford
Édition1ère (2008)
Pages176
NiveauDébutant à intermédiaire

2.2 Thèses Principales

  1. JavaScript a des "bonnes parties" et des "parties horribles" — il faut apprendre à utiliser les premières et éviter les secondes.
  2. La simplicité est la clé — éviter les fonctionnalités dangereuses ou ambiguës.
  3. JSLint n'est pas optionnel — utiliser des outils d'analyse statique systématiquement.
  4. 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

AspectDétail
AuteurRobert C. Martin ("Uncle Bob")
Édition1ère (2008)
Pages464
NiveauTous niveaux

3.2 Thèses Principales

  1. Le code propre est l'affaire de tous — le ratio temps de lecture / temps d'écriture est de 10:1.
  2. Les noms sont la première forme de documentation.
  3. Les fonctions doivent être petites (max 20 lignes, une seule responsabilité).
  4. Les commentaires sont un aveu d'échec — le code doit s'exprimer.
  5. 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

PrincipeApplication Front-End
Single ResponsibilityUn composant = une responsabilité
Don't Repeat YourselfExtraire les hooks personnalisés, utilitaires CSS
Law of DemeterNe pas chaîner les props (a.b.c)
Boy Scout RuleLaisser le code plus propre qu'en arrivant
Small FunctionsDiviser les handlers, les effets, les reducers
Meaningful NamesisLoading 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 :

  1. Composants React = Fonctions — les principes de "Small Functions" s'appliquent directement aux composants.
  2. Hooks = DRY — extraire la logique réutilisable dans des hooks personnalisés.
  3. Props namingonClick, isDisabled, variant="primary" (conventions sémantiques).
  4. CSS Modules / Tailwind — l'organisation CSS suit les mêmes principes de nommage.
  5. 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

AspectDétail
AuteursErich Gamma, Richard Helm, Ralph Johnson, John Vlissides ("Gang of Four")
Édition1ère (1994)
Pages416
NiveauIntermédiaire à avancé

4.2 Les 23 Patterns en 3 Catégories

Créationnels (5)

PatternApplication Front-End
SingletonStore global (Redux store, cache), contexte React
Factory MethodCréation de composants dynamiques (FabButton, FabInput)
Abstract FactoryThèmes (LightTheme, DarkTheme → composants stylés)
BuilderConfiguration d'APIs (Axios instance, Query client)
PrototypeClonage d'objets (Immer, copy-on-write)

Structurels (7)

PatternApplication Front-End
AdapterWrapper d'API legacy, normalize API responses
DecoratorHigher-Order Components, context providers
ProxyService Worker (cache proxy), API proxy (vite.config)
FacadeAPI simplifiée (React Query cache la complexité fetch)
CompositeArbre de composants React
BridgeAbstractions multiples (rendu + logique séparés)
FlyweightVirtualisation (react-window), partage de styles

Comportementaux (11)

PatternApplication Front-End
ObserverRedux, Zustand, events, EventEmitter
StrategyValidation de formulaires, stratégies d'animation
Commandundo/redo, history (Excalidraw, tldraw)
StateState machine (XState), React state
Template MethodComposants de layout, patterns de pages
IteratorArray methods, generators, pagination
VisitorAST traversal (Babel, ESLint)
Chain of ResponsibilityMiddleware (Express, Redux middleware)
MediatorEvent bus, Redux/Sagas coordination
MementoSauvegarde de state (time travel debugging)
InterpreterTemplate 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

AspectDétail
AuteurMartin Fowler
Édition2ème (2018) — exemples en JavaScript
Pages448
NiveauIntermédiaire

5.2 Thèses Principales

  1. Refactoring ≠ réécriture — petites transformations préservant le comportement.
  2. Les tests sont obligatoires — sans tests, ce n'est pas du refactoring, c'est du "refragage".
  3. Refactoring continu — ne pas accumuler la dette technique (boy scout rule).
  4. Code smell → refactoring pattern — à chaque odeur de code correspond une transformation.

5.3 Code Smells et Refactorings pour le Front-End

Code SmellRefactoringExemple Front-End
Long FunctionExtract FunctionDiviser un gros useEffect en plusieurs hooks
Large ComponentExtract ComponentSplitter un Dashboard en DashboardHeader, DashboardGrid
Duplicate CodeExtract Hook/UtilMême logique API → useFetch personnalisé
Switch StatementReplace with StrategyTheme variants → objet de styles
Long Parameter ListIntroduce Parameter Object(lat, lng, zoom, style) → { coordinates, mapOptions }
Feature EnvyMove MethodLogique métier dans le composant → déplacer dans un hook
Data ClumpsExtract Class(email, phone, address) → ContactInfo type
Shotgun SurgeryMove Field/MethodMême changement dans 5 fichiers → centraliser
Primitive ObsessionReplace with Value Objectstring email → Email type, number price → Price
Conditional ComplexityReplace with Polymorphismif(type === 'a') → composants spécialisés
Dead CodeDelete CodeComposants non utilisés, props inutiles
Inappropriate IntimacyMove MethodComposant 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

AspectDétail
AuteursAndrew Hunt, David Thomas
Édition2ème (2019) — 20ème anniversaire
Pages352
NiveauTous niveaux

6.2 Thèses Principales

  1. Prenez la responsabilité de votre carrière — investissez dans votre boîte à outils.
  2. Ne vivez pas avec du code cassé — la "fenêtre brisée" est une métaphore puissante.
  3. DRY — chaque élément de connaissance doit avoir une représentation unique.
  4. Orthogonalité — les changements ne doivent pas avoir d'effets de bord imprévus.
  5. Tracer, ne pas planifier — l'architecture émerge des prototypes.
  6. Prototyper pour apprendre — le code jetable a une grande valeur d'apprentissage.

6.3 Application au Front-End

PrincipeApplication
DRYNe pas dupliquer les composants, les styles, les types
OrthogonalitéComposants isolés, pas de dépendances cachées
TracerPrototyper rapidement avec Vite + composants isolés
Knowledge PortfolioApprendre régulièrement (investissement composé)
Broken WindowSanitize les warnings ESLint, fixer les bugs immédiatement
Stone SoupCommencer petit, démontrer la valeur, étendre
Good-Enough SoftwareMVP, 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

AspectDétail
AuteureLea Verou
Édition1ère (2015)
Pages390
NiveauIntermédiaire à avancé

7.2 Thèses Principales

  1. CSS n'est pas un langage limité — la plupart des designs complexes sont réalisables avec les bonnes techniques.
  2. Comprendre les principes sous-jacents (spécificité, héritage, box model, stacking context) plutôt que mémoriser des hacks.
  3. Les standards sont vos amis — utiliser les spécifications CSS officielles.
  4. 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

TechniqueApplication
Striped backgroundsTableaux, listes alternées
Flexible ellipsisText overflow responsive
Custom checkboxAccessible + stylé (sans JS)
Parallax avec transformEffet 3D natif (pas de JS)
Sticky footerFooter toujours en bas
Image roundedborder-radius + overflow: hidden
MulticolumnLayout texte style presse
CSS countersNumé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

AspectDétail
AuteursAlex Banks, Eve Porcello
Édition2ème (2020)
Pages300
NiveauDébutant à intermédiaire

8.2 Thèses Principales

  1. React est une bibliothèque, pas un framework — il résout un problème spécifique (UI), pas l'architecture complète.
  2. La programmation fonctionnelle est au cœur de React (composants purs, immutabilité).
  3. Penser en composants — décomposer l'interface en unités atomiques.
  4. 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

PartieContenu
1. FondamentauxJSX, rendering, props, state
2. ArchitectureComposition, hooks, context, refs
3. Patterns avancésRender props, HOCs (comparaison avec hooks)
4. ÉcosystèmeReact Router, testing (React Testing Library)
5. ApplicationsInté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

AspectDétail
AuteurMartin Fowler
Édition1ère (2002)
Pages560
NiveauAvancé

9.2 Thèses Principales

  1. Séparation des préoccupations — présentation, logique métier, persistence, données.
  2. Domain Model > Transaction Script — la logique métier doit être encapsulée dans des objets.
  3. Les patterns d'architecture sont universels — s'appliquent quelque soit la technologie.
  4. Repository Pattern — abstraction de la source de données.

9.3 Patterns Clés et Application Front-End

PatternDescriptionApplication Front-End
RepositoryAbstraction de la donnéesServices API (fetch/Axios), React Query
Unit of WorkTransactions groupéesOptimistic updates, mutations batch
Data MapperMapping objet ↔ donnéesNormalizr, serializers
Service LayerLogique métier centraliséeHooks personnalisés, services
GatewayAccès à une ressource externeAPI client, WebSocket client
Table ModuleLogique par tableFirebase, Supabase patterns
SpecificationRequêtes paramétrablesFiltres, search queries
Value ObjectObjets immuables par valeurTypeScript 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

AspectDétail
AuteurEric Evans
Édition1ère (2003) / "Blue Book"
Pages560
NiveauAvancé

10.2 Thèses Principales

  1. Le cœur du logiciel est le domaine métier — pas la technologie.
  2. Ubiquitous Language — le code et les discussions utilisent le même vocabulaire.
  3. Bounded Context — diviser le domaine en contextes avec des limites claires.
  4. Aggregate — racine d'un groupe d'entités, point d'accès unique.
  5. 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 DDDApplication Front-End
Value ObjectEmail, Phone, Money, DateRange (types immutables)
EntityUser, Product, Order (objets avec identité)
AggregateRoot d'une feature (ex: OrderRoot dans le store)
RepositoryAPI abstraction (ne pas exposer fetch)
Domain EventEvent-driven architecture (Redux actions)
Application ServiceHooks de feature (useOrder, useUser)
Domain ServiceLogique métier pure (calcul de prix, validation)
FactoryCréation d'objets complexes (createOrder)
SpecificationFiltres 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

LivreDifficultéAnnéePagesPriorité Front-EndApplicabilité
YDKJSÉlevée2014-2020~1200⭐⭐⭐⭐⭐Très haute
JS Good PartsFaible2008176⭐⭐Historique
Clean CodeMoyenne2008464⭐⭐⭐⭐Haute (adapté)
GoF PatternsÉlevée1994416⭐⭐⭐Moyenne
RefactoringMoyenne2018448⭐⭐⭐⭐Très haute
Pragmatic ProgrammerFaible2019352⭐⭐⭐Haute
CSS SecretsMoyenne2015390⭐⭐⭐Haute (daté)
Learning ReactFaible2020300⭐⭐⭐Moyenne (daté)
P of EAAÉlevée2002560⭐⭐⭐Abstraite
DDDTrès élevée2003560⭐⭐⭐Haute (adapté)

12. Guide de Lecture par Profil

Débutant (< 1 an)

  1. JavaScript: The Good Parts (1 weekend)
  2. You Don't Know JS — Vol 1: Up & Going
  3. Learning React (ou équivalent framework)
  4. CSS Secrets (chapitres au besoin)

Intermédiaire (1-3 ans)

  1. YDKJS — Vol 2, 3 (Scope, this)
  2. Clean Code (lecture critique)
  3. Refactoring (Fowler, 2ème éd.)
  4. The Pragmatic Programmer

Avancé (3+ ans)

  1. YDKJS — Vol 4, 5, 6
  2. DDD (Eric Evans)
  3. GoF Design Patterns
  4. 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 :

  1. Lire activement — prendre des notes, coder les exemples
  2. Appliquer immédiatement — refactorer du code existant
  3. Revisiter — relire chaque livre à différents stades de carrière
  4. Critiquer — les livres sont des guides, pas des bibles
  5. 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.