Éco-conception
Optimisation

Anti-patterns

L'écoconception ne s'arrête pas à l'architecture.
La manière dont on écrit le code peut avoir un impact massif sur la consommation des ressources (CPU, RAM, Réseau), surtout à grande échelle.

Voici quelques anti-patterns courants:

Le n+1 select

C'est l'erreur classique, souvent masquée par les ORM. Vous récupérez une liste d'objets, puis vous bouclez dessus pour récupérer une information liée.

Le code énergivore

// On récupère 100 utilisateurs
const users = await db.query("SELECT * FROM users LIMIT 100");

// On se retrouvwe avec une requête SQL par utilisateur
for (const user of users) {
  user.posts = await db.query("SELECT * FROM posts WHERE user_id = ?", [user.id]);
}
Solution possible

Utilisez une jointure (JOIN) pour tout récupérer en une seule requête SQL.

--  une seule requête optimisée
SELECT users.name, posts.title
FROM users
JOIN posts ON users.id = posts.user_id
LIMIT 100;

Gain : On passe de 101 allers-retours réseau à 1 seul.


Les requêtes multiples

Le frontend a besoin d'afficher les détails de 10 produits. Il lance 10 requêtes AJAX simultanées.

Le code énergivore

const productIds = [1, 2, 3, 4, 5, ...];

// sature le réseau et le thread du navigateur
const products = await Promise.all(
  productIds.map(id => fetch(`/api/products/${id}`))
);
Solution possible

Créez des endpoints qui acceptent des lots (batching).

// une seule requête HTTP
const response = await fetch(`/api/products?ids=${productIds.join(',')}`);
const products = await response.json();

Gain : moins de consommation batterie sur mobile.


L'Over-fetching (REST vs GraphQL)

Vous avez besoin d'afficher juste le nom et l'avatar d'un utilisateur dans une liste. Mais votre API REST renvoie l'objet utilisateur complet.

Le code énergivore

// GET /api/users/42
// Le serveur renvoie un JSON énorme du style
{
  "id": 42,
  "name": "Alice",
  "avatar": "alice.jpg",
  "address": { "street": "...", "city": "..." }, // Inutile
  "preferences": { ... }, // Inutile
  "history": [ ... ] // Inutile et très lourd !
}
Solution possible

Utilisez GraphQL (ou une API REST avec des champs partiels) pour ne demander que le strict nécessaire.

# La réponse ne fera que quelques octets
query {
  user(id: 42) {
    name
    avatar
  }
}

Gain : Économie de bande passante et de parsing JSON (CPU/batterie).