Il n'est pas tout à fait vrai que "l'assertion échoue uniquement en mode débogage".
Dans Object Oriented Software Construction, 2e édition de Bertrand Meyer, l'auteur laisse une porte ouverte pour vérifier les conditions préalables en mode release. Dans ce cas, ce qui se passe lorsqu'une assertion échoue, c'est que ... une exception de violation d'assertion est déclenchée! Dans ce cas, il n'y a pas de récupération de la situation: quelque chose d'utile pourrait cependant être fait, et c'est de générer automatiquement un rapport d'erreur et, dans certains cas, de redémarrer l'application.
La motivation derrière ceci est que les conditions préalables sont généralement moins chères à tester que les invariants et les post-conditions, et que dans certains cas, l'exactitude et la «sécurité» dans la version de la version sont plus importantes que la vitesse. c'est-à-dire que pour de nombreuses applications, la vitesse n'est pas un problème, mais la robustesse (la capacité du programme à se comporter de manière sûre lorsque son comportement n'est pas correct, c'est-à-dire lorsqu'un contrat est rompu).
Devez-vous toujours laisser les vérifications des conditions préalables activées? Ça dépend. C'est à vous. Il n'y a pas de réponse universelle. Si vous créez un logiciel pour une banque, il peut être préférable d'interrompre l'exécution avec un message alarmant plutôt que de transférer 1 000 000 $ au lieu de 1 000 $. Mais que faire si vous programmez un jeu? Peut-être avez-vous besoin de toute la vitesse que vous pouvez obtenir, et si quelqu'un obtient 1000 points au lieu de 10 à cause d'un bug que les conditions préalables n'ont pas détecté (car elles ne sont pas activées), pas de chance.
Dans les deux cas, vous devriez idéalement avoir détecté ce bogue pendant les tests, et vous devriez effectuer une partie importante de vos tests avec les assertions activées. Ce qui est discuté ici est la meilleure stratégie pour les rares cas où les conditions préalables échouent dans le code de production dans un scénario qui n'a pas été détecté plus tôt en raison de tests incomplets.
Pour résumer, vous pouvez avoir des assertions et toujours obtenir les exceptions automatiquement , si vous les laissez activées - du moins dans Eiffel. Je pense que pour faire la même chose en C ++, vous devez le taper vous-même.
Voir aussi: Quand les assertions doivent-elles rester dans le code de production?