<?xml version="1.0" encoding="UTF-8"?>
<quiz>
<question type="category">
  <category>
    <text>$course$/QCM de NSI/Terminale/Modularité et paradigmes</text>
  </category>
  <info format="html">
    <text><![CDATA[<p>Modularité d'un programme par séparation en modules<br/>
cohérents, paradigmes de programmation (impératif,<br/>
fonctionnel, objet), notion d'abstraction, intérêt<br/>
de la décomposition pour la lisibilité et la<br/>
réutilisation du code.</p>]]></text>
  </info>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q01 : Modularité d'un programme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on la <strong>modularité</strong> d'un<br/>
programme ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Deux notions clés sont à retenir : la<br/>
<strong>cohésion</strong> (un module accomplit une<br/>
tâche, et la fait bien) et le<br/>
<strong>couplage faible</strong> (les modules<br/>
dépendent peu les uns des autres). On<br/>
cherche à maximiser la première et à<br/>
minimiser le second.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa qualité esthétique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La modularité est une propriété<br/>
structurelle objective, et non un<br/>
jugement subjectif sur l'apparence<br/>
du code.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa taille mesurée en nombre de lignes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La taille en lignes ne reflète pas<br/>
la modularité d'un programme. Un<br/>
programme court peut être très peu<br/>
modulaire, et inversement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa rapidité d'exécution</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution est une<br/>
propriété distincte. Un programme<br/>
modulaire peut être rapide ou<br/>
lent ; les deux qualités sont<br/>
indépendantes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Sa décomposition en modules (fonctions, classes, fichiers) cohérents et faiblement couplés entre eux</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un programme modulaire est plus<br/>
lisible, plus testable et plus<br/>
facile à maintenir. La modularité<br/>
est l'un des piliers du génie<br/>
logiciel.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q02 : Paradigme impératif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que le <strong>paradigme impératif</strong><br/>
en programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Caractéristiques de ce paradigme :<br/>
utilisation de variables modifiables,<br/>
de boucles et d'instructions<br/>
séquentielles. Cette approche est<br/>
historiquement liée à l'architecture<br/>
de von Neumann.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une simple variante du paradigme fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les paradigmes impératif et<br/>
fonctionnel sont au contraire<br/>
très différents : ils s'opposent<br/>
notamment sur la place accordée à<br/>
la mutation des variables.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un style de programmation interdit par la loi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale du<br/>
mot « impératif » est sans rapport<br/>
avec son sens informatique. Aucun<br/>
paradigme de programmation n'est<br/>
interdit par une loi.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme inventé en $2020$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme impératif est très<br/>
ancien : il est associé aux<br/>
débuts mêmes de la programmation<br/>
dans les années $1950$.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un style de programmation où l'on donne des instructions à exécuter dans l'ordre, en modifiant l'état du programme par l'intermédiaire de variables</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est le style de programmation le<br/>
plus répandu, présent en C, en<br/>
Pascal, en Java, et partiellement<br/>
en Python. Il consiste à décrire<br/>
« comment faire » étape par<br/>
étape, à la manière d'une<br/>
recette.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q03 : Paradigme fonctionnel</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que le <strong>paradigme<br/>
fonctionnel</strong> en programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Avantages : un code plus prévisible<br/>
(sans effets de bord cachés), un<br/>
parallélisme facilité, et une plus<br/>
grande facilité de test. En<br/>
contrepartie, l'apprentissage peut<br/>
paraître exigeant pour quelqu'un<br/>
habitué au style impératif.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme dédié à la gestion des erreurs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La gestion des erreurs n'est pas<br/>
le sujet propre du paradigme<br/>
fonctionnel. Celui-ci concerne<br/>
plutôt la manière de structurer<br/>
les calculs autour de fonctions<br/>
sans effet de bord.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un style fondé sur l'évaluation de fonctions sans effet de bord, l'immuabilité des données et la composition de fonctions</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les langages purement<br/>
fonctionnels les plus connus sont<br/>
Haskell, Lisp et OCaml. Python<br/>
permet aussi d'adopter certains<br/>
aspects fonctionnels, par exemple<br/>
avec les expressions <code>lambda</code>,<br/>
ou les fonctions <code>map</code> et<br/>
<code>filter</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout simplement un programme qui fonctionne correctement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale du<br/>
mot « fonctionnel » est trompeuse.<br/>
En programmation, le paradigme<br/>
fonctionnel renvoie à un style<br/>
précis, fondé sur l'évaluation de<br/>
fonctions sans effet de bord.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le même paradigme que l'impératif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux paradigmes s'opposent<br/>
sur des points fondamentaux,<br/>
notamment la mutation des<br/>
variables et la présence<br/>
d'effets de bord.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q04 : Paradigme objet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce que la <strong>programmation<br/>
orientée objet</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La programmation orientée objet a été<br/>
formalisée par Alan Kay dans le<br/>
langage Smalltalk en $1972$. Elle<br/>
est particulièrement adaptée pour<br/>
modéliser des entités du monde réel<br/>
(Voiture, Personne, Compte<br/>
bancaire). Pour des problèmes<br/>
simples, elle peut toutefois<br/>
alourdir inutilement le code.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le fait de coder en utilisant des objets physiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation littérale est<br/>
sans rapport avec le sens<br/>
informatique. Les objets en<br/>
programmation orientée objet sont<br/>
des entités logicielles<br/>
abstraites, pas des objets<br/>
physiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme aujourd'hui obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Au contraire, la programmation<br/>
orientée objet reste très utilisée<br/>
dans le monde du logiciel, et<br/>
notamment dans les grands projets<br/>
industriels.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une bibliothèque graphique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme objet est une manière<br/>
d'organiser le code en général,<br/>
et non une bibliothèque<br/>
particulière dédiée à<br/>
l'affichage.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Un style structurant le code autour d'objets (instances de classes) qui combinent données (les attributs) et comportements (les méthodes)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Java, C++, Python et Ruby sont<br/>
des langages très utilisés en<br/>
programmation orientée objet. Au<br/>
programme officiel : la définition<br/>
d'une classe, ses attributs, ses<br/>
méthodes, et la création<br/>
d'instances.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q05 : Abstraction</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on <strong>abstraction</strong> en<br/>
programmation ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Tous les langages offrent des<br/>
mécanismes d'abstraction : les<br/>
fonctions, les modules, les classes,<br/>
les types abstraits. Un bon design<br/>
logiciel exploite ces mécanismes au<br/>
maximum pour produire un code<br/>
lisible et maintenable.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un paradigme de programmation particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'abstraction est plus large<br/>
qu'un paradigme : elle traverse<br/>
tous les paradigmes (impératif,<br/>
fonctionnel, objet) et fait<br/>
partie du vocabulaire général de<br/>
la programmation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une notion appartenant aux mathématiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot « abstraction » a un sens<br/>
précis en mathématiques, mais on<br/>
parle ici de son sens<br/>
informatique : cacher les détails<br/>
d'une implémentation derrière une<br/>
interface.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le fait de cacher les détails d'une implémentation derrière une interface simple, de sorte que l'utilisateur d'une fonction n'ait pas à savoir comment elle est codée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Par exemple, on utilise<br/>
<code>len(liste)</code> sans avoir besoin de<br/>
connaître l'implémentation de<br/>
cette fonction. L'abstraction est<br/>
le fondement même de la<br/>
modularité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une obligation imposée par la loi</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'abstraction est un principe de<br/>
conception, sans rapport avec une<br/>
quelconque obligation légale.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q06 : Pourquoi découper un programme ?</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi <strong>découper un programme</strong> en<br/>
plusieurs fonctions ou modules ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une maxime classique du génie<br/>
logiciel résume bien cette idée :<br/>
« une fonction, une responsabilité ».<br/>
Si une fonction effectue plusieurs<br/>
tâches distinctes, mieux vaut la<br/>
scinder en autant de fonctions que<br/>
de responsabilités identifiées.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Pour améliorer la lisibilité, la réutilisation, la testabilité et la maintenance du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un programme découpé en petites<br/>
unités cohérentes est nettement<br/>
plus facile à comprendre, à<br/>
tester et à faire évoluer dans<br/>
le temps.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour gagner quelques secondes lors de la compilation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le gain en compilation, s'il<br/>
existe, est marginal et ne<br/>
constitue pas l'objectif<br/>
principal du découpage en<br/>
modules.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour rendre le code plus complexe</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>C'est exactement l'inverse. Le<br/>
découpage vise à <strong>simplifier</strong><br/>
le code en le structurant en<br/>
petites unités intelligibles.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune raison particulière ne le justifie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le découpage répond au contraire à<br/>
plusieurs objectifs concrets,<br/>
comme expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q07 : Paradigmes du langage Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel paradigme <strong>dominant</strong> caractérise<br/>
le langage Python ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python est un langage multi-paradigmes<br/>
par conception. De nombreux langages<br/>
modernes le sont également<br/>
(JavaScript, Scala, Kotlin). Cette<br/>
flexibilité permet de choisir le<br/>
meilleur outil pour chaque situation.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Python est un langage multi-paradigmes : il permet de combiner les styles impératif, objet et fonctionnel selon les besoins</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python permet de mélanger<br/>
librement les différents styles<br/>
de programmation. C'est un<br/>
langage très flexible, qui laisse<br/>
au programmeur le soin de<br/>
choisir l'approche la plus<br/>
adaptée au problème traité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le paradigme objet</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python est certes très orienté<br/>
objet en interne (toute valeur<br/>
est un objet), mais il accepte<br/>
parfaitement d'autres styles de<br/>
programmation, à commencer par<br/>
le style impératif.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le paradigme impératif</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python ne se limite pas au style<br/>
impératif : il offre des outils<br/>
fonctionnels (<code>lambda</code>, <code>map</code>,<br/>
compréhensions) et un système<br/>
objet complet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement le paradigme fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python n'est pas un langage<br/>
purement fonctionnel. Il accepte<br/>
la mutation des variables et les<br/>
effets de bord, qui sont au<br/>
contraire évités en<br/>
programmation purement<br/>
fonctionnelle.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q08 : Importer un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, comment <strong>importe-t-on</strong> des<br/>
fonctions définies dans un module<br/>
<code>outils.py</code> situé à côté du fichier<br/>
principal ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La modularité en Python repose sur<br/>
les modules, qui sont de simples<br/>
fichiers d'extension <code>.py</code>, et sur<br/>
les paquets, qui sont des dossiers<br/>
contenant un fichier <code>__init__.py</code>.<br/>
Ce mécanisme est simple à mettre en<br/>
œuvre.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec une directive <code>include outils.py</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La directive <code>include</code> existe en<br/>
C ou en C++, mais pas en<br/>
Python. Le mécanisme d'import<br/>
est différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec <code>import outils</code> (puis <code>outils.fonction()</code>), ou avec <code>from outils import fonction</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce sont les deux syntaxes<br/>
standard. La première préserve<br/>
l'espace de noms du module ; la<br/>
seconde permet d'utiliser<br/>
directement la fonction<br/>
importée, sans préfixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec l'instruction <code>use outils</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La syntaxe <code>use</code> n'existe pas en<br/>
Python. C'est le mot-clé<br/>
<code>import</code> qu'il faut utiliser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune syntaxe ne permet ce type d'import</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Python propose au contraire un<br/>
mécanisme d'import très complet,<br/>
comme indiqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q09 : Avantage de la réutilisation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est le <strong>principal avantage</strong> de la<br/>
réutilisation de code déjà écrit ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à se<br/>
familiariser avec la bibliothèque<br/>
standard de son langage avant<br/>
d'écrire du code soi-même. Beaucoup<br/>
de problèmes ont déjà une solution<br/>
éprouvée disponible.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code s'exécute plus rapidement</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution n'est<br/>
pas systématiquement améliorée<br/>
par la réutilisation. Une<br/>
bibliothèque générique peut<br/>
parfois être plus lente qu'une<br/>
implémentation spécialisée.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>On code plus rapidement, et avec moins de bugs, car le code réutilisé a déjà été testé</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Plutôt que de tout réinventer, on<br/>
s'appuie sur du code existant,<br/>
qu'il s'agisse de la<br/>
bibliothèque standard du langage<br/>
ou de bibliothèques externes<br/>
reconnues. Cela permet un effet<br/>
d'échelle : un même code testé<br/>
sert à de nombreux programmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun avantage particulier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La réutilisation apporte au<br/>
contraire des bénéfices<br/>
importants, comme expliqué dans<br/>
la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code occupe moins d'espace</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La place occupée n'est pas le<br/>
critère principal. La<br/>
réutilisation peut même<br/>
augmenter la taille du programme<br/>
si la bibliothèque utilisée est<br/>
volumineuse.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q10 : Décomposition typique</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pour calculer la moyenne d'une liste<br/>
de notes lue dans un fichier au format<br/>
CSV, quelle décomposition est la <strong>plus<br/>
propre</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le principe de <strong>séparation des<br/>
préoccupations</strong> consiste à isoler<br/>
les entrées-sorties, le calcul, et<br/>
la présentation des résultats. C'est<br/>
une architecture classique, simple<br/>
et robuste.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'utiliser aucune fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Écrire un programme entier sans<br/>
aucune fonction est une mauvaise<br/>
pratique. Le découpage en<br/>
fonctions reste essentiel à la<br/>
lisibilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Tout placer dans une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une fonction qui mélange lecture,<br/>
calcul et affichage est plus<br/>
difficile à tester et à<br/>
réutiliser. Mieux vaut séparer<br/>
ces responsabilités.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Trois fonctions distinctes, par exemple <code>lire_csv</code>, <code>calculer_moyenne</code> et <code>afficher_resultat</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Chaque fonction a alors une<br/>
responsabilité claire et unique.<br/>
Chacune peut être testée<br/>
indépendamment et réutilisée<br/>
ailleurs dans le programme ou<br/>
dans un autre projet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une seule fonction qui ne fait qu'un appel à <code>print</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette décomposition est trop<br/>
minimaliste. Aucune des<br/>
opérations principales (lecture,<br/>
calcul) n'est isolée dans sa<br/>
propre fonction.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q11 : Instancier une classe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, comment crée-t-on un objet<br/>
(une <strong>instance</strong>) à partir de la<br/>
classe <code>Voiture</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Pour créer une instance, on appelle<br/>
simplement la classe en lui passant<br/>
les paramètres voulus, par exemple<br/>
<code>v = Voiture("Renault", 2020)</code>.<br/>
Python crée alors l'objet et<br/>
appelle automatiquement la méthode<br/>
spéciale <code>__init__</code> pour<br/>
l'initialiser.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>v = Voiture.instance()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>instance()</code> n'est<br/>
pas la syntaxe standard<br/>
d'instanciation en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la syntaxe <code>v = Voiture()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>On appelle la classe comme une<br/>
fonction. Cet appel déclenche<br/>
l'exécution de la méthode<br/>
<code>__init__</code> et renvoie le nouvel<br/>
objet créé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec <code>v = create(Voiture)</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune fonction <code>create</code> n'est<br/>
présente dans la bibliothèque<br/>
standard de Python pour<br/>
instancier une classe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la syntaxe <code>v = new Voiture()</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La syntaxe <code>new</code> existe en Java<br/>
ou en JavaScript, mais elle<br/>
n'est pas utilisée en Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q12 : Accéder à un attribut</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Soit l'instance<br/>
<code>v = Voiture("Peugeot", 2020)</code>. Comment<br/>
accède-t-on à l'attribut <code>marque</code> de<br/>
cet objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La notation <code>objet.attribut</code><br/>
permet de lire ou de modifier un<br/>
attribut. La notation<br/>
<code>objet.methode(...)</code> permet<br/>
d'appeler une méthode définie sur<br/>
l'objet.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la notation <code>v::marque</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le double deux-points est<br/>
utilisé en C++ (résolution de<br/>
portée), mais pas en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la notation <code>v[marque]</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les crochets servent à indexer<br/>
une liste ou un dictionnaire,<br/>
et non à accéder à l'attribut<br/>
d'un objet.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Avec la notation <code>v.marque</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La notation pointée permet<br/>
d'accéder aussi bien aux<br/>
attributs qu'aux méthodes d'un<br/>
objet. C'est la syntaxe<br/>
standard en Python.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec la notation <code>v-&gt;marque</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La flèche <code>-&gt;</code> est utilisée en<br/>
C ou en C++, mais pas en<br/>
Python.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q13 : Fonction pure</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'est-ce qu'une <strong>fonction pure</strong>, au<br/>
sens du paradigme fonctionnel ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Un avantage important des<br/>
fonctions pures est qu'elles<br/>
autorisent la <strong>mémoïsation</strong>, qui<br/>
consiste à mettre en cache les<br/>
résultats déjà calculés. Ces<br/>
fonctions facilitent aussi le<br/>
raisonnement mathématique sur le<br/>
programme.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui ne prend aucun paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de paramètres n'a<br/>
aucun rapport avec la pureté<br/>
d'une fonction. Une fonction<br/>
pure peut prendre zéro, un ou<br/>
plusieurs paramètres.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction écrite dans un langage mathématique</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette description est trop<br/>
vague. Une fonction pure se<br/>
définit précisément par<br/>
l'absence d'effet de bord et<br/>
par sa déterministicité, et non<br/>
par son expression dans un<br/>
langage particulier.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction qui ne contient aucun bug</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La pureté n'a aucun rapport<br/>
avec l'absence de bugs. Une<br/>
fonction pure peut très bien<br/>
être incorrecte ; inversement,<br/>
une fonction avec effets de<br/>
bord peut être correcte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Une fonction qui, pour les mêmes paramètres, renvoie toujours la même valeur, sans aucun effet de bord (pas de modification d'une variable globale, pas d'entrée-sortie)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce type de fonction est<br/>
prévisible, facilement<br/>
testable, et permet une<br/>
parallélisation aisée. Un<br/>
exemple : <code>def carre(x): return<br/>
x * x</code>. À l'inverse, une<br/>
fonction comme<br/>
<code>def lire_fichier(f)</code> n'est<br/>
pas pure, car elle effectue<br/>
une opération<br/>
d'entrée-sortie.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q14 : Une fonction, une responsabilité</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que recommande le principe<br/>
« <strong>une fonction, une<br/>
responsabilité</strong> » ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Si une fonction <code>traiter</code> lit un<br/>
fichier, effectue des calculs et<br/>
écrit le résultat, mieux vaut la<br/>
scinder en trois fonctions<br/>
distinctes, chacune dédiée à une<br/>
seule responsabilité.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Un programme ne doit posséder qu'une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation est<br/>
incorrecte. Un programme<br/>
contient en général de<br/>
nombreuses fonctions, chacune<br/>
ayant sa responsabilité<br/>
propre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Chaque fichier doit contenir une seule fonction</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un module peut tout à fait<br/>
contenir plusieurs fonctions<br/>
liées à un même thème. Ce<br/>
principe ne porte pas sur<br/>
l'organisation des fichiers.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Chaque fonction doit prendre exactement un seul paramètre</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de paramètres n'a<br/>
aucun rapport avec ce<br/>
principe, qui concerne la<br/>
tâche accomplie par la<br/>
fonction.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Chaque fonction doit accomplir une seule tâche clairement définie</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Ce principe est l'un des piliers<br/>
de la modularité. Une fonction<br/>
à responsabilité unique est<br/>
plus fiable, plus lisible et<br/>
plus facile à tester. Si l'on<br/>
ne peut pas décrire une<br/>
fonction en une phrase courte,<br/>
il vaut mieux la découper.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q15 : Interface d'un module</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que désigne l'<strong>interface</strong> d'un<br/>
module ou d'une fonction ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne pratique consiste à<br/>
« programmer contre une interface,<br/>
pas contre une implémentation ».<br/>
Cela rend le code robuste face<br/>
aux changements internes des<br/>
modules dont il dépend.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Uniquement la documentation du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La documentation décrit<br/>
l'interface, mais l'interface<br/>
elle-même est un concept plus<br/>
large : elle inclut aussi la<br/>
signature effective des<br/>
fonctions et leur<br/>
comportement.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>L'ensemble des points d'accès publics (signature, paramètres attendus, valeurs renvoyées, exceptions levées) que les utilisateurs peuvent consulter sans connaître l'implémentation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>L'interface joue le rôle d'un<br/>
contrat public. Tant que ce<br/>
contrat est respecté, on peut<br/>
modifier l'implémentation sans<br/>
impacter les utilisateurs du<br/>
module.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le code source du module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le code source représente<br/>
l'<strong>implémentation</strong> du module,<br/>
c'est-à-dire la manière dont il<br/>
fonctionne en interne. C'est<br/>
précisément ce que l'interface<br/>
cherche à masquer.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Sa couleur d'affichage dans l'éditeur</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La couleur d'affichage relève<br/>
des préférences de l'éditeur,<br/>
et non de la définition d'une<br/>
interface en programmation.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q16 : Style fonctionnel</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Laquelle de ces écritures est la plus<br/>
<strong>proche du style fonctionnel</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques outils fonctionnels en<br/>
Python : <code>map</code>, <code>filter</code>,<br/>
<code>reduce</code>, <code>lambda</code>, <code>zip</code> et<br/>
<code>enumerate</code>. Ils sont<br/>
idiomatiques mais doivent être<br/>
utilisés avec discernement, sans<br/>
sacrifier la lisibilité.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>carres = list(map(lambda x: x * x, liste))</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La fonction <code>map</code> applique une<br/>
fonction à chaque élément<br/>
d'une collection, et <code>lambda</code><br/>
permet de définir une fonction<br/>
anonyme à la volée. C'est<br/>
l'écriture la plus<br/>
caractéristique du style<br/>
fonctionnel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>carres = liste.map(square)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe n'est pas<br/>
valide en Python : les listes<br/>
ne possèdent pas de méthode<br/>
<code>map</code>. La fonction <code>map</code> est<br/>
une fonction native qui<br/>
s'utilise différemment.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>carres = []
for x in liste:
    carres.append(x * x)</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette écriture est typique du<br/>
style impératif, avec une<br/>
boucle et des modifications<br/>
successives d'une variable.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>carres = [x * x for x in liste]</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette compréhension de liste<br/>
adopte un style proche du<br/>
fonctionnel, mais l'écriture<br/>
la plus emblématique du style<br/>
fonctionnel utilise plutôt les<br/>
fonctions <code>map</code> ou <code>filter</code><br/>
combinées à des fonctions<br/>
anonymes.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q17 : Bibliothèques standard</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Pourquoi est-il préférable de<br/>
privilégier les <strong>bibliothèques<br/>
standard</strong> plutôt que de tout coder<br/>
soi-même ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Quelques bibliothèques standard<br/>
utiles en Python : <code>math</code>,<br/>
<code>random</code>, <code>csv</code>, <code>json</code>, <code>os</code>,<br/>
<code>datetime</code>, <code>collections</code>,<br/>
<code>itertools</code>. À cela s'ajoute un<br/>
écosystème externe très riche,<br/>
avec des bibliothèques comme<br/>
NumPy, pandas ou requests.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucun avantage à utiliser des bibliothèques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les bibliothèques apportent au<br/>
contraire de nombreux<br/>
avantages, comme détaillé dans<br/>
la bonne réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Parce que les bibliothèques standard sont obligatoires à utiliser</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune obligation n'est<br/>
imposée. C'est une question<br/>
de choix raisonné, et non de<br/>
contrainte.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Pour ralentir volontairement le programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucune bibliothèque n'est<br/>
conçue pour ralentir un<br/>
programme. La performance<br/>
n'est pas le critère<br/>
principal pour préférer une<br/>
bibliothèque, mais la qualité<br/>
et la fiabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le code des bibliothèques standard est de qualité, testé par de nombreux utilisateurs, documenté et maintenu</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La probabilité de produire un<br/>
meilleur code seul, en<br/>
quelques heures, qu'une<br/>
bibliothèque standard<br/>
maintenue depuis des années<br/>
est très faible. Sauf cas<br/>
particuliers (apprentissage,<br/>
contraintes spécifiques), la<br/>
réutilisation est plus sage.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q18 : Le paramètre self</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Dans la définition d'une méthode<br/>
Python, à quoi sert le premier<br/>
paramètre, traditionnellement nommé<br/>
<code>self</code> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Lors d'un appel comme<br/>
<code>v.afficher()</code>, Python transmet<br/>
automatiquement l'objet <code>v</code><br/>
comme premier paramètre <code>self</code>.<br/>
La méthode peut alors lire ou<br/>
modifier les attributs de <code>v</code><br/>
via la notation<br/>
<code>self.attribut</code>.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>C'est un mot-clé réservé qu'il ne faut jamais modifier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nom <code>self</code> est une simple<br/>
convention, et non un mot-clé<br/>
réservé du langage. On<br/>
pourrait techniquement<br/>
l'appeler autrement, mais ce<br/>
serait fortement déconseillé,<br/>
car cela briserait les<br/>
habitudes des autres<br/>
développeurs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il représente la classe elle-même, pas l'instance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre <code>self</code> représente<br/>
précisément l'<strong>instance</strong><br/>
(l'objet créé), et non la<br/>
classe. Pour désigner la<br/>
classe elle-même, on utilise<br/>
plutôt <code>cls</code> dans les<br/>
méthodes de classe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Il est rempli automatiquement avec la valeur $0$</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre <code>self</code> reçoit<br/>
l'objet courant lors de<br/>
l'appel, et non une valeur<br/>
numérique fixe.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Il désigne l'instance sur laquelle la méthode est appelée</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paramètre <code>self</code> permet à<br/>
la méthode d'accéder aux<br/>
attributs et aux autres<br/>
méthodes de l'objet courant,<br/>
par exemple <code>self.marque</code>. Il<br/>
fait le lien entre la méthode<br/>
appelée et l'objet sur lequel<br/>
elle s'exécute.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q19 : Classe et instance</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quelle est la différence entre une<br/>
<strong>classe</strong> et une <strong>instance</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une classe peut avoir aucune,<br/>
une, ou de très nombreuses<br/>
instances. Chaque instance<br/>
possède son propre état (ses<br/>
propres valeurs d'attributs),<br/>
mais les méthodes restent<br/>
définies une seule fois, dans<br/>
la classe.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux notions sont au<br/>
contraire bien distinctes,<br/>
comme expliqué dans la bonne<br/>
réponse.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La notion d'instance est aujourd'hui obsolète</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La notion d'instance reste<br/>
centrale en programmation<br/>
orientée objet : c'est l'objet<br/>
concret manipulé au cours de<br/>
l'exécution.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>La classe est le « plan » général (la description abstraite). L'instance est un objet concret créé à partir de ce plan</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Une analogie utile : la<br/>
classe est comme un moule à<br/>
gâteaux, et les instances<br/>
sont les gâteaux eux-mêmes.<br/>
On écrit <code>class Voiture:</code><br/>
pour définir une classe et<br/>
<code>ma_voiture = Voiture()</code> pour<br/>
en créer une instance.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La classe s'exécute plus rapidement que l'instance</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité d'exécution n'est<br/>
pas la différence pertinente<br/>
entre classe et instance. Ce<br/>
sont deux notions distinctes,<br/>
pas deux variantes d'un même<br/>
concept.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q20 : Choisir un paradigme</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel paradigme de programmation<br/>
faut-il privilégier ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La tendance moderne est aux<br/>
langages multi-paradigmes, qui<br/>
permettent de mélanger les<br/>
meilleurs aspects de chaque<br/>
approche selon le contexte.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme objet, dans tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette position est trop<br/>
dogmatique. Aucun paradigme<br/>
n'est universellement<br/>
supérieur aux autres ; le<br/>
choix dépend du problème à<br/>
résoudre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme fonctionnel, dans tous les cas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette position est elle<br/>
aussi trop dogmatique. Le<br/>
paradigme fonctionnel<br/>
excelle pour les<br/>
transformations de données,<br/>
mais il n'est pas toujours<br/>
le plus naturel pour tous<br/>
les problèmes.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>N'importe quel paradigme convient toujours</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Il existe souvent un choix<br/>
plus pertinent qu'un autre,<br/>
en fonction de la nature du<br/>
problème à résoudre.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le choix dépend du problème : le paradigme objet pour modéliser des entités complexes ; le paradigme fonctionnel pour des transformations de données ; le paradigme impératif pour des algorithmes simples et directs</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Aucun paradigme n'est<br/>
universellement meilleur. Un<br/>
bon programmeur sait choisir<br/>
l'outil adapté au contexte.<br/>
Beaucoup de programmes<br/>
modernes mélangent<br/>
d'ailleurs plusieurs<br/>
paradigmes au sein d'un même<br/>
projet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q21 : Couplage entre modules</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Qu'appelle-t-on le <strong>couplage</strong> entre<br/>
modules ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une astuce utile : si l'on ne<br/>
peut pas modifier un module sans<br/>
en regarder cinq autres, le<br/>
couplage est trop fort. Il faut<br/>
alors refactoriser, par exemple<br/>
en introduisant des interfaces<br/>
claires et en isolant les<br/>
dépendances.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le nombre de fonctions définies dans chaque module</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le nombre de fonctions est<br/>
une mesure de taille, pas une<br/>
mesure de dépendance entre<br/>
modules.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une union solennelle entre deux modules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette interprétation<br/>
littérale est sans rapport<br/>
avec le sens technique du mot<br/>
« couplage » en<br/>
programmation.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une opération mathématique sur les modules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le mot « couplage » est ici<br/>
utilisé dans un sens<br/>
informatique précis, sans<br/>
rapport avec une opération<br/>
mathématique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le degré de dépendance entre modules. On vise un couplage faible, c'est-à-dire des modules peu liés, modifiables indépendamment les uns des autres</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Un couplage faible permet de<br/>
remplacer ou de modifier un<br/>
module sans avoir à toucher<br/>
aux autres. Un couplage fort,<br/>
au contraire, impose de<br/>
modifier plusieurs modules<br/>
simultanément à chaque<br/>
changement.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q22 : Piège classique de la programmation orientée objet</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel est un <strong>piège classique</strong> de la<br/>
programmation orientée objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Une bonne maxime : choisir<br/>
l'outil adapté au problème. Une<br/>
classe pour seulement deux<br/>
fonctions s'apparente à un<br/>
empilement inutile. À partir<br/>
d'une méthode importante avec<br/>
un état persistant, la classe<br/>
devient en revanche pertinente.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Coder de manière trop simple</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le piège évoqué ici est<br/>
précisément l'inverse :<br/>
c'est l'excès de complexité<br/>
qui pose problème, pas la<br/>
simplicité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La programmation orientée objet ne présente aucun piège</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Comme tout paradigme, la<br/>
programmation orientée objet<br/>
a ses pièges, dont l'excès<br/>
de modélisation est l'un des<br/>
plus classiques.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Modéliser sous forme de classes des situations qui ne le justifient pas, ce qui complique inutilement le code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Pour calculer une simple<br/>
somme de notes, il n'est pas<br/>
nécessaire de créer une<br/>
classe <code>CalculateurDeMoyenne</code>.<br/>
Une fonction suffit<br/>
largement. La programmation<br/>
orientée objet a un coût en<br/>
complexité qu'il faut savoir<br/>
peser.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Utiliser des fonctions classiques</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Utiliser des fonctions n'est<br/>
pas un piège ; c'est au<br/>
contraire souvent la bonne<br/>
solution face à des<br/>
problèmes simples.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q23 : Définir une classe</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Quel squelette permet de définir une<br/>
classe <code>Point</code> avec deux attributs <code>x</code><br/>
et <code>y</code> initialisés à la création ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Le constructeur s'écrit<br/>
toujours sous la forme<br/>
<code>def __init__(self, …):</code> et<br/>
stocke les paramètres reçus<br/>
dans <code>self</code>. Pour instancier la<br/>
classe, on écrit par exemple<br/>
<code>p = Point(3, 4)</code> ; ensuite,<br/>
<code>p.x</code> vaut $3$ et <code>p.y</code> vaut<br/>
$4$.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>def Point(x, y):
    self.x = x
    self.y = y</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette définition utilise<br/>
<code>def</code>, qui définit une<br/>
fonction, et non une classe.<br/>
Il manque le mot-clé<br/>
<code>class</code>.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>class Point(x, y):
    return x, y</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les parenthèses qui suivent<br/>
le nom d'une classe ne<br/>
servent pas à déclarer ses<br/>
attributs. Une définition<br/>
de classe ne renvoie pas<br/>
non plus de valeur.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<pre><code>class Point:
    x, y</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette syntaxe n'est pas<br/>
valide en Python. De plus,<br/>
aucun attribut ne serait<br/>
initialisé.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<pre><code>class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y</code></pre>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La méthode <code>__init__</code> est<br/>
appelée automatiquement à la<br/>
création de l'objet. Elle<br/>
reçoit <code>self</code>, puis les<br/>
valeurs initiales, et les<br/>
stocke en tant qu'attributs<br/>
de l'instance.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q24 : Paradigme déclaratif</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En quoi le paradigme <strong>déclaratif</strong><br/>
se distingue-t-il du paradigme<br/>
impératif ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>La tendance moderne est de<br/>
monter en abstraction, en<br/>
déclarant ce que l'on veut<br/>
plutôt qu'en décrivant<br/>
l'implémentation. Par exemple,<br/>
la bibliothèque React (style<br/>
déclaratif) s'oppose au style<br/>
impératif d'une bibliothèque<br/>
comme jQuery.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Aucune différence n'existe entre les deux paradigmes</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Les deux paradigmes<br/>
diffèrent au contraire de<br/>
manière fondamentale dans<br/>
la manière de formuler le<br/>
problème.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme déclaratif n'existe pas</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme déclaratif<br/>
existe bel et bien et est<br/>
utilisé dans de très<br/>
nombreux langages<br/>
spécialisés.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Le paradigme déclaratif dit ce que l'on veut, sans préciser comment l'obtenir (SQL, HTML, expressions régulières) ; le paradigme impératif, à l'inverse, décrit comment faire étape par étape</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Le paradigme fonctionnel et<br/>
le paradigme logique<br/>
(Prolog) sont deux variantes<br/>
déclaratives. Le langage<br/>
SQL est typiquement<br/>
déclaratif : on demande<br/>
« les noms des étudiants<br/>
ayant obtenu plus de $10$ »<br/>
sans préciser comment<br/>
effectuer la recherche.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme déclaratif est plus rapide à exécuter</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>La rapidité n'est pas le<br/>
critère pertinent. La<br/>
distinction porte sur la<br/>
manière d'exprimer le<br/>
problème.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q25 : Synthèse</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Parmi les affirmations suivantes<br/>
sur la modularité et les<br/>
paradigmes, laquelle est<br/>
<strong>fausse</strong> ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Les langages purement<br/>
fonctionnels les plus connus<br/>
sont Haskell et Idris. Les<br/>
langages multi-paradigmes<br/>
incluent Python, JavaScript,<br/>
Scala et OCaml.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Python est un langage purement fonctionnel</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est fausse<br/>
(donc c'est la bonne<br/>
réponse). Python est un<br/>
langage <strong>multi-paradigmes</strong>.<br/>
Il prend en charge des<br/>
aspects fonctionnels<br/>
(<code>lambda</code>, <code>map</code>,<br/>
compréhensions), mais il<br/>
autorise aussi la mutation<br/>
des variables et les effets<br/>
de bord, ce qui n'est pas<br/>
possible dans un langage<br/>
purement fonctionnel.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>La modularité améliore la maintenabilité du code</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. La modularité est<br/>
précisément un facteur clé<br/>
de maintenabilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Une fonction pure n'a pas d'effet de bord</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. L'absence d'effet<br/>
de bord est précisément ce<br/>
qui définit une fonction<br/>
pure.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Le paradigme objet structure le code autour d'objets combinant données et comportements</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Cette affirmation est<br/>
correcte. C'est même la<br/>
définition du paradigme<br/>
objet.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q26 : Encapsulation</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>Que désigne le principe<br/>
d'<strong>encapsulation</strong> en programmation<br/>
orientée objet ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>L'encapsulation favorise le<br/>
couplage faible : un objet expose<br/>
uniquement ce dont les autres ont<br/>
besoin (son interface publique) et<br/>
cache le reste. C'est la base du<br/>
principe « programmer contre une<br/>
interface, pas contre une<br/>
implémentation ».</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Réutiliser les classes<br/>
d'un autre programme</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la réutilisation est<br/>
un autre concept (lié à la<br/>
modularité). L'encapsulation<br/>
concerne le <strong>masquage</strong> des<br/>
détails internes derrière une<br/>
interface publique.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Mettre tout le code d'une<br/>
application dans un seul fichier</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : c'est l'inverse de la<br/>
modularité. L'encapsulation va<br/>
précisément dans le sens<br/>
opposé : on isole les<br/>
responsabilités dans des objets<br/>
(ou modules) distincts.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Compresser un fichier avant de<br/>
l'envoyer</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la compression de<br/>
données est sans rapport avec<br/>
le concept d'encapsulation. Le<br/>
terme « encapsulation » a un<br/>
sens informatique précis,<br/>
différent.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>Regrouper dans un même objet les<br/>
données (attributs) et les<br/>
traitements (méthodes) qui<br/>
s'appliquent à ces données, en<br/>
masquant à l'extérieur les<br/>
détails d'implémentation</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est l'un des<br/>
piliers de la programmation<br/>
orientée objet. L'utilisateur<br/>
d'un objet manipule l'interface<br/>
publique (les méthodes) sans<br/>
dépendre du fonctionnement<br/>
interne (les attributs). On<br/>
peut alors modifier<br/>
l'implémentation sans casser<br/>
le code utilisateur, tant que<br/>
l'interface reste stable.</p>]]></text>
    </feedback>
  </answer>
</question>

<question type="multichoice">
  <name>
    <text>Modularité et paradigmes — Q27 : Convention de visibilité en Python</text>
  </name>
  <questiontext format="html">
    <text><![CDATA[<p>En Python, comment indique-t-on<br/>
conventionnellement qu'un attribut<br/>
ou une méthode est destiné à un<br/>
usage <strong>interne</strong> (et ne fait pas<br/>
partie de l'interface publique) ?</p>]]></text>
  </questiontext>
  <generalfeedback format="html">
    <text><![CDATA[<p>Python privilégie la philosophie<br/>
« We are all consenting adults »<br/>
(« nous sommes tous des adultes<br/>
consentants ») : le langage ne<br/>
bloque rien, mais la convention<br/>
de l'unique soulignement signale<br/>
qu'on ne doit pas accéder à<br/>
l'attribut depuis l'extérieur.<br/>
C'est moins strict qu'en Java ou<br/>
en C++, mais plus souple.</p>]]></text>
  </generalfeedback>
  <defaultgrade>1.0</defaultgrade>
  <penalty>0.0</penalty>
  <hidden>0</hidden>
  <single>true</single>
  <shuffleanswers>true</shuffleanswers>
  <answernumbering>abc</answernumbering>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En écrivant le nom en majuscules</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : la convention des<br/>
majuscules désigne plutôt les<br/>
<strong>constantes</strong> en Python<br/>
(<code>PI</code>, <code>MAX_SIZE</code>). Elle n'a<br/>
aucun rapport avec la<br/>
visibilité.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>En préfixant le nom par un dièse<br/>
(<code>#nom</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le dièse n'a pas ce<br/>
rôle en Python. Il introduit<br/>
un commentaire de fin de<br/>
ligne, ce qui n'a aucun<br/>
rapport avec la visibilité<br/>
des attributs.</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="100" format="html">
    <text><![CDATA[<p>En préfixant son nom par un<br/>
unique caractère de soulignement<br/>
(par exemple <code>_etat_interne</code>)</p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Bonne réponse : c'est la<br/>
convention pythonique. Cet<br/>
unique préfixe ne change rien<br/>
au niveau du langage (l'accès<br/>
reste possible techniquement),<br/>
mais il indique clairement aux<br/>
autres développeurs que<br/>
l'attribut ne fait pas partie<br/>
de l'API publique. C'est une<br/>
forme d'encapsulation par<br/>
convention. Le double<br/>
soulignement (<code>__nom</code>)<br/>
déclenche en plus le<br/>
<em>name mangling</em> (renommage<br/>
interne).</p>]]></text>
    </feedback>
  </answer>
  <answer fraction="0" format="html">
    <text><![CDATA[<p>Avec le mot-clé <code>private</code></p>]]></text>
    <feedback format="html">
      <text><![CDATA[<p>Erreur : le mot-clé <code>private</code><br/>
existe en Java, en C++, en<br/>
C#, mais pas en Python. Le<br/>
langage ne permet pas de<br/>
rendre un attribut<br/>
strictement privé : tout<br/>
repose sur des conventions.</p>]]></text>
    </feedback>
  </answer>
</question>

</quiz>
