Le critère de A1
Comment décide-t-on qu'un découpage est meilleur qu'un autre ? En quelle unité mesure-t-on ?
Coding Week
Héritage, composition, contrats · A2, Coding Week 1A
Hermann Agossou
École Centrale Casablanca • 2026 • Casablanca, Maroc
Doctorant, UTER MID@S, ECC / UH2C
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Section
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Deux questions sur le module précédent
Comment décide-t-on qu'un découpage est meilleur qu'un autre ? En quelle unité mesure-t-on ?
Que cache un module, et pourquoi est-ce la bonne question plutôt que « que contient-il » ?
Aujourd'hui, on applique ce critère aux objets et on découvre qu'« héritage ou composition » se tranche, au lieu de se discuter.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Elle semblait juste au départ
01
Promet l'opération `retirer(montant)`.
02
Redéfinit le retrait avec un plafond mensuel.
03
Redéfinit le retrait pour toujours lever `OperationInterdite`.
« Utilisez la composition » est une réponse que tout le monde connaît. Sur quelle base la défendriez-vous devant un collègue qui n'est pas d'accord ?
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Le vocabulaire avant le jugement
Ce qui oblige deux morceaux de code à changer ensemble.
Ce qui justifie que des éléments soient réunis au même endroit.
Ce que l'appelant doit garantir, et ce que l'appelé promet en retour.
Un objet en tient un autre et lui confie une part du travail.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Et programmer vers une interface, pas une implémentation
Left
La sous-classe voit l'intérieur du parent.
Right
L'objet composé n'est vu qu'à travers son interface.
Voir: [1] Gamma et al. (1994)
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
La sous-classe dépend de l'implémentation du parent
Left
Le retrait modifie directement `_solde`.
Right
Le retrait ajoute `-montant` à `_mouvements`.
Le parent n'a rien promis sur `_solde` : les sous-classes s'en servaient quand même. L'héritage leur en avait donné le droit.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Le critère de substitution
Un type est un sous-type d'un autre seulement si le remplacer partout où le sur-type est attendu laisse inchangé le comportement de tout programme écrit contre le sur-type.
Voir: [2] Liskov (1987)
Tout code qui appelle `retirer` sur un `Compte` cesse de fonctionner si on lui passe un `CompteBloque`. L'héritage n'était donc pas légitime. Cela se démontre, cela ne se discute pas.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Rendre le critère vérifiable
01
Ce que l'appelant doit garantir avant d'appeler. Elle l'engage, lui.
02
Ce que l'appelé promet à la sortie. Elle engage le fournisseur.
03
Ce qui reste vrai avant et après chaque opération publique.
Une méthode redéfinie peut affaiblir la précondition et renforcer la postcondition, jamais l'inverse. Le compte bloqué renforce la précondition : c'est précisément le sens interdit.
Voir: [3] Meyer (1997)
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
Exemple entièrement traité
| Méthode | Substitution tenue ? | Conclusion |
|---|---|---|
| solde() | oui | héritage acceptable |
| deposer() | oui | héritage acceptable |
| retirer() | non : lève une exception | héritage illégitime |
Pour chaque méthode héritée, substituez une instance de la sous-classe dans tous les appelants existants et exécutez-les. Un appelant qui doit tester le type concret, ou qui échoue, prouve que l'héritage n'était pas légitime.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Le critère
La moitié de l'analyse est donnée
Deuxième hiérarchie : `Rectangle` et `Carre`. Un carré est un rectangle, en français.
| Méthode | Substitution tenue ? | Conclusion |
|---|---|---|
| aire() | oui | acceptable |
| fixer_largeur() | ? | ? |
| fixer_hauteur() | ? | ? |
Nommez l'appelant qui casse. Si vous n'en trouvez aucun, l'héritage tient, et il faudra le dire aussi.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Section
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Petits pas, tests au vert après chacun
Refactorer, c'est modifier la structure interne d'un logiciel pour le rendre moins coûteux à modifier, sans changer son comportement observable.
Petits pas, tests après chacun, et retour au vert avant l'étape structurelle suivante. Si une étape échoue, corrigez-la dans cette portée bornée ou annulez-la ; n'empilez pas une nouvelle transformation sur un état rouge.
Voir: [4] Fowler (2018)
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Replace Superclass with Delegate, étape par étape
Left
`CompteBloque` est présenté comme un `Compte`.
Right
`CompteBloque` contient un compte et expose seulement ce qu'il tient.
La classe ne promet plus `retirer`. Il n'y a donc plus d'appelant à casser : le contrat dit la vérité sur ce que l'objet fait.
Nom au catalogue : Replace Superclass with Delegate (2e éd.) ; Replace Inheritance with Delegation dans la 1re.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Reconnaître un patron déjà présent
Définir une famille d'algorithmes, encapsuler chacun et les rendre interchangeables, afin que l'algorithme varie indépendamment des clients qui l'utilisent.
Workflow 01
Calcule le prix de base, sans choisir de politique.
Workflow 02
Le paramètre est le point de variation.
Workflow 03
Injecter `remise_etudiant` ou `remise_black_friday`.
Que coûterait sa suppression ? Ici : chaque nouvelle remise rouvrirait `facturer`. Ce que le patron achète, c'est de ne plus toucher au code qui marche.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Chaque étape est un commit
01
Tests au vert → commit.
02
Tests au vert → commit.
03
Tests au vert → commit.
04
Tests au vert → commit.
Exécutez la suite après chaque étape et ne committez que sur du vert. Annuler une étape rouge et la reprendre plus petite est ce qui rend la transformation conservatrice du comportement, plutôt qu'une réécriture.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Sans aide, historique à l'appui
Refactorez la classe distribuée vers la délégation. Un commit par étape, la suite au vert à chaque commit.
On rejouera un `git log` au tableau. A3 expliquera pourquoi cet historique est une preuve.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
La transformation
Un critère et une discipline
Le catalogue GoF, les classes Python, les ABC. Les patrons changeront de nom et de mode ; le critère de substitution et la discipline des petits pas, non.
Coding Week
1A · Coding Week · A2 Objets et conception · H. Agossou
Appendix