{"id":329,"date":"2022-05-24T10:54:23","date_gmt":"2022-05-24T08:54:23","guid":{"rendered":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/?p=329"},"modified":"2022-05-24T10:57:49","modified_gmt":"2022-05-24T08:57:49","slug":"prototyper-une-fonction","status":"publish","type":"post","link":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/2022\/05\/24\/prototyper-une-fonction\/","title":{"rendered":"Prototyper une fonction"},"content":{"rendered":"\n<p><strong>Pr\u00e9 et post conditions<\/strong><\/p>\n\n\n\n<p>Fonction en langage Python qui convertit un nombre d\u00e9cimale en binaire sur un nombre de bits donn\u00e9 en param\u00e8tre:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"414\" height=\"355\" src=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-13.png\" alt=\"\" class=\"wp-image-330\" srcset=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-13.png 414w, http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-13-300x257.png 300w\" sizes=\"(max-width: 414px) 100vw, 414px\" \/><\/figure>\n\n\n\n<p>Pour utiliser cette fonction, il faut savoir ce qu&rsquo;elle fait et sous quelles conditions. C&rsquo;est pour \u00e7a que nous allons rajouter des commentaires et conditions pour le bon usage de cette fonction. On peut commenter la fonction pour donner des informations en plus sur la fonction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"624\" height=\"379\" src=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-14.png\" alt=\"\" class=\"wp-image-331\" srcset=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-14.png 624w, http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-14-300x182.png 300w\" sizes=\"(max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><strong>Pr\u00e9 et post conditions<\/strong><\/p>\n\n\n\n<p>Lorsqu&rsquo;on d\u00e9finit une nouvelle fonction, et qu&rsquo;on la sp\u00e9cifie, il faut minimiser le nombre de pr\u00e9conditions si on veut la rendre\u00a0<em>robuste<\/em>, c&rsquo;est-\u00e0-dire r\u00e9sistante \u00e0 des mauvaises utilisations. Par contre, si on \u00e9crit une fonction \u00e0 usage interne, c&rsquo;est moins critique, surtout si le nombre de personnes qui vont l&rsquo;utiliser n&rsquo;est pas trop \u00e9lev\u00e9 et qu&rsquo;elles sont de confiance. Dans ce dernier cas, le code de la fonction sera plus simple.<\/p>\n\n\n\n<p>On peut d\u00e9finir trois pr\u00e9conditions:<\/p>\n\n\n\n<ul><li>le param\u00e8tre\u00a0<code>n<\/code>\u00a0doit \u00eatre un entier naturel;<\/li><li>le param\u00e8tre\u00a0<code>bits<\/code>\u00a0doit \u00eatre un entier naturel;<\/li><li>le nombre de bits,\u00a0<code>bits<\/code>\u00a0doit \u00eatre suffisamment grand pour coder\u00a0<code>n<\/code>\u00a0en binaire.<\/li><\/ul>\n\n\n\n<p><strong>Instruction\u00a0<code><em>assert<\/em><\/code><\/strong><\/p>\n\n\n\n<p>A l&rsquo;aide du m\u00e9canisme d&rsquo;<em>assertion<\/em>\u00a0propos\u00e9 par Python. Voyons comment l&rsquo;utiliser pour v\u00e9rifier les pr\u00e9conditions de la fonction\u00a0<code>dec_vers_bin<\/code>\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"757\" height=\"407\" src=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-15.png\" alt=\"\" class=\"wp-image-332\" srcset=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-15.png 757w, http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-15-300x161.png 300w\" sizes=\"(max-width: 757px) 100vw, 757px\" \/><\/figure>\n\n\n\n<p>Trois\u00a0<em>instructions\u00a0<code>assert<\/code><\/em>\u00a0ont \u00e9t\u00e9 utilis\u00e9es pour v\u00e9rifier les pr\u00e9conditions. Cette instruction se compose d&rsquo;une condition (expression bool\u00e9enne) \u00e9ventuellement suivie d&rsquo;une virgule et d&rsquo;une phrase en langue naturelle, sous forme d&rsquo;une chaine de caract\u00e8res. L&rsquo;instruction\u00a0<code>assert<\/code>\u00a0teste si sa condition est satisfaite. Si c&rsquo;est le cas, elle ne fait rien et sinon elle arr\u00eate imm\u00e9diatement l&rsquo;ex\u00e9cution du programme en affichant \u00e9ventuellement la phrase qui lui est associ\u00e9e.<\/p>\n\n\n\n<p>Dans le programme d&rsquo;exemple suivant, le premier appel s&rsquo;ex\u00e9cutera sans erreur tandis que le second provoquera une erreur d&rsquo;ex\u00e9cution due \u00e0 une assertion pas satisfaite :<\/p>\n\n\n\n<p>On aura par exemple:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"614\" height=\"213\" src=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-17.png\" alt=\"\" class=\"wp-image-334\" srcset=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-17.png 614w, http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-17-300x104.png 300w\" sizes=\"(max-width: 614px) 100vw, 614px\" \/><\/figure>\n\n\n\n<p>Le m\u00e9canisme d&rsquo;assertion est l\u00e0 pour emp\u00eacher des erreurs qui ne devraient pas se produire, en arr\u00eatant pr\u00e9matur\u00e9ment le programme, avant d&rsquo;ex\u00e9cuter le code qui aurait produit une erreur. Si une telle erreur survient, c&rsquo;est que le programme doit \u00eatre modifi\u00e9 pour qu&rsquo;elle n&rsquo;arrive plus. Dans cet exemple, on se rend imm\u00e9diatement compte qu&rsquo;un appel ne respectant pas les pr\u00e9conditions a \u00e9t\u00e9 fait, et qu&rsquo;il faut donc le changer.<\/p>\n\n\n\n<p>Aussi on peut ins\u00e9rer \u00e0 la fin de la fonction (juste avant le\u00a0<code>return<\/code>\u00a0des post-conditions si n\u00e9cessaire). Dans notre exemple nous allons \u00e9crire deux post-conditions qui pourraient aussi servir de test.<\/p>\n\n\n\n<ul><li>un test pour voir si c&rsquo;est un nombre binaire<\/li><li>on v\u00e9rifie le nombre de bits<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" width=\"760\" height=\"529\" src=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-18.png\" alt=\"\" class=\"wp-image-335\" srcset=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-18.png 760w, http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-content\/uploads\/sites\/2\/2022\/05\/image-18-300x209.png 300w\" sizes=\"(max-width: 760px) 100vw, 760px\" \/><\/figure>\n\n\n\n<p>Enfin, il faut savoir que le m\u00e9canisme d&rsquo;assertion ne doit en aucun cas faire partie du code fonctionnel d&rsquo;un programme. En supprimant toutes les instructions\u00a0<code>assert<\/code>, le programme doit continuer \u00e0 fonctionner normalement.<\/p>\n\n\n\n<p>Programmation d\u00e9fensive<\/p>\n\n\n\n<p>Ce mode de programmation, qui exploite les assertions pour v\u00e9rifier les pr\u00e9conditions, est appel\u00e9&nbsp;<em>programmation d\u00e9fensive<\/em>. Dans ce type de programmation, on suppose que les fonctions sont appel\u00e9es comme il faut, dans le respect de leurs pr\u00e9conditions. On pr\u00e9voit n\u00e9anmoins un garde-fou avec des instructions&nbsp;<code>assert<\/code>&nbsp;pour v\u00e9rifier que les pr\u00e9conditions sont effectivement bien satisfaites.<\/p>\n\n\n\n<p>En pratique, on va utiliser ce type de programmation pour du code sur lequel on a le contr\u00f4le. Par exemple, lorsqu&rsquo;on \u00e9crit un module, on peut programmer d\u00e9fensivement pour les fonctions qui ne sont destin\u00e9es qu&rsquo;\u00e0 \u00eatre appel\u00e9es au sein de ce dernier. Lorsqu&rsquo;on \u00e9crit des fonctions destin\u00e9es \u00e0 \u00eatre utilis\u00e9es par d&rsquo;autres personnes, on va plut\u00f4t faire une&nbsp;<em>gestion active des erreurs<\/em>, notamment avec l&rsquo;instruction&nbsp;<code>if-else<\/code>&nbsp;et en pr\u00e9voyant des valeurs de retour sp\u00e9ciales.<\/p>\n\n\n\n<p>Dans les deux cas, on doit sp\u00e9cifier les fonctions que l&rsquo;on d\u00e9finit. En programmation d\u00e9fensive, on peut se permettre d&rsquo;avoir des pr\u00e9conditions et faire l&rsquo;hypoth\u00e8se qu&rsquo;elles seront toujours respect\u00e9es. Par contre, lorsque les fonctions sont destin\u00e9es \u00e0 \u00eatre utilis\u00e9es par d&rsquo;autres, on va limiter au maximum le nombre de pr\u00e9conditions.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pr\u00e9 et post conditions Fonction en langage Python qui convertit un nombre d\u00e9cimale en binaire sur un nombre de bits donn\u00e9 en param\u00e8tre: Pour utiliser cette fonction, il faut savoir ce qu&rsquo;elle fait et sous quelles conditions. C&rsquo;est pour \u00e7a que nous allons rajouter des commentaires et conditions pour le bon usage de cette fonction.&hellip; <a class=\"more-link\" href=\"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/2022\/05\/24\/prototyper-une-fonction\/\">Poursuivre la lecture <span class=\"screen-reader-text\">Prototyper une fonction<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/posts\/329"}],"collection":[{"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/comments?post=329"}],"version-history":[{"count":3,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/posts\/329\/revisions"}],"predecessor-version":[{"id":338,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/posts\/329\/revisions\/338"}],"wp:attachment":[{"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/media?parent=329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/categories?post=329"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yb-isn.fr\/2021\/nsi\/olga\/wp-json\/wp\/v2\/tags?post=329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}