{"id":1923,"date":"2014-06-22T09:18:28","date_gmt":"2014-06-22T08:18:28","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1923"},"modified":"2014-06-24T10:43:14","modified_gmt":"2014-06-24T09:43:14","slug":"application-legacy-c-refactoring-reingenierie-3","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-3\/","title":{"rendered":"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (III)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-1924\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Refactoring_Reingenierie3.jpg\" alt=\"Word_Refactoring_Reingenierie3\" width=\"341\" height=\"227\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Refactoring_Reingenierie3.jpg 360w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Refactoring_Reingenierie3-300x200.jpg 300w\" sizes=\"(max-width: 341px) 100vw, 341px\" \/><\/a>Nous avons cette application Legacy en C, la premi\u00e8re version de Word publi\u00e9e par Microsoft en 1990, pour laquelle nous nous proposons de chiffrer le co\u00fbt de diff\u00e9rentes strat\u00e9gies : refactoring ou reengineering, par la m\u00eame \u00e9quipe de d\u00e9veloppeurs ou au contraire, par une autre \u00e9quipe et donc avec un transfert de connaissances. <!--more--><\/p>\n<p>Apr\u00e8s avoir <a href=\"http:\/\/qualilogy.com\/fr\/audit-application-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">analys\u00e9 le code source<\/a> de cette application, nous avons pu identifier les composants (programmes et fonctions) <a href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/\" target=\"_blank\">les plus complexes<\/a> (Complexit\u00e9 Cyclomatique) et\/ou avec <a href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-2\/\" target=\"_blank\">une taille importante<\/a>.<\/p>\n<p>Aujourd\u2019hui, nous allons regarder si ces programmes comportent \u00e9galement des violations aux bonnes pratiques de programmation susceptibles de peser sur la lisibilit\u00e9 et la compr\u00e9hension du code, avec l\u2019impact que l\u2019on imagine sur les co\u00fbts de nos diff\u00e9rentes strat\u00e9gies.<\/p>\n<h2>Switch case<\/h2>\n<p>Un \u2018switch\u2019 est, comme vous le savez probablement, une instruction qui permet de tester diff\u00e9rents cas (\u2018cases\u2019), ou conditions multiples. Evidemment, plus le traitement de chaque cas sera long et complexe, et plus l\u2019ensemble de l\u2019instruction sera longue \u2013 parfois sur plus d\u2019une page \u2013 et difficile \u00e0 comprendre.<\/p>\n<p>La r\u00e8gle suivante identifie le nombre de \u2018switch cases\u2019 avec plus de 5 lignes.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1930\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr.jpg\" alt=\"Word_Switch_Nbr\" width=\"543\" height=\"25\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr.jpg 543w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr-300x13.jpg 300w\" sizes=\"(max-width: 543px) 100vw, 543px\" \/><\/a>Je me suis int\u00e9ress\u00e9 \u00e0 nouveau \u00e0 la distribution des violations \u00e0 cette bonne pratique selon la taille du \u2018switch case\u2019. En-dessous de 20 lignes, quelques minutes seront suffisantes pour comprendre, voire corriger ce d\u00e9faut. Au-del\u00e0 de 100 lignes, la compr\u00e9hension de l\u2019algorithme et des cas test\u00e9s devient beaucoup plus difficiles.<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 8 \u2013 Distribution des \u2018switch cases\u2019 selon leur taille<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1932\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size.jpg\" alt=\"Word_Switch_Size\" width=\"521\" height=\"115\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size.jpg 521w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size-300x66.jpg 300w\" sizes=\"(max-width: 521px) 100vw, 521px\" \/><\/a>19 \u2018switch cases\u2019 comportent plus de 100 lignes. J\u2019ai voulu croiser ceux-ci avec les fonctions les plus complexes. Vous vous rappelez que dans le <a href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-1\/\" target=\"_blank\">premier post de cette s\u00e9rie<\/a>, nous avons identifi\u00e9 30 fonctions \u00e0 plus de 100 points de CC (Complexit\u00e9 Cyclomatique) et 6 \u00e0 plus de 200 CC. Dans <a href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-2\/\" target=\"_blank\">le second post<\/a>, nous avions crois\u00e9 ces 36 fonctions avec les programmes les plus complexes, avec un code couleur :<\/p>\n<ul>\n<li>Orange fonc\u00e9 pour des fonctions \u00e0 plus de 200 CC dans des programmes \u00e0 plus de 300 CC : deux de ces fichiers apparaissent dans le tableau ci-dessous : \u2018RTFOUT.C\u2019 et \u2018formula.c\u2019.<\/li>\n<li>Orange clair pour le programme \u2018print.c\u2019 \u00e0 plus de 400 CC avec au moins une fonction \u00e0 plus de 100 CC.<\/li>\n<li>Jaune pour le programme \u2018RTFIN.c\u2019 \u00e0 plus de 300 CC avec au moins 1 fonction \u00e0 plus de 100 CC.<\/li>\n<li>Blanc pour les programmes \u2018wordtech\\tableins.c\u2019 et \u2018rtftrans.c\u2019 \u00e0 plus de 200 CC avec au moins 1 fonction \u00e0 plus de 100 CC.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><em><strong>Tableau 9 \u2013 Croisement des \u2018switch cases\u2019 les plus longs avec les fonctions les plus complexes<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1934\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC.jpg\" alt=\"Word_Switch_CC\" width=\"614\" height=\"272\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC.jpg 614w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC-300x132.jpg 300w\" sizes=\"(max-width: 614px) 100vw, 614px\" \/><\/a>Ce tableau montre que la majorit\u00e9 (10 sur 16) des \u2018switch cases\u2019 de taille importante se trouvent dans des fonctions identifi\u00e9es comme tr\u00e8s complexes. La colonne \u2018Line Switch\u2019 affiche la ligne de code o\u00f9 d\u00e9bute le \u2018switch case\u2019. Je connais \u00e9galement la ligne o\u00f9 d\u00e9bute la fonction (\u2018Line Fn\u2019) ainsi que la taille de celle-ci en nombre de lignes (\u2018Fn Size\u2019), ce qui me permet de calculer la ligne de code o\u00f9 se termine la fonction (\u2018End Fn\u2019) et donc de v\u00e9rifier si le \u2018switch case\u2019 se trouve bien au sein de celle-ci (\u2018In\u2019).<\/p>\n<p>Par exemple :<\/p>\n<ul>\n<li>Le fichier \u2018RTFOUT.C\u2019 est un programme de plus de 300 points de CC (orange fonc\u00e9) avec une fonction de 355 CC, au sein de laquelle on trouve 2 \u2018switch cases\u2019, respectivement de 296 et 181 lignes de code.<\/li>\n<li>Le fichier \u2018formula.c\u2019 est \u00e9galement un programme de plus de 300 CC (orange fonc\u00e9) avec une fonction de 234 CC et 3 \u2018switch cases\u2019 de 126, 105 et 183 lignes de code.<\/li>\n<li>Etc.<\/li>\n<\/ul>\n<p>L\u2019existence de structures de code longues et difficiles \u00e0 comprendre, telles que le \u2018switch case\u2019 est un facteur aggravant des co\u00fbts de transfert de connaissances pour ces programmes et ces fonctions d\u00e9j\u00e0 tr\u00e8s complexes.<\/p>\n<h2>Nombre de param\u00e8tres<\/h2>\n<p>Autre r\u00e8gle que j\u2019ai souhait\u00e9e v\u00e9rifier : les fonctions comportant un nombre \u00e9lev\u00e9 de param\u00e8tres.<br \/>\n<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1936\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param.jpg\" alt=\"Word_Fn_Param\" width=\"544\" height=\"25\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param.jpg 544w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param-300x13.jpg 300w\" sizes=\"(max-width: 544px) 100vw, 544px\" \/><\/a>43 fonctions comportent plus de 7 param\u00e8tres. Ce nombre n\u2019est pas tr\u00e8s \u00e9lev\u00e9, si on compare avec la complexit\u00e9 de certaines fonctions ou leur taille en nombre de lignes.<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 9 \u2013 Fonctions complexes avec un nombre \u00e9lev\u00e9 de param\u00e8tres<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1937\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr.jpg\" alt=\"Word_FnCplx_Nbr\" width=\"349\" height=\"219\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr.jpg 349w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr-300x188.jpg 300w\" sizes=\"(max-width: 349px) 100vw, 349px\" \/><\/a>Le tableau pr\u00e9c\u00e9dent permet de constater que ces fonctions avec un nombre de param\u00e8tres \u00e9lev\u00e9es ne figurent pas parmi les plus complexes. Au moins, nous n&rsquo;aurons pas de souci de ce c\u00f4t\u00e9 l\u00e0.<\/p>\n<h2>Goto<\/h2>\n<p>Comme nous le savons tous, un &lsquo;goto&rsquo; est une instruction de \u2018saut\u2019 vers une autre portion de code, qui rompt la continuit\u00e9 du flux de traitement. Cette instruction est devenue le symbole m\u00eame du code \u2018spaghetti\u2019, difficile \u00e0 lire et \u00e0 maintenir.<\/p>\n<p>On en rencontre un nombre tr\u00e8s \u00e9lev\u00e9 dans l\u2019application.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1938\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto.jpg\" alt=\"Word_Goto\" width=\"547\" height=\"30\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto.jpg 547w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto-300x16.jpg 300w\" sizes=\"(max-width: 547px) 100vw, 547px\" \/><\/a>En fait, un coup d\u2019\u0153il dans le code montre que cette pratique est g\u00e9n\u00e9ralis\u00e9e dans toute l\u2019application. Par exemple, la gestion des erreurs se fera non pas par l\u2019appel d\u2019une fonction sp\u00e9cifique mais par un \u2018goto\u2019 vers la portion de code correspondante, parfois m\u00eame dans une librairie externe.<\/p>\n<p>Le tableau suivant pr\u00e9sente la r\u00e9partition des \u2018goto\u2019 dans les programmes les plus complexes, comportant plus de 300 points de CC.<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 11 \u2013 Distribution des Goto dans les programmes les plus complexes ( &gt; 300 CC)<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1940\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist.jpg\" alt=\"Word_Goto_Dist\" width=\"531\" height=\"93\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist.jpg 531w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist-300x52.jpg 300w\" sizes=\"(max-width: 531px) 100vw, 531px\" \/><\/a><br \/>\n1 383 \u2018goto\u2019, soit 54% de leur nombre total (2 541) se rencontrent dans des programmes avec une Complexit\u00e9 Cyclomatique tr\u00e8s \u00e9lev\u00e9e, voire extr\u00eamement \u00e9lev\u00e9e.<\/p>\n<p>Vous vous rappelez que dans le second \u00e9pisode de cette s\u00e9rie, nous avons list\u00e9 les fichiers avec une complexit\u00e9 globale \u00e9lev\u00e9e et qui comportait au moins une fonction tr\u00e8s complexe.<\/p>\n<p style=\"text-align: center\"><em><strong>Tableau 9 \u2013 Fichiers complexes avec un nombre \u00e9lev\u00e9 de Goto<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1941\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx.jpg\" alt=\"Word_Goto_PgmsCplx\" width=\"352\" height=\"492\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx.jpg 352w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx-214x300.jpg 214w\" sizes=\"(max-width: 352px) 100vw, 352px\" \/><\/a>On retrouve, avec donc un grand nombre de \u2018goto\u2019 :<\/p>\n<ul>\n<li>2 fichiers \u00e0 plus de 400 CC avec au moins 1 fonction \u00e0 plus de 200 CC et 1 fonction \u00e0 plus de 100 CC (en rouge ci-dessous), comptant \u00e9galement 87 et 32 &lsquo;goto&rsquo;.<\/li>\n<li>7 fichiers \u00e0 plus de 400 CC avec au moins 1 fonction \u00e0 plus de 100 CC (en orange).<\/li>\n<\/ul>\n<p>Nous avons au total :<\/p>\n<ul>\n<li>142 &lsquo;goto&rsquo; dans 2 programmes \u00e0 plus de 700 CC.<\/li>\n<li>86 &lsquo;goto&rsquo; dans 3 programmes \u00e0 plus de 600 CC.<\/li>\n<li>200 &lsquo;goto&rsquo; dans 4 programmes \u00e0 plus de 500 CC.<\/li>\n<li>350 &lsquo;goto&rsquo; dans 11 programmes \u00e0 plus de 400 CC.<\/li>\n<\/ul>\n<h2>Autres &lsquo;bad practices&rsquo;<\/h2>\n<p>J\u2019ai continu\u00e9 ce travail de croisement entre les programmes les plus volumineux et les plus complexes avec les violations aux bonnes pratiques impactant la lisibilit\u00e9 et la compr\u00e9hension du code, comme par exemple \u2018&rsquo;continue&rsquo; should not be used (MISRA C 14.5)\u2019 ou \u2018If statements should not be nested too deeply\u2019.<\/p>\n<p>Je ne vais pas lister tous ces r\u00e9sultats. Ces d\u00e9fauts se rencontrent en nombres (relativement) moins importants que ceux recens\u00e9s ci-dessus, mais vont toucher \u00e9galement les programmes et fonctions les plus complexes.<\/p>\n<p>Enfin, notre objectif n\u2019est pas de r\u00e9aliser une \u00e9tude compl\u00e8tement exhaustive et extr\u00eamement pr\u00e9cise \u2013 il nous faudrait pour cela une dizaine ou plus de posts \u2013 sinon d\u2019illustrer une d\u00e9marche possible pour calculer les co\u00fbts de refactoring ou de r\u00e9ing\u00e9nierie d\u2019une application. Nous aborderons cette estimation dans le prochain post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons cette application Legacy en C, la premi\u00e8re version de Word publi\u00e9e par Microsoft en 1990, pour laquelle nous nous proposons de chiffrer le co\u00fbt de diff\u00e9rentes strat\u00e9gies : refactoring ou reengineering, par la m\u00eame \u00e9quipe de d\u00e9veloppeurs ou au contraire, par une autre \u00e9quipe et donc avec un transfert de connaissances.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1923","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1923"}],"collection":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/comments?post=1923"}],"version-history":[{"count":19,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1923\/revisions"}],"predecessor-version":[{"id":1952,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1923\/revisions\/1952"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1923"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1923"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1923"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}