{"id":2239,"date":"2014-11-21T10:38:15","date_gmt":"2014-11-21T09:38:15","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=2239"},"modified":"2014-11-22T11:16:06","modified_gmt":"2014-11-22T10:16:06","slug":"application-legacy-reengineering-avec-sonarqube-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/application-legacy-reengineering-avec-sonarqube-2\/","title":{"rendered":"Application Legacy \u2013 Reengineering avec SonarQube (II)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2241\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_ReengineeringWithSQ21.jpg\" alt=\"Application Legacy \u2013 Reengineering avec SonarQube\" width=\"359\" height=\"256\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_ReengineeringWithSQ21.jpg 359w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_ReengineeringWithSQ21-300x213.jpg 300w\" sizes=\"(max-width: 359px) 100vw, 359px\" \/><\/a>Nous avons vu dans le post pr\u00e9c\u00e9dent comment entamer un <a title=\"Application Legacy \u2013 Reengineering avec SonarQube\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-reengineering-avec-sonarqube\/\" target=\"_blank\">reengineering avec SonarQube <\/a>en commen\u00e7ant par un red\u00e9coupage fonctionnel et le re-design de notre application.<\/p>\n<p>Nous pouvons maintenant descendre un peu plus dans le code afin d\u2019identifier des flux de traitements candidats \u00e0 restructuration. <!--more--><\/p>\n<h2>Restructuration des traitements<\/h2>\n<p>Je vais \u00e0 nouveau utiliser <a title=\"Application Legacy \u2013 Refactoring avec le plugin SQALE (II)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-plugin-sqale-2\/\" target=\"_blank\">le SQALE Sunburst<\/a> afin de naviguer entre les diff\u00e9rentes violations aux best practices de programmation et rechercher tout indice de \u2018code spaghetti\u2019.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 1 \u2013 Refactoring de \u2018goto\u2019<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2245\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto.jpg\" alt=\"Plugin SQALE - Refactoring de goto\" width=\"419\" height=\"440\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto.jpg 419w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto-285x300.jpg 285w\" sizes=\"(max-width: 419px) 100vw, 419px\" \/><\/a>Ce widget me permet de chiffrer l\u2019effort de refactoring \u2013 158.8 jours \u2013 afin de corriger ces ruptures de flux de traitements et ces algorithmes qui sautent dans tous les sens.<br \/>\nJe peux faire de m\u00eame pour chacun des d\u00e9fauts de ce type, par exemple l\u2019utilisation de \u2018continue\u2019. Un click m\u2019am\u00e8ne ensuite \u00e0 la liste des programmes comportant ces violations :<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 2 \u2013 Liste de violations \u2018continue\u2019\u00a0 <\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2246\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue.jpg\" alt=\"SonarQube - Avoid continue\" width=\"564\" height=\"295\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue.jpg 564w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue-300x156.jpg 300w\" sizes=\"(max-width: 564px) 100vw, 564px\" \/><\/a><\/p>\n<p>De l\u00e0, je peux descendre dans chaque programme et v\u00e9rifier ce code, pour chaque ligne comportant une de ces violations. Dans la figure suivante, nous pouvons voir une ligne de code avec une instruction \u2018continue\u2019, ainsi que le \u2018break\u2019 qui l\u2019accompagne, et l\u2019estimation &#8211; 30 minutes &#8211; de dette technique pour r\u00e9soudre ce code spaghetti.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 3 \u2013 Ligne de code avec violation et \u00e9valuation de la charge de r\u00e9solution<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2248\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue.jpg\" alt=\"LegacyApp_RemoveContinue\" width=\"652\" height=\"254\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue.jpg 652w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue-300x116.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue-624x243.jpg 624w\" sizes=\"(max-width: 652px) 100vw, 652px\" \/><\/a><\/p>\n<p>Nous pouvons voir \u00e0 travers cet exemple comment utiliser SonarQube afin d\u2019aller directement \u00e0 l\u2019essentiel :<\/p>\n<ul>\n<li>Une estimation g\u00e9n\u00e9rale de charge de refactoring des flux de traitement, \u00e0 travers le plugin SQALE.<\/li>\n<li>Une estimation plus fine, au moins pour <a title=\"Application Legacy en C \u2013 Refactoring ou r\u00e9ing\u00e9nierie ? (II)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-c-refactoring-reingenierie-2\/\" target=\"_blank\">les composants \u2018monster\u2019 les plus complexes<\/a> qui vont peser le plus sur la charge globale de r\u00e9ing\u00e9nierie.<\/li>\n<\/ul>\n<p>L\u2019\u00e9quipe de projet peut descendre dans chaque programme, comme nous l\u2019avons fait dans cet exemple, pour \u00e9valuer le niveau de d\u00e9structuration du code et r\u00e9\u00e9crire celui-ci en respectant la logique fonctionnelle, mais en modifiant la logique algorithmique. La solution aux \u2018goto\u2019, \u2018break\u2019 et \u2018continue\u2019 est simple : utiliser des \u2018if..else\u2019. Attention cependant \u00e0 ne pas trop imbriquer ceux-ci.<\/p>\n<p>Chaque langage aura ses propres particularit\u00e9s en mati\u00e8re de flux de traitements, et les bad practices dans ce domaine seront diff\u00e9rentes en C, en Cobol, en ABAP. L\u2019important est de bien prendre en compte ce point, et nous avons vu comment SonarQube pouvait nous y aider.<\/p>\n<h2>Restructuration des donn\u00e9es<\/h2>\n<p>Un reengineering des traitements s\u2019accompagne bien souvent d\u2019un reengineering des donn\u00e9es. Tout un sujet en lui-m\u00eame, on pourrait \u00e9crire un livre entier sur ce seul th\u00e8me. Rapidement, quelques pistes de recherche qui me viennent \u00e0 l\u2019esprit :<\/p>\n<ul>\n<li>V\u00e9rifiez si l\u2019application utilise des fichiers, et s\u2019il serait envisageable de les transformer en tables. Lorsque les donn\u00e9es sont temporaires, un log de messages par exemple, on a tendance \u00e0 les mettre en fichiers. Pourtant, on peut se poser la question de stocker cette information en base de donn\u00e9es, car un &lsquo;Insert&rsquo; dans une table est (normalement) plus rapide que l&rsquo;\u00e9criture d&rsquo;une ligne dans un fichier. Et dans les deux cas, il faudra bien vider celui-ci ou la table en base de donn\u00e9es, lorsque son volume devient trop important.<\/li>\n<li>Identifiez les donn\u00e9es dont les caract\u00e9ristiques de type, de taille ou de pr\u00e9cision vous paraissent singuli\u00e8res, inhabituelles, bref bizarres. Valider celles-ci avec les utilisateurs et en profiter pour leur demander s\u2019ils ont des requ\u00eates dans ce sens.<\/li>\n<li>V\u00e9rifier s\u2019il existe des structures de donn\u00e9es partag\u00e9es, quels composants utilisent les m\u00eames tables ou fichiers. Dans ce cas, il est important de tenter de sp\u00e9cialiser les composants car des acc\u00e8s multiples sur une table sont une source importante de bugs et de co\u00fbts plus importants de maintenance. J\u2019ai vu des applications o\u00f9 une m\u00eame table \u00e9tait acc\u00e9d\u00e9e en Insert\/Update\/Delete par plus de 80 classes diff\u00e9rentes. Chaque fois qu\u2019un d\u00e9veloppeur avait besoin de r\u00e9aliser un traitement sur cette table, il programmait ses propres requ\u00eates SQL, sans v\u00e9rifier s\u2019il n\u2019existait pas d\u00e9j\u00e0 une m\u00e9thode qui faisait ce m\u00eame traitement. R\u00e9sultat : toute modification de la structure de la table n\u00e9cessitait de v\u00e9rifier et \u00e9ventuellement de modifier toutes ces classes. Vous imaginez l\u2019investissement n\u00e9cessaire pour cette t\u00e2che et le niveau de risque si l\u2019on oublie une de ces m\u00e9thodes !<\/li>\n<li>Et pendant que vous y \u00eates, v\u00e9rifiez qu\u2019il n\u2019existe pas de donn\u00e9es redondantes.<\/li>\n<li>M\u00eame chose pour les inconsistances de donn\u00e9es : un \u00e9cran qui affiche une mesure en km et un autre en m\u00e8tres, ou en jours et en heures, ou en heures et en minutes, etc.<\/li>\n<li>En profiter pour aller voir les d\u00e9fauts au niveau SQL dans le code. Pourquoi ces \u2018select *\u2019, \u2018select \u2026 into select\u2019, ces JOIN imbriqu\u00e9s ou sur de multiples tables, etc. Nous avions vu bon nombre de ces \u2018Issues\u2019 dans notre s\u00e9rie sur <a title=\"Analyse PL\/SQL avec SonarQube \u2013 Evaluer la qualit\u00e9 (2\/3)\" href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-evaluer-la-qualite-2\/\" target=\"_blank\">l\u2019analyse de code PL\/SQL avec SonarQube<\/a>.<\/li>\n<\/ul>\n<p>Si vous avez des tables temporaires construites en dynamique durant une session utilisateur, ceci implique g\u00e9n\u00e9ralement des traitements tr\u00e8s complexes qu\u2019il n\u2019est pas possible de r\u00e9gler par de \u2018simples\u2019 curseurs ou boucles, comme du calcul d\u2019agr\u00e9gation statistique. V\u00e9rifiez avec les utilisateurs la criticit\u00e9 de ces traitements. On ne peut pas avoir une m\u00eame application qui pr\u00e9sente la fiche d\u2019un client \u00e0 l\u2019\u00e9cran en moins d\u2019une seconde et en m\u00eame temps effectue dynamiquement une corr\u00e9lation sur toutes sortes de statistiques. Ce sont deux applications diff\u00e9rentes, l&rsquo;une classique de gestion, l&rsquo;autre de reporting ou d&rsquo;infocentre.<\/p>\n<h2>Autres points<\/h2>\n<p>V\u00e9rifiez si l\u2019application originale \u00e9tait correctement comment\u00e9e et viser \u00e0 garder au moins ce niveau de documentation, voire \u00e0 l&rsquo;am\u00e9liorer si ce n&rsquo;est pas le cas.<\/p>\n<p>R\u00e8gles de nommage: si elles n\u2019existent pas, c\u2019est le moment de les fixer pour les d\u00e9veloppements futurs avec ce nouveau langage. Si elles existent, veiller \u00e0 les mettre \u00e0 jour, mais en s&rsquo;appuyant sur les standards en vigueur, ce qui signifie \u00e9galement de v\u00e9rifier vos choix avec les autres \u00e9quipes de projet, et s&rsquo;assurer que tout le monde utilise les m\u00eames normes.<\/p>\n<p>Utiliser un outil d\u2019analyse de code afin de v\u00e9rifier \u2013 tr\u00e8s \u2013 r\u00e9guli\u00e8rement que vous n\u2019introduisez pas des violations aux bonnes pratiques dans le nouveau langage, qui ne sont pas forc\u00e9ment celles du langage pr\u00e9c\u00e9dent. Ok, nombre de d\u00e9fauts en C existent en C++ mais l\u2019inverse n\u2019est pas vrai.<\/p>\n<p>Et surtout, prenez en compte les tests unitaires. Nous avions d\u00e9j\u00e0 fait une <a title=\"Application Legacy \u2013 Refactoring ou reengineering? (VII)\" href=\"http:\/\/qualilogy.com\/fr\/application-legacy-refactoring-reengineering-7\/\" target=\"_blank\">estimation de la charge et des plans d\u2019action possibles<\/a> dans ce domaine.<\/p>\n<h2>Conclusion<\/h2>\n<p>Nous n\u2019avons pas list\u00e9 toutes les pistes possibles d\u2019actions de r\u00e9ing\u00e9nierie, vous pouvez en imaginer bien d\u2019autres. En fait, cela sera tr\u00e8s d\u00e9pendant du projet, de l\u2019application, de la technologie cible, \u2026 Il n\u2019a pas de d\u00e9marche type qui assure invariablement le succ\u00e8s du projet, mais il y a de bonnes chances que les points list\u00e9s ci-dessus am\u00e9liorent les chances de r\u00e9ussite de votre r\u00e9ing\u00e9nierie.<\/p>\n<p>Un dernier conseil, pensez \u00e0 l\u2019avenir: le <a title=\"Elasticit\u00e9 des applications (2\/2)\" href=\"http:\/\/qualilogy.com\/fr\/elasticite-des-applications-22\/\" target=\"_blank\">portage des applications dans le Cloud<\/a> (donc d\u00e9couplage de certains types de traitements, APIs RESTfull, stateless\/statefull, etc.).<br \/>\nD\u2019ailleurs, je pense que nous allons bient\u00f4t voir de plus en plus de projet de r\u00e9ing\u00e9nierie d\u2019applications dans le but de porter celles-ci dans le Cloud.<\/p>\n<p>Ceci cl\u00f4t cette longue s\u00e9rie sur le refactoring et le reengineering d&rsquo;une application Legacy. Pour les prochains posts, je pense upgrader mon installation SonarQube et voir ce qui a chang\u00e9 en mati\u00e8re de code Cobol et SAP.<\/p>\n<p>A bient\u00f4t.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu dans le post pr\u00e9c\u00e9dent comment entamer un reengineering avec SonarQube en commen\u00e7ant par un red\u00e9coupage fonctionnel et le re-design de notre application. Nous pouvons maintenant descendre un peu plus dans le code afin d\u2019identifier des flux de traitements candidats \u00e0 restructuration.<\/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-2239","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2239"}],"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=2239"}],"version-history":[{"count":18,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2239\/revisions"}],"predecessor-version":[{"id":2264,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/2239\/revisions\/2264"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=2239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=2239"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=2239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}