Principes de
Conception

Gérer la complexité

Pour développer efficacement

✔️ Décomposition

✔️ Découplage, isolation

✔️ Abstraction

✔️ Testabilité

 

❌ Multitude d'états

❌ États partagés

❌ Trop d'abstractions

KISS

Keep It Simple Stupid

Exercice:

https://www.codewars.com/kata/valid-parentheses/

Ne pas rendre le code plus complexe que le problème à résoudre

Facilite la vie des autres (et de votre vous futur)

YAGNI

You ain't gonna need it

Ne pas coder plus que nécessaire, avant que nécessaire, par anticipation, "au cas où"

Exemple:

Profil d'un utilisateur de l'agenda collaboratif.

Avatar ? Bio ? Site perso ?

Exemple:

Prototype d'un site. Sortir Node, Socket.IO, React, Redux...

YAGNI

Cas Conséquence
1. La bonne feature, bien faite (rare) Délai sur le reste, et complexité inutile jusqu'au jour où la feature est nécessaire
2. La bonne feature, mal faite Coût de [1], et coût de réparation/ajustement
3. La mauvaise feature Coût de [1], et coût de suppression de la feature, et recodage complet

Les risques de coder une feature trop tôt, par anticipation

DRY

Don't Repeat Yourself

"Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."

"Tout bout de logique doit avoir une unique, non ambigüe, prédominante représentation au sein d'un système."

function validateProduct(product) {
  if (!Object.prototype.hasOwnProperty.call(product, "color")) {
    throw new Error("Import fail: the product attribute color is missing");
  }

  if (!Object.prototype.hasOwnProperty.call(product, "size")) {
    throw new Error("Import fail: the product attribute size is missing");
  }

  if (!Object.prototype.hasOwnProperty.call(product, "type")) {
    throw new Error("Import fail: the product attribute color is missing");
  }
}

Code is not knowledge

function validateProduct(product) {
  const assessProductProp = prop => {
    if (!Object.prototype.hasOwnProperty.call(product, prop)) {
      throw new Error(`Import fail: the product attribute ${prop} is missing`);
    }
  };

  ["color", "size", "type"].forEach(assessProductProp);
}

Code is not knowledge

What is Knowledge

Exemples de choses à ne pas dupliquer:

  • Algorithmes :
    • Trier une liste d'évènements d'un calendrier chronologiquement
  • Logique métier :
    • Envoyer un email à un utilisateur
    • Ajouter un évènement en base de donnée
    • Affichage du portrait d'un utilisateur
  • Données et état : Voir Single Source of Truth

Premature DRY

"Duplication is far cheaper than the wrong abstraction."

En dupliquant on évite complexité et couplage inutile

Single Source of Truth

Une donnée ou un état devrait avoir un unique endroit où être stocké.

Sinon

  • complexité de refactoring, risque d'oubli
  • problème de synchronisation

Single Source of Truth

One-way data binding

Principes de conception

By Nicolas Gaborit

Principes de conception

Les principes de designs essentiels

  • 53