Quiz d'auto-évaluation
Présentation & objectifs
Les quiz suivants sont là pour vous aider à vérifier que vous avez compris les articles que vous deviez étudier. À la fin d’un quiz, vous recevrez des explications sur vos réponses.
Ces quiz sont fournis pour l’auto-évaluation et ne seront pas notés ni stockés.
N’hésitez pas à nous contacter sur le serveur Discord pour toute précision/explication !
Quiz
Exceptions et assertions
# Qu'est-ce qu'une exception en programmation ?
- [x] Un événement qui perturbe le flux normal d'un programme
> ✅ Les exceptions sont des événements qui se produisent pendant l'exécution d'un programme et perturbent son flux normal.
- [ ] Une erreur qui termine toujours le programme
> ❌ Les exceptions ne terminent pas nécessairement un programme ; elles peuvent être attrapées et gérées.
- [x] Une erreur qui peut être attrapée et gérée par le programme
> ✅ Les programmes peuvent attraper et gérer les exceptions pour prévenir les plantages et maintenir une exécution fluide.
- [ ] Un type de boucle en programmation
> ❌ Les exceptions ne sont pas des boucles ; elles sont des mécanismes pour gérer les erreurs pendant l'exécution.
- [x] Un événement levé quand des données invalides ou un fichier manquant est rencontré
> ✅ Les exceptions sont souvent levées quand des données invalides sont fournies ou qu'un fichier requis est manquant.
# Quel est le but du bloc `try-except` ?
- [x] Attraper les exceptions qui peuvent se produire dans un bloc d'instructions
> ✅ Le bloc `try-except` est utilisé pour attraper et gérer les exceptions, empêchant le programme de planter.
- [ ] Boucler à travers un bloc de code de manière répétée
> ❌ Le bloc `try-except` n'est pas une boucle ; c'est pour la gestion d'erreurs.
- [x] Gérer des types spécifiques d'exceptions
> ✅ La clause `except` peut spécifier le type d'exception à gérer.
- [ ] Terminer le programme quand une erreur se produit
> ❌ Le bloc `try-except` est conçu pour empêcher le programme de se terminer en gérant les exceptions.
- [x] Fournir une manière propre de gérer les erreurs sans faire planter le programme
> ✅ Le bloc `try-except` permet une gestion gracieuse des erreurs et la récupération du programme.
# Que se passe-t-il si une exception se produit et n'est pas attrapée par le programme ?
- [x] Le programme se termine avec un message d'erreur
> ✅ Si une exception n'est pas attrapée, le programme se termine et imprime un message d'erreur expliquant le problème.
- [ ] L'exception est ignorée et le programme continue à fonctionner
> ❌ Les exceptions non gérées ne sont pas ignorées ; elles causent la terminaison du programme.
- [ ] Le programme continue après avoir sauté l'exception
> ❌ Une exception non gérée empêche le programme de continuer son exécution.
- [ ] Le programme entre dans une boucle infinie
> ❌ Les exceptions ne causent pas de boucles infinies ; elles causent la terminaison du programme à moins d'être gérées.
- [x] Le type d'exception est imprimé avec une traceback
> ✅ Le type d'exception et une traceback montrant où l'erreur s'est produite sont imprimés quand une exception n'est pas attrapée.
# Quelle est la différence entre les exceptions et les assertions ?
- [x] Les exceptions gèrent les erreurs pendant l'exécution, tandis que les assertions vérifient les conditions pendant le développement
> ✅ Les exceptions sont pour gérer les erreurs pendant l'exécution, tandis que les assertions sont des vérifications pour valider les conditions pendant le développement.
- [ ] Les assertions sont pour attraper les erreurs d'entrée utilisateur, tandis que les exceptions sont pour gérer les erreurs logiques
> ❌ Les assertions ne sont pas pour attraper les erreurs d'entrée utilisateur ; elles sont utilisées pour vérifier les conditions pendant le développement.
- [x] Les assertions sont utilisées pour s'assurer que certaines conditions sont vraies pendant l'exécution
> ✅ Les assertions sont utilisées pour valider que certaines conditions restent vraies pendant l'exécution du programme.
- [ ] Les exceptions sont seulement utilisées pendant le développement
> ❌ Les exceptions sont utilisées pendant l'exécution pour gérer les erreurs en production aussi bien qu'en développement.
- [x] Les assertions peuvent être désactivées dans les environnements de production
> ✅ Les assertions sont souvent désactivées dans les environnements de production pour éviter les vérifications inutiles et la surcharge de performance.
# Quand devriez-vous utiliser les assertions dans votre code ?
- [x] Pour valider les suppositions pendant le développement
> ✅ Les assertions sont utilisées pour valider les suppositions dans le code, s'assurant que les conditions attendues sont respectées pendant le développement.
- [ ] Pour gérer les erreurs d'entrée utilisateur
> ❌ Les assertions ne devraient pas être utilisées pour gérer les erreurs d'entrée utilisateur ; les exceptions sont plus appropriées à cette fin.
- [x] Pour vérifier les invariants et imposer des contraintes
> ✅ Les assertions sont utiles pour vérifier les invariants et imposer des contraintes dans le code.
- [ ] Pour remplacer toute la gestion d'erreur en production
> ❌ Les assertions sont typiquement désactivées en production et ne devraient pas remplacer les mécanismes de gestion d'erreur comme les exceptions.
- [x] Pour attraper les erreurs logiques tôt pendant la phase de développement
> ✅ Les assertions aident à attraper les erreurs logiques pendant le développement en vérifiant les conditions attendues dans le code.
# Pour quoi les assertions ne devraient-elles PAS être utilisées ?
- [x] Gérer les erreurs d'entrée utilisateur
> ✅ Les assertions ne devraient pas être utilisées pour gérer les erreurs d'entrée utilisateur. La validation d'entrée est mieux gérée par les exceptions.
- [ ] Vérifier que l'état du programme est correct
> ❌ Les assertions sont destinées à vérifier l'état du programme pendant le développement.
- [x] Vérifier les conditions qui peuvent être causées par des facteurs externes (par exemple, entrée utilisateur)
> ✅ Les assertions ne devraient pas être utilisées pour vérifier les conditions qui peuvent être affectées par des facteurs externes, comme l'entrée utilisateur ou les problèmes réseau.
- [ ] Vérifier les suppositions pendant le développement
> ❌ Les assertions sont conçues pour vérifier les suppositions pendant le développement.
- [x] Effectuer des tâches avec des effets de bord, comme ouvrir des fichiers ou modifier des données
> ✅ Les assertions ne devraient pas effectuer d'actions qui modifient l'état du programme ; elles sont pour les vérifications, pas pour les effets de bord.
Programmation défensive
# Qu'est-ce que la programmation défensive ?
- [x] Une manière d'écrire du code qui anticipe les erreurs utilisateur possibles
> ✅ La programmation défensive se concentre sur l'anticipation des erreurs utilisateur pour prévenir les plantages et améliorer la gestion d'erreur.
- [ ] Une méthode pour écrire du code qui fonctionne plus rapidement
> ❌ La programmation défensive ne concerne pas l'optimisation de la vitesse, mais plutôt l'amélioration de la résilience et la fiabilité.
- [x] Une approche de programmation qui vise à réduire les plantages dus aux mauvaises entrées
> ✅ En anticipant les erreurs et validant les entrées, la programmation défensive aide à prévenir les plantages causés par de mauvaises entrées.
- [ ] Une technique pour s'assurer que toute entrée utilisateur est ignorée
> ❌ La programmation défensive n'ignore pas les entrées ; elle s'assure que les entrées sont correctement validées.
- [x] Une stratégie pour rendre les programmes plus résilients aux conditions inattendues
> ✅ La programmation défensive vise à rendre les programmes plus résilients en se préparant aux entrées ou conditions inattendues.
# Quels sont les principes clés de la programmation défensive ?
- [x] Validation des entrées
> ✅ La validation des entrées s'assure que les entrées sont correctement formatées et empêche les données invalides ou malveillantes de causer des problèmes.
- [ ] Toujours supposer que l'utilisateur sait ce qu'il fait
> ❌ La programmation défensive suppose que les utilisateurs peuvent faire des erreurs, donc elle valide les entrées plutôt que de leur faire entièrement confiance.
- [x] Défauts de sécurité
> ✅ Un défaut de sécurité s'assure que quand quelque chose va mal, le programme entre dans un état sûr plutôt que de procéder avec une action incorrecte ou dangereuse.
- [x] Éviter les suppositions
> ✅ La programmation défensive implique d'éviter les suppositions sur la correctness des entrées ou états système, se préparant aux erreurs à la place.
- [ ] Supposer que les erreurs ne se produiront jamais
> ❌ L'opposé est vrai en programmation défensive. Elle suppose que les erreurs se produiront et s'y prépare.
# Quel est le but de la validation des entrées en programmation défensive ?
- [x] S'assurer que l'entrée utilisateur est valide avant de la traiter
> ✅ La validation des entrées vérifie que l'entrée est correctement formatée et sûre avant de la traiter, prévenant les erreurs inattendues.
- [ ] Permettre au programme de fonctionner plus rapidement
> ❌ La validation des entrées peut ajouter des étapes de traitement, mais son but est d'assurer la sécurité, pas la vitesse.
- [x] Prévenir les entrées malveillantes ou mal formées de causer des erreurs
> ✅ Une validation d'entrée appropriée aide à prévenir les vulnérabilités de sécurité et les plantages causés par des entrées invalides.
- [ ] Supposer que toute entrée est toujours correcte
> ❌ La programmation défensive ne suppose pas que l'entrée est toujours correcte ; elle la valide pour assurer la sécurité.
- [x] Améliorer la sécurité et la robustesse du programme
> ✅ En validant les entrées, les programmes deviennent plus sécurisés et robustes contre les attaques et erreurs utilisateur.
# À quoi servent les assertions en programmation défensive ?
- [x] Vérifier les conditions qui ne devraient jamais se produire pendant le fonctionnement normal
> ✅ Les assertions sont utilisées pour vérifier les conditions qui ne devraient pas se produire dans des circonstances normales, attrapant les bugs tôt en développement.
- [ ] Remplacer la validation des entrées
> ❌ Les assertions ne sont pas un remplacement pour la validation des entrées. Elles sont utilisées pour vérifier les suppositions faites pendant le développement.
- [x] Aider à attraper les erreurs logiques pendant la phase de développement
> ✅ Les assertions aident à attraper les erreurs logiques tôt en vérifiant que certaines conditions sont respectées pendant l'exécution.
- [ ] Gérer toutes les erreurs utilisateur en production
> ❌ Les assertions sont typiquement désactivées en production et ne devraient pas être utilisées pour gérer les erreurs d'entrée utilisateur.
- [x] Imposer les conditions qui doivent toujours être vraies pour que le système fonctionne correctement
> ✅ Les assertions imposent les conditions qui doivent être vraies pour que le système fonctionne correctement, comme les invariants dans un programme.
# Parmis les exemples suivants, lesquels sont des cas pratiques de programmation défensive ?
- [x] Valider les entrées utilisateur
> ✅ Valider les entrées s'assure que les données fournies par l'utilisateur sont correctes et sûres à traiter.
- [ ] Utiliser des variables globales pour partager des données à travers le programme
> ❌ Utiliser des variables globales est découragé en programmation défensive car cela peut conduire à des bugs difficiles à trouver et des effets de bord non intentionnels.
- [x] Fournir des messages d'erreur significatifs quand quelque chose va mal
> ✅ Fournir des messages d'erreur significatifs aide les utilisateurs à comprendre le problème et ajuster leur comportement.
- [x] Utiliser des défauts de sécurité
> ✅ Les défauts de sécurité s'assurent que quand quelque chose va mal, le système se comporte de manière sûre et prévisible.
- [ ] Ignorer les cas limites pour simplifier le code
> ❌ Ignorer les cas limites peut conduire à des bugs et un comportement imprévisible. La programmation défensive implique de considérer les cas limites et de les gérer appropriément.
Écriture de tests
# Quel est le but d'écrire des tests en développement logiciel ?
- [x] Vérifier que le code se comporte comme attendu
> ✅ Écrire des tests s'assure que chaque partie du programme fonctionne comme attendu et répond à ses spécifications.
- [ ] Faire fonctionner le code plus rapidement
> ❌ Les tests ne sont pas conçus pour améliorer la vitesse du code ; ils sont utilisés pour vérifier la justesse.
- [x] Détecter les bugs et régressions tôt dans le processus de développement
> ✅ Les tests aident à détecter les bugs et régressions tôt, réduisant le coût de correction des erreurs plus tard dans le cycle de développement.
- [x] S'assurer que les nouveaux changements ne cassent pas la fonctionnalité existante
> ✅ En exécutant les tests après les changements de code, les développeurs peuvent confirmer que les nouvelles fonctionnalités ou corrections n'introduisent pas de nouveaux bugs ou ne cassent pas le code existant.
- [ ] Corriger automatiquement les erreurs dans le code
> ❌ Les tests aident à identifier les erreurs mais ne les corrigent pas automatiquement.
# Quels sont les bénéfices des tests automatisés ?
- [x] Ils facilitent la maintenance en détectant les problèmes rapidement
> ✅ Les tests automatisés détectent rapidement les problèmes dans le code, rendant plus facile la maintenance et la mise à jour du logiciel.
- [ ] Ils remplacent le besoin de révision humaine du code
> ❌ Les tests automatisés complètent la révision humaine, mais ils ne remplacent pas le besoin d'une révision minutieuse du code par les développeurs.
- [x] Ils supportent l'intégration continue et le déploiement (CI/CD)
> ✅ Les tests automatisés sont essentiels dans les pipelines CI/CD, s'assurant que les changements de code sont minutieusement testés avant d'être intégrés ou déployés.
- [x] Ils renforcent la confiance des développeurs quand ils font des changements au code
> ✅ Savoir que les tests attraperont les erreurs permet aux développeurs de refactoriser et améliorer le code avec confiance.
- [ ] Ils garantissent que le logiciel n'aura jamais de bugs
> ❌ Les tests automatisés aident à réduire les bugs, mais ils ne peuvent pas garantir que tous les bugs seront attrapés.
# Que sont les tests unitaires ?
- [x] Des tests qui se concentrent sur des unités ou composants individuels du logiciel
> ✅ Les tests unitaires se concentrent sur le test d'unités individuelles, telles que les fonctions ou méthodes, en isolation du reste de l'application.
- [ ] Des tests qui vérifient l'interaction entre plusieurs composants
> ❌ Ceci décrit les tests d'intégration, pas les tests unitaires. Les tests unitaires se concentrent sur les composants individuels.
- [x] Des tests qui s'assurent qu'une fonction ou méthode unique fonctionne comme attendu
> ✅ Les tests unitaires vérifient que les fonctions ou méthodes individuelles se comportent correctement.
- [ ] Des tests qui vérifient la sécurité de toute l'application
> ❌ Les tests unitaires ne couvrent pas la sécurité ; c'est le but des tests de sécurité.
- [x] Des tests qui sont écrits pour fonctionner rapidement et indépendamment
> ✅ Les tests unitaires sont conçus pour fonctionner rapidement et indépendamment, s'assurant que les composants individuels fonctionnent comme attendu.
# Pourquoi est-il important d'écrire les tests avant le code (développement dirigé par les tests) ?
- [x] Les tests définissent le comportement attendu du code avant qu'il soit implémenté
> ✅ Écrire les tests en premier (comme dans le développement dirigé par les tests) définit le comportement attendu du code avant qu'il soit implémenté.
- [ ] Cela assure que le code n'aura pas de bugs
> ❌ Écrire les tests en premier ne garantit pas qu'il n'y aura pas de bugs, mais cela aide à les réduire en clarifiant les attentes.
- [x] Cela encourage les développeurs à penser de façon critique au design et à la fonctionnalité
> ✅ Écrire les tests en premier encourage les développeurs à penser au design et à la fonctionnalité du code avant que l'implémentation commence.
- [ ] Cela fait fonctionner le code plus rapidement
> ❌ Le développement dirigé par les tests se concentre sur l'amélioration de la qualité du code, pas sur la vitesse.
- [x] Cela favorise la communication et assure une compréhension partagée des objectifs du projet
> ✅ Écrire les tests avant le code favorise une meilleure communication et assure que toutes les parties prenantes comprennent les objectifs du projet.
Documenter et commenter le code
# Pourquoi documenter le code est-il important ?
- [x] Cela rend le code plus facile à lire et à maintenir
> ✅ Documenter le code s'assure que d'autres développeurs peuvent facilement le comprendre et le maintenir sans avoir besoin de déchiffrer la logique par eux-mêmes.
- [ ] Cela fait fonctionner le code plus rapidement
> ❌ La documentation améliore la lisibilité et la maintenabilité, pas la performance.
- [x] Cela aide les nouveaux développeurs à devenir opérationnels rapidement
> ✅ Un code bien documenté permet aux nouveaux développeurs de comprendre le but et la structure du projet plus rapidement, réduisant le temps d'intégration.
- [x] Cela améliore la collaboration entre les membres de l'équipe
> ✅ Une bonne documentation favorise la collaboration en fournissant une compréhension partagée de la base de code.
- [ ] Cela élimine le besoin de commentaires dans le code
> ❌ La documentation ne remplace pas le besoin de commentaires dans le code, qui expliquent la logique ou les décisions spécifiques.
# Quel est le rôle des commentaires dans le code ?
- [x] Rendre le code plus facile à comprendre
> ✅ Les commentaires expliquent comment fonctionnent les parties du code, rendant plus facile pour d'autres de comprendre la logique complexe ou non triviale.
- [ ] Réécrire le code en français simple
> ❌ Les commentaires ne devraient pas paraphraser le code lui-même ; ils devraient expliquer son but, sa logique et ses décisions de design.
- [x] Fournir des informations supplémentaires sur les algorithmes ou décisions
> ✅ Les commentaires sont utiles pour décrire les algorithmes, les décisions de design, les limitations ou les améliorations futures (TODOs).
- [x] Expliquer le but des parties complexes du code
> ✅ Pour les sections non triviales du code, les commentaires sont essentiels pour expliquer le but et assurer la maintenabilité.
- [ ] Éviter le besoin de documentation
> ❌ Les commentaires complètent la documentation mais ne la remplacent pas. Les deux servent des buts différents dans le processus de développement.
# Que ne devraient PAS faire les commentaires ?
- [x] Paraphraser le code
> ✅ Les commentaires ne devraient pas simplement reformuler le code en français simple ; ils devraient fournir des aperçus et explications supplémentaires.
- [ ] Expliquer les parties non triviales du code
> ❌ Les commentaires devraient expliquer la logique non triviale ou complexe pour aider à la compréhension.
- [ ] Fournir un contexte pour les décisions de design
> ❌ Les commentaires peuvent être utilisés pour expliquer pourquoi certaines décisions de design ont été prises.
- [x] Submerger le code avec des détails inutiles
> ✅ Trop de commentaires peuvent rendre le code plus difficile à lire. Il est important de trouver un équilibre et ne commenter que quand c'est nécessaire.
- [x] Remplacer de bons noms de variables et de fonctions
> ✅ De bons noms de variables et de fonctions devraient rendre le code auto-explicatif dans de nombreux cas, réduisant le besoin de commentaires excessifs.
# Quel est l'objectif principal de documenter les signatures de fonctions et de classes ?
- [x] Décrire les paramètres d'entrée et les valeurs de retour
> ✅ Documenter les signatures de fonctions et de classes aide à expliquer les paramètres d'entrée, les valeurs de retour et toutes les exceptions qui peuvent être levées.
- [ ] Réécrire la logique de la fonction en commentaires
> ❌ Le but n'est pas de réécrire la logique de la fonction mais de décrire ses entrées, sorties et comportement.
- [x] Rendre le code plus facile à comprendre et à utiliser
> ✅ Fournir une documentation claire pour les signatures de fonctions et de classes rend plus facile pour les développeurs d'utiliser et comprendre le code.
- [ ] Générer automatiquement des tests unitaires
> ❌ Bien que les signatures de fonctions aident dans les tests, leur documentation n'est pas destinée à générer des tests automatiquement.
- [x] Faciliter la génération de documentation externe
> ✅ La documentation des signatures de fonctions et de classes peut être utilisée pour générer une documentation externe que les développeurs peuvent consulter quand ils utilisent le code.
# Comment les docstrings supportent-elles la documentation automatique ?
- [x] Les outils comme `pydoc` peuvent extraire les docstrings pour générer la documentation
> ✅ Les docstrings peuvent être extraites par des outils comme `pydoc` pour générer automatiquement une documentation lisible par l'humain.
- [ ] Elles remplacent le besoin de commentaires dans le code
> ❌ Les docstrings fournissent de la documentation mais ne remplacent pas les commentaires, qui expliquent des parties spécifiques du code ou la logique.
- [x] Elles fournissent des descriptions détaillées des fonctions, méthodes ou classes
> ✅ Les docstrings décrivent le but et le comportement des fonctions, méthodes ou classes, qui peuvent ensuite être utilisées pour générer de la documentation.
- [x] Elles sont écrites directement dans le code source
> ✅ Les docstrings sont intégrées directement dans le code source, les rendant facilement accessibles à la fois pour les développeurs et les outils de documentation.
- [ ] Elles sont seulement utilisées dans les langages compilés
> ❌ Les docstrings ne sont pas exclusives aux langages compilés ; elles sont largement utilisées dans les langages interprétés comme Python.