S Single Responsibility Un fichier, une raison de changer.
Une seule classe publique par fichier, 50 lignes max par fonction, 200 par classe. Au-delà, le lint casse le build et on découpe.
O Open / Closed Ouvert à l'extension, fermé à la modification.
Une seconde implémentation s'ajoute à côté de la première (SqlUserRepository à côté de RestUserRepository) sans renommer ni toucher un seul appelant. Le nom porte la techno utilisée.
L Liskov Substitution Une implémentation en remplace une autre sans surprise.
Chaque interface a son Fake…, injecté à la place de la vraie en test. Un seul préfixe de test est autorisé : voir Mock, Stub et InMemory côte à côte ferait croire à trois contrats différents.
I Interface Segregation Un contrat par rôle métier.
Une interface par fonctionnalité (AuthRepository, OrderRepository), déclarée dans domain. Les lectures ne traversent pas de cas d'usage : on n'ajoute pas une couche pour la symétrie.
D Dependency Inversion Le métier ne dépend de rien. Tout le reste dépend du métier.
C'est la matrice plus haut. domain déclare l'interface et n'importe personne, data l'implémente, app est le seul endroit où les deux se rencontrent. Une flèche à l'envers ne compile pas.
KISS Keep It Simple La solution la plus simple qui tient.
80 % des services font cinq lignes : une classe, une injection. L'interface, le fake et les erreurs typées sont réservés aux 20 % où ils paient : paiement, authentification, ce qui se teste en isolation.
YAGNI You Aren't Gonna Need It On n'écrit pas pour un besoin qu'on n'a pas.
Une interface s'extrait le jour où un test a besoin d'un fake. Pré-abstraire « au cas où », c'est prendre de la dette pour un futur qui n'arrive pas.
SoC Separation of Concerns Chaque couche a un seul sujet.
Un composant feuille ne connaît que ses paramètres, et le lint vérifie qu'il n'accède jamais au gestionnaire d'état. Un seul point de l'arbre d'UI branche l'état.
COMP Composition > héritage On assemble des petites pièces.
Plusieurs petits états qui s'observent plutôt qu'un objet-dieu de 800 lignes. Côté UI, un composant qui en contient un autre est un organisme.
DRY manque volontairement à cette liste. Il s'arrête à la frontière data, où le DTO duplique exprès la forme de l'entité : un champ renommé côté base casse un seul mapper, aucun écran.