Coding Week

Programmation structurée

Le coût du changement · A1, Coding Week 1A

Hermann Agossou

École Centrale Casablanca • 2026 • Casablanca, Maroc

Doctorant, UTER MID@S, ECC / UH2C

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Section

Le critère

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Ce que vous savez déjà des objets

Trois questions avant de commencer

Encapsulation

Qu'est-ce qu'elle protège exactement : les données, ou la liberté de les changer ?

Héritage

Une classe fille peut-elle toujours remplacer sa classe mère ?

Méthode privée

Pourquoi la rendre privée ? Contre qui la protège-t-on ?

Répondez d'abord. On ne corrige pas maintenant.

Ces trois réponses fixent le niveau du module suivant. Celles qui sont fausses aujourd'hui reviendront en A2, et c'est voulu.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Deux versions du même programme

Elles font exactement la même chose

Left

Version A

`flat_report.py` formate dans `render_invoice`.

  • Le format monétaire apparaît sur chaque ligne
  • Le total répète la même décision
  • L'appelant fournit aussi `row_index`

Right

Version B

`hidden_report.py` nomme les décisions.

  • `format_money` possède la présentation
  • `render_invoice` possède la numérotation
  • L'interface publique est plus étroite

Même comportement, mêmes tests au vert

Levez la main : laquelle préférez-vous maintenir ? Gardez votre raison en tête.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Complexité, dépendance, obscurité

Nommer les choses avant de les mesurer

Complexité

Tout ce qui rend un système difficile à comprendre ou à modifier.

Dépendance

Du code qui ne peut pas être compris ou changé isolément.

Obscurité

Une information nécessaire qui n'est pas visible là où on en a besoin.

Aucun de ces mots n'est un défaut en soi. Ce sont des grandeurs, pas des jugements.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Ousterhout : la complexité se mesure au changement

Une définition opérationnelle, pas une opinion

Définition

La complexité est tout ce qui, dans la structure d'un système, le rend difficile à comprendre ou à modifier. Elle se juge au coût du changement, pas au nombre de lignes.

Voir: [2] Ousterhout (2018)

Conséquence immédiate : « meilleur » devient une question à laquelle on peut répondre. On choisit un changement, et on compte ce qu'il touche.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

D'où vient la complexité

Amplification, charge cognitive, inconnues inconnues

  • Amplification : la version A répète la présentation monétaire.
  • Charge cognitive : elle mélange calcul, numérotation et affichage.
  • Inconnue inconnue : un nouvel appelant doit connaître `row_index`.

Elle s'accumule

Aucun changement isolé ne crée la complexité. C'est pour cela qu'on ne la corrige pas en une fois, et qu'il faut un critère appliqué en continu.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Comparer deux implémentations

Exemple entièrement traité

Left

`flat_report.py`

Deux expressions possèdent la décision de formatage.

  • Ligne : devise, puis montant
  • Total : devise, puis montant

Right

`hidden_report.py`

Une seule frontière possède la décision de formatage.

  • `format_money` reçoit montant et devise
  • `render_invoice` réutilise cette frontière

Vérification : A touche 2 expressions, B touche 1 frontière

Appliquez le changement dans les deux fichiers, exécutez `verify.py` après avoir adapté l'attendu, puis comparez le diff à la prédiction.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le critère

Terminer l'analyse commencée

La moitié du raisonnement est donnée

Changement demandé : séparer le code et le montant par une espace insécable.

Endroit à modifierVersion AVersion B
Lignes de factureouivia `format_money`
Affichage du total??
Interface publique??
Total des endroits??

À compléter, puis conclure en une phrase

Quelle version choisiriez-vous, et pour quelle raison exprimée en coût de changement ?

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Section

Le découpage

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Parnas : cacher les décisions de conception

Le critère de découpage, énoncé en 1972

Le critère

Découper un système autour des décisions de conception que chaque module cache aux autres, et non autour des étapes du traitement. Une décision qui change reste alors confinée dans un seul module.

Voir: [1] Parnas (1972)

Un article sur un critère, pas sur une technologie. C'est pour cela qu'il a survécu à tous ses outils.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Masquer l'information, pas les étapes

Le découpage par flux est le piège courant

Left

Découpage par flux

Une fonction par étape du traitement.

  • lire → calculer → formater → écrire
  • Le format du fichier est connu de trois modules
  • Changer le format touche trois modules

Right

Découpage par décision

Un module par décision cachée.

  • stockage / calcul / présentation
  • Le format n'est connu que du stockage
  • Changer le format touche un module

Les deux découpages ont le même nombre de fonctions. Un seul confine le changement.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Modules profonds et modules superficiels

Ce que l'interface coûte par rapport à ce qu'elle cache

Left

Module profond

Interface étroite, implémentation substantielle.

  • `store.save(report)`
  • Cache format, chemin, encodage, erreurs
  • L'appelant n'apprend rien de cela

Right

Module superficiel

Interface presque aussi complexe que ce qu'elle cache.

  • `write(path, sep, encoding, mode)`
  • Cache : un appel à `open`
  • L'appelant doit tout savoir quand même

Ce n'est pas une question de taille

La taille ne décide de rien. Ce qui compte est le rapport entre ce que l'interface exige et ce qu'elle épargne.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Découper une fonction enchevêtrée

Et nommer ce que chaque partie cache

Avant : `monthly_report` possède trois décisions

La même fonction connaît le format CSV, la colonne à sommer et la présentation monétaire en EUR.

01

load(path)

Cache : comment les données sont stockées et lues.

02

total(rows)

Cache : ce que « total » signifie ici.

03

render(total)

Cache : devise, format d'affichage, langue.

Vérification

Changez une décision cachée, par exemple le format, et confirmez que la modification reste dans une seule partie. Si elle se répand, le découpage était par flux.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

À vous : découper et justifier

Sans aide, puis défense à l'oral

Consigne

Découpez la fonction distribuée en autant de parties que nécessaire, puis écrivez pour chacune la décision de conception qu'elle cache.

  • Une phrase par partie, commençant par « cache la décision : »
  • Une partie dont vous ne savez pas dire ce qu'elle cache est mal découpée
  • Défense à l'oral : on vous nommera un changement, vous direz ce qu'il touche

5 minutes. Deux groupes passent au tableau.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Quand l'abstraction fuit

Signature propre, appelants qui savent tout

Left

Interface annoncée

`store.load()` renvoie des lignes.

  • L'appelant croit ignorer le stockage

Right

Obligation cachée

L'appelant teste encore `store.kind == csv`.

  • Il retire lui-même l'en-tête du CSV

Le coût d'une fuite

Il se mesure à ce que l'appelant est obligé de savoir. Ici, tout appelant doit connaître le format. La décision n'a jamais été cachée, elle a seulement été déplacée.

On y revient en A2 : un contrat rend explicite ce que l'appelant a le droit de supposer.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Le découpage

Ce qui reste quand le langage change

Un critère, pas une liste de règles

  • La complexité se mesure au coût du changement, pas au nombre de lignes.
  • On découpe autour des décisions cachées, pas des étapes du traitement.
  • La profondeur est un rapport : ce que l'interface exige contre ce qu'elle épargne.
  • Nommer, c'est concevoir : un nom est la plus petite interface qu'un lecteur rencontre.

Ce qui était du Python, et rien d'autre

Les fonctions, les modules, les imports. Les outils changeront ; le critère qui vous a servi à les juger, non.

Coding Week

1A · Coding Week · A1 Programmation structurée · H. Agossou

Appendix

Références