{"id":876,"date":"2013-05-28T16:13:33","date_gmt":"2013-05-28T15:13:33","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=876"},"modified":"2013-06-01T09:16:21","modified_gmt":"2013-06-01T08:16:21","slug":"creation-de-metriques-personnalisees","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/","title":{"rendered":"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-877\" alt=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/05\/NewMetrics1.jpg\" width=\"374\" height=\"249\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/05\/NewMetrics1.jpg 350w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/05\/NewMetrics1-300x199.jpg 300w\" sizes=\"(max-width: 374px) 100vw, 374px\" \/><\/a>Un consultant Qualit\u00e9 me demande s\u2019il est \u00ab\u00a0possible de cr\u00e9er ses propres m\u00e9triques avec Sonar ?\u00a0\u00bb et \u00ab\u00a0quel est le degr\u00e9 de facilit\u00e9 d\u2019introduire de nouvelles r\u00e9gles ?\u00a0\u00bb.<\/p>\n<p>Je sais qu\u2019il est en train de travailler avec un client qui souhaite se doter d\u2019un outil d\u2019analyse de code. Et c\u2019est le crit\u00e8re typique que l\u2019on retrouve traditionnellement dans tous les cahiers des charges lorsqu\u2019il s\u2019agit de choisir un tel outil.<\/p>\n<p>C\u2019est devenu une r\u00e8gle universellement admise, au point m\u00eame que certains vendeurs de software en ont fait un argument de vente et int\u00e8grent dans leurs d\u00e9mos avant-vente la cr\u00e9ation d\u2019une nouvelle r\u00e8gle. Ce n\u2019est pas critique mais cela pla\u00ect. Vous imaginez un vendeur de voitures ouvrir le capot d\u2019un v\u00e9hicule en marche pour r\u00e9gler le carbu ? Ce serait spectaculaire mais quel int\u00e9r\u00eat ? <!--more--><\/p>\n<p>J\u2019ai d\u00e9j\u00e0 dit \u00e0 quel point ce crit\u00e8re est dangereux dans ce post <a title=\"8 crit\u00e8res de choix d'un outil d'analyse de code\" href=\"http:\/\/qualilogy.com\/fr\/8-criteres-de-choix-dun-outil-danalyse-de-code-12\/\" target=\"_blank\">8 crit\u00e8res de choix dun outil d&rsquo;analyse de code<\/a>. Mais je n\u2019avais pas vraiment d\u00e9velopp\u00e9 les raisons pour lesquelles je pense qu\u2019inclure un tel crit\u00e8re dans un choix d\u2019outil peut s\u2019av\u00e9rer une erreur.<\/p>\n<p>La question de ce consultant (et ami) constitue une opportunit\u00e9 pour pr\u00e9senter quelques arguments en faveur de cette th\u00e8se mais surtout :<\/p>\n<ul>\n<li>Aider ceux qui souhaitent effectuer un choix d\u2019outil \u00e0 mieux comprendre comment utiliser ce crit\u00e8re.<\/li>\n<li>Aider les consultants Qualit\u00e9 \u00e0 poser les questions utiles pour une meilleure d\u00e9finition et appr\u00e9ciation de ce crit\u00e8re dans un cahier des charges, en fonction du client, de son contexte, de ses technologies, de ses objectifs, etc.<\/li>\n<\/ul>\n<p>Bref, quitte \u00e0 utiliser ce crit\u00e8re, essayons de le faire intelligemment et en toute connaissance de cause.<\/p>\n<p>Je vais d\u2019abord pr\u00e9senter les diff\u00e8rents types de m\u00e9triques \u2018personnalisables\u2019 et nous verrons ensuite quelle utilisation en faire, pour quelles technologies, et \u00e0 quel co\u00fbt.<\/p>\n<h2>Les diff\u00e9rents types de m\u00e9triques<\/h2>\n<p>Il existe toutes sortes de m\u00e9triques, certaines simples, certaines plus complexes et certaines impossibles. Remarque pr\u00e9liminaire pour les puristes de la Qualit\u00e9 : pour des raisons de simplicit\u00e9, je vais regrouper sous le m\u00eame vocable de \u2018m\u00e9trique\u2019 diff\u00e9rentes notions de \u2018r\u00e9gles\u2019, \u2018indicateurs\u2019, \u2018diagnostics\u2019, etc. Merci donc de ne pas vous formaliser pour le vocabulaire employ\u00e9. C\u2019est mon blog, pas le dictionnaire de l\u2019Acad\u00e9mie fran\u00e7aise.<\/p>\n<h3>M\u00e9triques simples, de type indicateur<\/h3>\n<p>Imaginons que vous souhaitez mesurer le nombre de d\u00e9fauts critiques ou bloquants par rapport \u00e0 la taille du code. Une application fait 50 000 lignes de code et comporte 500 violations critiques : la valeur de cette m\u00e9trique, dans cette exemple, sera donc de 1 violation critique pour 100 lignes de code.<\/p>\n<p>En l\u2019esp\u00e8ce, on ne devrait pas parler de m\u00e9trique mais d\u2019indicateur, car ce r\u00e9sultat ne provient pas directement de l\u2019analyse du code, mais du croisement de deux valeurs issues de l\u2019analyse. En fait, vous n\u2019avez pas besoin que l\u2019outil puisse cr\u00e9er des m\u00e9triques, simplement de pouvoir acc\u00e9der aux r\u00e9sultats d\u2019analyse, g\u00e9n\u00e9ralement par une requ\u00eate dans la base de donn\u00e9es o\u00fa sont stock\u00e9s ces r\u00e9sultats, ou \u00e0 l\u2019aide d\u2019un service Web avec Sonar.<\/p>\n<h3>Bonnes pratiques de programmation<\/h3>\n<p><a href=\"http:\/\/qualilogy.com\/es\/wp-content\/uploads\/sites\/4\/2013\/05\/DblCm.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-thumbnail wp-image-543\" alt=\"DblCm\" src=\"http:\/\/qualilogy.com\/es\/wp-content\/uploads\/sites\/4\/2013\/05\/DblCm-150x150.jpg\" width=\"150\" height=\"150\" \/><\/a>Ces m\u00e9triques mesurent (le plus souvent) l\u2019utilisation de syntaxes qui enfreignent les bonnes pratiques de programmation. Dans tous les langages, certaines instructions sont prohib\u00e9es parce qu\u2019elles pr\u00e9sentent un risque pour le bon fonctionnement de l\u2019application, la performance de celle-ci, la maintenabilit\u00e9 ou la lisibilit\u00e9 du code, etc. L\u2019objectif cette fois est donc d\u2019identifier la syntaxe correspondante et d\u2019en compter le nombre d\u2019occurences.<\/p>\n<p>C\u2019est g\u00e9n\u00e9ralement la m\u00e9trique que l\u2019on associe au crit\u00e8re de \u2018cr\u00e9ation de nouvelles r\u00e9gles\u2019, et le cas utilis\u00e9 le plus souvent dans une d\u00e9mo. Elle reste relativement simple dans la mesure o\u00fa il s\u2019agit de rechercher une cha\u00eene de texte correspondant \u00e0 l\u2019instruction prohib\u00e9e : par exemple un \u2018catch(Throwable)\u2019 en Java, qui correspond \u00e0 une gestion incorrecte des erreurs. Ou un \u2018BREAK\u2019 en ABAP qui aura pour effet d\u2019interrompre brutalement le programme, ou son \u00e9quivalent \u2018STOP .. RUN\u2019 en Cobol. Un programmeur peut utiliser ces instructions \u00e0 fin de d\u00e9bugguer son code, et oublier de les supprimer ensuite, avec le risque de voir cette instruction s\u2019ex\u00e9cuter en environnement de production. Je ne connais pas de \u2018Blocker\u2019 plus \u2018bloquant\u2019 que celui-ci.<\/p>\n<p>La recherche d\u2019une cha\u00eene de texte n\u2019est pas tr\u00e8s compliqu\u00e9e, mais il faudra penser \u00e0 tous les cas :<\/p>\n<ul>\n<li><strong>\u2018catch(Throwable xxx)<\/strong>\u2019<\/li>\n<li><strong>\u2018catch (Throwable xxx)\u2019<\/strong> , avec un espace avant la parenth\u00e8se, voire plusieurs espaces ou une tabulation<\/li>\n<li>voire m\u00eame : <strong>\u2018catch<\/strong><br \/>\n<strong>\u00a0\u00a0 \u00a0(Throwable xxx)\u2019<\/strong> avec un saut de ligne avant la parenth\u00e8se.<\/li>\n<\/ul>\n<p>Le d\u00e9veloppement d\u2019une telle m\u00e9trique n\u00e9cessite l\u2019utilisation d\u2019expressions r\u00e9guli\u00e8res \u2013 les fameuses RegExp \u2013 que nous n\u2019allons pas d\u00e9tailler ici d\u2019autant que je n\u2019ai jamais \u00e9t\u00e9 un expert de celles-ci (trop vieux pour les avoir apprises \u00e0\u00a0 l\u2019\u00e9cole).<\/p>\n<p>Je souhaite simplement pr\u00e9ciser que m\u00eame une m\u00e9trique simple bas\u00e9e sur une simple instruction ou cha\u00eene de caract\u00e8res va n\u00e9cessiter un minimum de r\u00e9flexion, pour ne pas dire de conception afin de bien identifier tous les cas possibles, la ma\u00eetrise des syntaxes RegExp, et des tests afin de v\u00e9rifier que tous ces cas sont couverts.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/es\/wp-content\/uploads\/sites\/4\/2013\/05\/MetreRuban.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-545\" alt=\"MetreRuban\" src=\"http:\/\/qualilogy.com\/es\/wp-content\/uploads\/sites\/4\/2013\/05\/MetreRuban-300x252.jpg\" width=\"204\" height=\"172\" \/><\/a>La plupart sinon tous les outils d\u2019analyse de code permettent la cr\u00e9ation de telles m\u00e9triques. Avec plus ou moins de facilit\u00e9 certes, mais la facilit\u00e9 \u00ab\u00a0\u00e0 introduire une nouvelle r\u00e9gle\u00a0\u00bb n\u2019est pas en fait un crit\u00e8re si important puisque la difficult\u00e9 r\u00e9side dans le d\u00e9veloppement et le test des expressions r\u00e9guli\u00e8res.<\/p>\n<p>Je conseillerai simplement d\u2019identifier les outils qui proposent de v\u00e9ritables usines \u00e0 gaz pour cr\u00e9er de nouvelles r\u00e8gles :<\/p>\n<ul>\n<li>Utilisation de fichiers xml pour d\u00e9finir les r\u00e8gles personnalis\u00e9es et g\u00e9rer les expressions r\u00e9guli\u00e8res, obligatoirement localis\u00e9s dans un r\u00e9pertoire sp\u00e9cifique (g\u00e9n\u00e9ralement non indiqu\u00e9 dans la documentation) sinon le logiciel ne saura pas les prendre en compte,<\/li>\n<li>Gestion non automatis\u00e9e des identifiants de r\u00e8gles : chaque r\u00e8gle doit avoir un ID (un num\u00e9ro de r\u00e8gle) unique. Vous devez donc g\u00e9rer vous-m\u00eames votre propre index de r\u00e8gles, et vous pouvez \u00eatre s\u00fbrs que vous rencontrerez des conflits d\u2019identifiants, surtout si vous \u00eates plusieurs \u00e0 g\u00e9rer ces r\u00e8gles et qu\u2019une plage d\u2019IDs sp\u00e9cifique n\u2019est pas normalis\u00e9e.<\/li>\n<li>D\u00e9finition de traitements en base de donn\u00e9es, pour compter le nombre de violations rencontr\u00e9es pour les r\u00e9gles que vous avez d\u00e9finies.<\/li>\n<li>Gestion non automatis\u00e9e de l\u2019affichage de la m\u00e9trique : certains outils regroupent les m\u00e9triques par cat\u00e9gories, par poids, ou selon diff\u00e9rents facteurs, et vous devez pr\u00e9ciser o\u00fa vous souhaitez voir appara\u00eetre la m\u00e9trique, dans quelle cat\u00e9gorie ou quel groupe de m\u00e9triques.<\/li>\n<\/ul>\n<p>A suivre dans le prochain post : nous parlerons de m\u00e9triques complexes ou impossibles.<\/p>\n<p>A bient\u00f4t.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un consultant Qualit\u00e9 me demande s\u2019il est \u00ab\u00a0possible de cr\u00e9er ses propres m\u00e9triques avec Sonar ?\u00a0\u00bb et \u00ab\u00a0quel est le degr\u00e9 de facilit\u00e9 d\u2019introduire de nouvelles r\u00e9gles ?\u00a0\u00bb. Je sais qu\u2019il est en train de travailler avec un client qui souhaite se doter d\u2019un outil d\u2019analyse de code. Et c\u2019est le crit\u00e8re typique que l\u2019on [&hellip;]<\/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-876","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/876"}],"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=876"}],"version-history":[{"count":22,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/876\/revisions"}],"predecessor-version":[{"id":880,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/876\/revisions\/880"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=876"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}