{"id":1651,"date":"2014-02-23T16:12:48","date_gmt":"2014-02-23T15:12:48","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=1651"},"modified":"2014-02-27T18:05:00","modified_gmt":"2014-02-27T17:05:00","slug":"analyse-plsql-avec-sonarqube-evaluer-la-qualite-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-evaluer-la-qualite-2\/","title":{"rendered":"Analyse PL\/SQL avec SonarQube \u2013 Evaluer la qualit\u00e9 (2\/3)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1652\" alt=\"PLSQLEva2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQLEva2.jpg\" width=\"266\" height=\"400\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQLEva2.jpg 266w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQLEva2-199x300.jpg 199w\" sizes=\"(max-width: 266px) 100vw, 266px\" \/><\/a>D\u00e9sol\u00e9 de vous avoir fait attendre pour la suite de cette s\u00e9rie sur le code PL\/SQL et SonarQube, mais j&rsquo;ai \u00e9t\u00e9 pas mal occup\u00e9, entre voyages, travail et mon portable qui m&rsquo;a l\u00e2chement abandonn\u00e9, en invoquant bien \u00e9videmment la loi de Murphy pour justifier de tomber en panne au pire moment.<\/p>\n<p>Rappel sur les posts pr\u00e9c\u00e9dents : apr\u00e8s avoir configur\u00e9 une <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-configuration\/\" target=\"_blank\">analyse de code PL\/SQL avec SonarQube<\/a>, nous avons constitu\u00e9 <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-quality-profile-plsql\/\" target=\"_blank\">notre propre Quality Profile<\/a> en orientant les r\u00e8gles <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-sonarqube-blockers\" target=\"_blank\">Blockers<\/a> et <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-criticals\/\" target=\"_blank\">Criticals<\/a> sur la robustesse, la performance et la s\u00e9curit\u00e9. A quoi ressemble maintenant notre tableau de bord ? <!--more--><\/p>\n<p>Nous avons d\u2019abord examin\u00e9 dans le post pr\u00e9c\u00e9dent <a href=\"http:\/\/qualilogy.com\/fr\/analyse-plsql-avec-sonarqube-evaluer-la-qualite-1\/\" target=\"_blank\">les m\u00e9triques de taille<\/a> pour constater que le nombre moyen de lignes de codes par objet (proc\u00e9dure, fonction, trigger, etc.) \u00e9tait correct.<\/p>\n<p>Gr\u00e2ce au nouveau widget File Bubble Chart nous avons d\u00e9couvert qu\u2019un fichier unique \u2018CreatePackageBody.sql\u2019 de plus de 58 000 lignes, embarquait toute la logique m\u00e9tier au niveau de la base de donn\u00e9es, ce qui va tr\u00e8s certainement entra\u00eener un co\u00fbt de maintenance \u00e9lev\u00e9 pour cette application.<\/p>\n<h2>Complexit\u00e9 et duplications<\/h2>\n<h3>Complexit\u00e9<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Complexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1660\" alt=\"PLSQL_Complexity\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Complexity.jpg\" width=\"348\" height=\"152\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Complexity.jpg 348w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Complexity-300x131.jpg 300w\" sizes=\"(max-width: 348px) 100vw, 348px\" \/><\/a> Un coup d\u2019\u0153il sur la Complexit\u00e9 Cyclomatique (CC) aboutit \u00e0 des r\u00e9sultats semblables : la complexit\u00e9 moyenne par objet est relativement basse avec 6.9 points de CC, et un maximum de 12 points. Par contre, la complexit\u00e9 par fichier d\u00e9passe les 600 points, et nous avons un total d\u2019un peu plus de 10 000 points de CC dans toute l\u2019application, ce qui est assez peu.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQ_CCglobale.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1662\" alt=\"PLSQ_CCglobale\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQ_CCglobale.jpg\" width=\"492\" height=\"118\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQ_CCglobale.jpg 492w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQ_CCglobale-300x71.jpg 300w\" sizes=\"(max-width: 492px) 100vw, 492px\" \/><\/a><\/p>\n<p>L\u2019effort de tests pour celle-ci n\u2019est donc pas tr\u00e8s \u00e9lev\u00e9. Rappelons que la Complexit\u00e9 Cyclomatique est une mesure du nombre de \u2018chemins\u2019 diff\u00e9rents dans une application. Id\u00e9alement, tous ses chemins doivent \u00eatre test\u00e9s, donc la CC nous donne une id\u00e9e de l\u2019effort de tests.<\/p>\n<p>On consid\u00e8re qu\u2019\u00e0 partir de 20 000 points pour une application, il est n\u00e9cessaire d\u2019effectuer une \u00e9tape sp\u00e9cifique de QA et de r\u00e9diger des cahiers de test, et si possible d\u2019automatiser ceux-ci avec un outil sp\u00e9cifique. Dans notre cas, nous pouvons laisser l\u2019\u00e9quipe de projet r\u00e9aliser ces tests en interne.<br \/>\nMais comme on peut le voir avec le Treemap ci-dessous, que j\u2019ai configur\u00e9 pour afficher la Complexit\u00e9 Cyclomatique \u2026<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_CCBig.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1665\" alt=\"PLSQL_CCBig\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_CCBig.jpg\" width=\"559\" height=\"166\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_CCBig.jpg 559w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_CCBig-300x89.jpg 300w\" sizes=\"(max-width: 559px) 100vw, 559px\" \/><\/a><\/p>\n<p>Notre fichier \u2018CreatePackageBody.sql\u2019 embarque 90% de la complexit\u00e9 et donc de la logique de l\u2019application. Donc encore une fois, nous avons des chiffres qui sont corrects au niveau d\u2019une application \u2026 sauf qu\u2019ici l\u2019application tient pratiquement dans un seul fichier monstrueux.<\/p>\n<h3>Duplications<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Duplications.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1668\" alt=\"PLSQL_Duplications\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Duplications.jpg\" width=\"350\" height=\"120\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Duplications.jpg 350w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Duplications-300x102.jpg 300w\" sizes=\"(max-width: 350px) 100vw, 350px\" \/><\/a>Apr\u00e8s la complexit\u00e9, je vais regarder le niveau de duplication, assez \u00e9lev\u00e9. Pas de surprise, le m\u00eame fichier monstre qui impl\u00e9mente la logique applicative est l\u00e0 encore en t\u00eate.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1667\" alt=\"PLSQL_DuplicHotspot\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot.jpg\" width=\"582\" height=\"193\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot.jpg 582w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot-300x99.jpg 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/p>\n<p>Cependant, nous rencontrons un nombre \u00e9lev\u00e9 de Copier\/Coller dans les autres fichiers, et en particulier le fichier \u2018Create_Tables.sql\u2019. Puisque ce script se charge de cr\u00e9er les tables de la base de donn\u00e9es, cela signifie que nous avons nombre de structures de donn\u00e9es qui sont dupliqu\u00e9es.<\/p>\n<p>Ce qui pourrait indiquer que le mod\u00e8le de donn\u00e9es n\u2019est pas optimis\u00e9. Cela arrive pour une application ancienne, car il est plus facile d\u2019ajouter de nouvelles tables que de faire \u00e9voluer celles existantes. Mais plus de tables signifie plus de jointures, donc une moindre performance et plus de complexit\u00e9 pour maintenir ces structures de donn\u00e9es.<\/p>\n<p>Dans le cadre d\u2019un v\u00e9ritable audit de la qualit\u00e9 de cette application, je prendrais le temps de me plonger dans ce script de cr\u00e9ation de tables afin de v\u00e9rifier cette hypoth\u00e8se, et trouver quelques exemples qui puissent supporter une recommandation de refactoring de la base de donn\u00e9es.<br \/>\nPar exemple, je compte 687 \u2018CREATE TABLE\u2019 dans ce fichier, donc 687 tables en tout (sans compter les vues). 8 963 lignes dupliqu\u00e9es dans ce script signifie en moyenne 13 lignes, donc 13 champs semblables par table. Il est logique d\u2019avoir quelques champs \u2018cl\u00e9s\u2019 r\u00e9p\u00e9t\u00e9s pour pouvoir effectuer des jointures, mais peut-\u00eatre pas \u00e0 ce point l\u00e0.<\/p>\n<h2>Composants \u00e0 risque<\/h2>\n<p>Apr\u00e8s avoir regard\u00e9 les m\u00e9triques quantitatives, nous avons d\u00e9j\u00e0 pas mal d\u2019informations concernant cette application, certainement plus d&rsquo;ailleurs que n\u2019en connaissent habituellement les responsables de celle-ci, pour ne pas parler des stakeholders ou responsables informatiques.<\/p>\n<p>La seconde partie d\u2019une \u00e9valuation de la qualit\u00e9 consiste \u00e0 identifier les principales menaces, et cela passe par le recensement des composants les plus risqu\u00e9s. Nous avons vu, dans les posts pr\u00e9c\u00e9dents :<\/p>\n<ul>\n<li>16 blockers concernant la r\u00e8gle \u2018Use IS NULL and IS NOT NULL instead of direct NULL comparisons\u2019, et de surcro\u00eet ceux-ci dupliqu\u00e9s plusieurs fois : quelqu\u2019un dans l\u2019\u00e9quipe n\u00e9cessite probablement un rappel concernant cette r\u00e8gle.<\/li>\n<li>2 &lsquo;Calling COMMIT or ROLLBACK from within a trigger will lead to an ORA-04092 exception&rsquo;. Et 1 \u2018Do not declare a variable more than once in a given scope (PLS-00371)\u2019 : probables erreurs d\u2019inattention, la perfection n\u2019est pas de ce monde. Dans tous les cas, \u00e0 corriger d\u2019urgence pour le risque encouru par les utilisateurs.<\/li>\n<\/ul>\n<p>Apr\u00e8s avoir remont\u00e9 un certain nombre de r\u00e8gles Major en Critical, nous avons maintenant :<\/p>\n<ul>\n<li>320 \u2018Sensitive SYS owned functions should not be used\u2019, dont 270 dans notre fichier \u2018CreatePackageBody.sql\u2019 : c\u2019est l\u2019inconv\u00e9nient de faire du Copier\/Coller, on duplique des d\u00e9fauts critiques pour la s\u00e9curit\u00e9 de l\u2019application.<\/li>\n<li>Un certain nombre de d\u00e9fauts critiques, pour des r\u00e8gles Major que nous avons remont\u00e9 dans cette cat\u00e9gorie Critical.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Criticals2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1677\" alt=\"PLSQL_Criticals2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Criticals2.jpg\" width=\"560\" height=\"413\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Criticals2.jpg 560w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_Criticals2-300x221.jpg 300w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/a><\/p>\n<p>La plupart de ces r\u00e8gles impactent la performance ou la robustesse de l\u2019application, donc pr\u00e9sentent un risque pour l\u2019utilisateur final.<br \/>\nUn chantier est donc recommand\u00e9 pour corriger ces d\u00e9fauts dans l\u2019application, surtout si la satisfaction des utilisateurs est un objectif important pour notre d\u00e9partement IT. Mais quel en serait le co\u00fbt ?<\/p>\n<p>C\u2019est ce que nous verrons dans le prochain post, avec le plugin Sqale pour la Technical Debt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>D\u00e9sol\u00e9 de vous avoir fait attendre pour la suite de cette s\u00e9rie sur le code PL\/SQL et SonarQube, mais j&rsquo;ai \u00e9t\u00e9 pas mal occup\u00e9, entre voyages, travail et mon portable qui m&rsquo;a l\u00e2chement abandonn\u00e9, en invoquant bien \u00e9videmment la loi de Murphy pour justifier de tomber en panne au pire moment. Rappel sur les posts [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-1651","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1651"}],"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=1651"}],"version-history":[{"count":24,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1651\/revisions"}],"predecessor-version":[{"id":1654,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/1651\/revisions\/1654"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=1651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=1651"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=1651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}