{"id":901,"date":"2013-06-08T09:50:18","date_gmt":"2013-06-08T08:50:18","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=901"},"modified":"2013-06-09T08:44:47","modified_gmt":"2013-06-09T07:44:47","slug":"creations-de-metriques-personnalisees-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/creations-de-metriques-personnalisees-2\/","title":{"rendered":"Cr\u00e9ations de m\u00e9triques personnalis\u00e9es (2)"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-902\" alt=\"Cr\u00e9er des m\u00e9triques personnalis\u00e9es (2)\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetrics2.jpg\" width=\"253\" height=\"380\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetrics2.jpg 253w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetrics2-199x300.jpg 199w\" sizes=\"(max-width: 253px) 100vw, 253px\" \/><\/a><\/p>\n<p>La cr\u00e9ation de ses propres m\u00e9triques dans un outil d&rsquo;analyse de code pr\u00e9sente-t-elle vraiment un int\u00e9r\u00eat ? Quel b\u00e9n\u00e9fice peut-on en esp\u00e9rer ? Quels inconv\u00e9nients, quels obstacles va-t-on rencontrer ?<\/p>\n<p>Il est frappant de voir que ces questions sont la plupart du temps ignor\u00e9es lors d&rsquo;un choix d&rsquo;outil. On pr\u00e9f\u00e8re mesurer la facilit\u00e9 ou la difficult\u00e9 \u00e0 personnaliser le logiciel et \u00e0 cr\u00e9er ses propres r\u00e8gles plut\u00f4t que de se demander si l&rsquo;on en a vraiment besoin.<\/p>\n<p>Cette s\u00e9rie d&rsquo;articles a donc pour objet de clarifier ces questions afin de vous aider \u00e0 poser les bons crit\u00e8res si vous souhaitez acqu\u00e9rir un outil d&rsquo;analyse de code. Si vous \u00eates un consultant Qualit\u00e9 qui doit assister un client pour un tel choix, vous pouvez aborder ces questions avec lui afin de l&rsquo;aider dans sa s\u00e9lection. <!--more--><\/p>\n<p>Apr\u00e8s avoir vu <a title=\"Cr\u00e9ation de m\u00e9triques personnalis\u00e9es - Les m\u00e9triques les plus simples\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/\" target=\"_blank\">les m\u00e9triques les plus simples<\/a> et les plus faciles \u00e0 cr\u00e9er avec un outil d&rsquo;analyse de code, nous allons aborder dans cet article des m\u00e9triques beaucoup plus complexes et m\u00eame, certains standards ou bonnes pratiques que j&rsquo;ai rencontr\u00e9s chez certains clients, et qui sont tout simplement impossibles \u00e0 impl\u00e9menter.<\/p>\n<h2>Les m\u00e9triques complexes<\/h2>\n<p>La plupart des m\u00e9triques r\u00e9ellement utiles sont complexes parce qu\u2019elles reposent sur des syntaxes ou des bonnes pratiques de programmation complexes, sinon \u00e0 mettre en \u0153uvre, mais en tout cas \u00e0 identifier. Par exemple :<\/p>\n<ul>\n<li>Toutes les instructions conditionnelles (type \u2018IF \u2026 THEN &#8230; ELSE \u2026 ENDIF&rsquo;) ou de boucle (type \u2018While \u2026 EndWhile\u2019 ou \u2018Loop \u2026 EndLoop\u2019) sont structur\u00e9es en blocs multiples : \u2018IF\u2019 ou \u2018While\u2019 suivi de plusieurs lignes de code (parfois sur plus d\u2019une page) avant le \u2018ENDIF\u2019 ou le \u2018EndWhile&rsquo; de fin d&rsquo;instruction. Essayer d\u2019identifier ces instructions avec une unique RegExp (voir le <a title=\"Expressions r\u00e9guli\u00e8res\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/\" target=\"_blank\">post pr\u00e9c\u00e9dent<\/a> sur les Expressions R\u00e9guli\u00e8res) devient un vrai casse-t\u00eate. C\u2019est une source assez r\u00e9pandue de falses-positives pour nombre d\u2019outils d\u2019analyse de code.<\/li>\n<li>Certaines instructions peuvent \u00eatre gourmandes en m\u00e9moire ou en temps d\u2019ex\u00e9cution, sans pr\u00e9senter pour autant un risque pour la performance \u2026 sauf si elles sont inscrites dans une boucle. L\u00e0-encore, essayer d\u2019identifier la pr\u00e9sence d\u2019une telle syntaxe au sein d\u2019une instruction de boucle est tr\u00e8s complexe et requiert une ma\u00eetrise tr\u00e8s pointue des expressions r\u00e9guli\u00e8res.<\/li>\n<li>La plupart des r\u00e8gles en mati\u00e8re de lisibilit\u00e9 et de compr\u00e9hension du code, donc de bonnes pratiques de maintenabilit\u00e9, sont bas\u00e9es sur l\u2019imbrication de telles instructions : IF imbriqu\u00e9s, boucles au sein de boucles, le tout g\u00e9n\u00e9ralement sur plusieurs pages de code. Risque important d\u2019erreur et au minimum, co\u00fbt de maintenance \u00e9lev\u00e9 car toute modification de ce code n\u00e9cessite un effort de programmation plus \u00e9lev\u00e9. L\u00e1 encore, ces r\u00e8gles sont complexes ou tr\u00e8s complexes \u00e0 impl\u00e9menter avec des expressions r\u00e9guli\u00e8res.<\/li>\n<li>D\u2019autres bonnes pratiques de programmation d\u00e9pendent du type d\u2019objets. Le meilleur exemple d\u2019une telle r\u00e8gle, pr\u00e9sente dans toutes les technologies et languages, est celle qui interdit tout appel \u00e0 la base de donn\u00e9es depuis la couche de pr\u00e9sentation. Probablement la premi\u00e8re r\u00e8gle en mati\u00e8re de s\u00e9curit\u00e9. Il ne suffit donc pas d\u2019identifier une instruction mais toutes les differentes instructions acc\u00e9dant potentiellement \u00e0 la base de donn\u00e9es, de v\u00e9rifier que celles-ci sont utilis\u00e9es dans un \u00e9cran (la couche de pr\u00e9sentation) et qu\u2019elles ex\u00e9cutent un traitement en bases de donn\u00e9es. Notez bien que c\u2019est plus subtil et compliqu\u00e9 que cela : ex\u00e9cuter une requ\u00eate SQL depuis une JSP est strictement intedit mais passer cette m\u00eame requ\u00eate \u00e0 un objet de la couche logique de donn\u00e9es qui effectuera lui-m\u00eame ce traitement peut \u00eatre admis. La bonne pratique consiste bien s\u00fbr \u00e0 ne passer que les donn\u00e9es n\u00e9cessaires \u00e0 l\u2019ex\u00e9cution de cette requ\u00eate SQL \u00e0 un objet sp\u00e9cialis\u00e9 dans l\u2019acc\u00e8s \u00e0 la couche de donn\u00e9es, mais la programmation incorrecte de celui-ci constitue la source la plus importante des \u2018SQL injections\u2019 si ch\u00e8res aux hackers.<\/li>\n<\/ul>\n<p>Il devient tr\u00e8s difficile et m\u00eame impossible de concevoir et impl\u00e9menter de telles m\u00e9triques \u00e0 l\u2019aide d\u2019expressions r\u00e9guli\u00e8res. Il faut g\u00e9n\u00e9ralement que l\u2019outil d\u2019analyse de code permette d\u2019analyser l\u2019arbre syntaxique des instructions, ce qui n\u2019est pas le cas de tous les outils. Et il faudra des comp\u00e9tences assez avanc\u00e9es dans la compr\u00e9hension de cet \u2018Abstract Syntax Tree\u2019 ainsi que des outils et un langage sp\u00e9cifiques pour parcourir cet arbre et programmer votre m\u00e9trique. D\u00e9butant s\u2019abstenir.<\/p>\n<h2>Les m\u00e9triques impossibles<\/h2>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/Metre2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-918\" alt=\"Metre2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/Metre2.jpg\" width=\"250\" height=\"254\" \/><\/a>Plus une m\u00e9trique est complexe, plus elle est difficile \u00e0 impl\u00e9menter, parfois \u00e0 la limite de ce qu\u2019il est possible de faire. Mais certaines bonnes pratiques \u2018personnalis\u00e9es\u2019 sont tout simplement impossible \u00e0 r\u00e9aliser.<\/p>\n<p>Une des premi\u00e8res questions que je pose \u00e0 un client qui souhaite impl\u00e9menter ses propres r\u00e8gles consiste \u00e0 lui demander s\u2019il dispose d\u2019un cahier de r\u00e8gles ou tout autre document d\u00e9crivant ses \u2018best practices\u2019. Ce n\u2019est pas toujours, voire m\u00eame rarement le cas, mais je suis content lorsqu\u2019il me r\u00e9pond par l\u2019affirmative car cela signifie que sa demande \u2013 la \u2018facilit\u00e9 d\u2019impl\u00e9mentation de m\u00e9triques personnalis\u00e9es\u2019 \u2013 est justifi\u00e9e, et qu\u2019\u00e0 partir de l\u00e0, nous allons pouvoir travailler s\u00e9rieusement.<\/p>\n<p>La lecture d\u2019un tel document va cependant r\u00e9v\u00e9ler qu\u2019une proportion importante des ces r\u00e8gles est tout simplement impossible \u00e0 impl\u00e9menter. Cette proportion est plus ou moins \u00e9lev\u00e9e selon la technologie concern\u00e9e (nous verrons cela dans le prochain post sur ce sujet). Exemples :<\/p>\n<ul>\n<li>\u00ab\u00a0Une classe, une m\u00e9thode, une fonction, une proc\u00e9dure, un paragraphe (Cobol), etc. doit \u00eatre document\u00e9\u00a0\u00bb selon un template \u2018maison\u2019. Essayez d\u00e9j\u00e0 de d\u00e9finir une RegExp qui v\u00e9rifie si un commentaire est pr\u00e9sent en t\u00eate de classe, de m\u00e9thode, de fonction, etc. Maintenant construisez une RegExp qui v\u00e9rifie que ce commentaire correspond \u00e0 un format pr\u00e9cis, sur plusieurs lignes bien s\u00fbr, avec au minimum l\u2019auteur, la date, une description de l\u2019objet, etc. Bon courage.<\/li>\n<li>\u00ab\u00a0L\u2019en-t\u00eate de chaque programme doit comporter une description de la fonctionnalit\u00e9 impl\u00e9ment\u00e9e\u00a0\u00bb. Cette r\u00e8gle est une variante plus avanc\u00e9e de la pr\u00e9c\u00e9dente : non seulement vous devez v\u00e9rifier que le commentaire d\u2019en-t\u00eate r\u00e9pond \u00e0 une certaine forme mais que sur le fond, il pr\u00e9sente le traitement fonctionnel objet de ce programme. Impossible.<\/li>\n<li>\u00ab\u00a0Les messages d\u2019erreur doivent \u00eatre traduits en espagnol, en catalan, et en basque\u00a0\u00bb. Vive le pluralisme.<\/li>\n<li>Identification de code mort. J\u2019aime bien les outils d\u2019analyse de code qui pr\u00e9tendent identifier le code mort. Un truc de programmeur (un peu avanc\u00e9) pour mettre en commentaire tout un bloc de code :<\/li>\n<\/ul>\n<p style=\"padding-left: 60px\"><strong>IF 1=0<\/strong><\/p>\n<p style=\"padding-left: 90px\"><strong>\u2026 code mort<\/strong><\/p>\n<p style=\"padding-left: 60px\"><strong>ENDIF<\/strong><\/p>\n<p>Ah bien s\u00fbr, il est assez facile de d\u00e9finir une RegExp qui va trouver toutes les occurrences de \u2018IF 1=0\u2019. Combien de RegExp pour identifier les occurrences de \u2018IF A=B\u2019 ou de \u2018IF 1=2\u2019 ? Laissez tomber.<\/p>\n<p>La prochaine fois qu\u2019un vendeur vous dit que son soft sait identifier le code mort, donnez lui cet exemple (et essayez de ne pas sourire).<\/p>\n<p>Et je ne vous parle m\u00eame pas de r\u00e8gles g\u00e9n\u00e9rales et impr\u00e9cises comme :<\/p>\n<ul>\n<li>\u00ab\u00a0Contr\u00f4le de sytaxe : corriger les erreurs critiques et justifier les exceptions aux r\u00e8gles non critiques\u00a0\u00bb. D\u00e9brouille-toi avec \u00e7a.<\/li>\n<li>\u00ab\u00a0Il est interdit de d\u00e9velopper une fonction s\u2019il existe d\u00e9j\u00e0 une fonction r\u00e9alisant le m\u00eame traitement\u00a0\u00bb. Ah ben oui bien s\u00fbr, c\u2019est logique, mais merci quand m\u00eame de le rappeler.<\/li>\n<li>\u00ab\u00a0V\u00e9rifier que le programme appel\u00e9 existe bien\u00a0\u00bb. A tout hasard, au cas o\u00fa, cela peut servir. Remarque : en fait, cette r\u00e8gle peut \u00eatre impl\u00e9ment\u00e9e facilement en v\u00e9rifiant le code retour de l\u2019appel \u00e0 la fonction &#8230; quand il existe.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/MetreBois.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-920\" alt=\"MetreBois\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/MetreBois.jpg\" width=\"317\" height=\"167\" \/><\/a>Je veux simplement montrer \u00e0 quel point certaines r\u00e8gles sont compl\u00e8tement impossibles \u00e0 impl\u00e9menter et elles sont plus nombreuses que vous le pensez (si, si, j\u2019ai des exemples).<\/p>\n<p>Plus s\u00e9rieusement, si votre client vous pr\u00e9sente un cahier avec de telles r\u00e8gles, \u00e9vitez tout commentaire moqueur car au moins, l\u2019existence d\u2019un tel document prouve qu\u2019il se soucie de la qualit\u00e9 de ses applications. Simplement, la plupart de ces cahiers de r\u00e8gles sont destin\u00e9s \u00e0 des v\u00e9rifications manuelles du code, et vous ne pouvez tout simplement pas automatiser toutes les r\u00e8gles manuelles.<\/p>\n<p>Lorsqu\u2019on vous demande si tel outil permet de cr\u00e9er des r\u00e8gles personnalis\u00e9es, la premi\u00e8re r\u00e9action consiste \u00e0 exposer ce que tel outil sait faire, et g\u00e9n\u00e9ralement pour des r\u00e8gles reposant sur des syntaxes simples, comme celles que nous avons vues dans le <a title=\"Expressions r\u00e9guli\u00e8res\" href=\"http:\/\/qualilogy.com\/fr\/creation-de-metriques-personnalisees\/\" target=\"_blank\">post pr\u00e9c\u00e9dent<\/a>. Votre client s\u2019en contentera mais ce n\u2019est pas la bonne r\u00e9ponse. Ce que je fais :<\/p>\n<ul>\n<li>Je lui demande s\u2019il a d\u00e9fini les r\u00e8gles en question, c\u2019est-\u00e0-dire s\u2019il dispose de bonnes pratiques qu\u2019il souhaite impl\u00e9menter \u00e0 travers l\u2019outil.<\/li>\n<li>Si c\u2019est le cas (r\u00e9ponse affirmative) : je lui demande si ces r\u00e8gles sont formalis\u00e9es \u00e0 travers un document.<\/li>\n<li>Si ce n\u2019est pas le cas (r\u00e9ponse n\u00e9gative) : je lui rappelle que 100% des clients qui souhaitent acqu\u00e9rir un outil d\u2019analyse de code posent cette m\u00eame question, mais que 90% n\u2019utiliseront pas cette fonctionnalit\u00e9. Et 90% des 10% restants abandonneront la gestion de m\u00e9triques personnalis\u00e9es au bout de 2 ans parce que c\u2019est trop lourd \u00e0 g\u00e9rer.<\/li>\n<li>Dans tous les autres cas &#8211; bredouillement indistinct du genre \u2018on y pense\u2019, \u2018cest pour savoir\u2019, \u2018au cas o\u00fa\u2019, \u2018\u00e9ventuellement\u2019, etc \u2013 je traite sa r\u00e9ponse comme n\u00e9gative (point pr\u00e9c\u00e9dent) ou je passe \u00e0 la question suivante :<\/li>\n<\/ul>\n<p>R\u00e8gles personnalis\u00e9es : pour quelles technologies ?<\/p>\n<p>Ce sera l\u2019objet de notre prochain post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La cr\u00e9ation de ses propres m\u00e9triques dans un outil d&rsquo;analyse de code pr\u00e9sente-t-elle vraiment un int\u00e9r\u00eat ? Quel b\u00e9n\u00e9fice peut-on en esp\u00e9rer ? Quels inconv\u00e9nients, quels obstacles va-t-on rencontrer ? Il est frappant de voir que ces questions sont la plupart du temps ignor\u00e9es lors d&rsquo;un choix d&rsquo;outil. On pr\u00e9f\u00e8re mesurer la facilit\u00e9 ou la [&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-901","post","type-post","status-publish","format-standard","hentry","category-qualite-des-applications"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/901"}],"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=901"}],"version-history":[{"count":21,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/901\/revisions"}],"predecessor-version":[{"id":904,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/901\/revisions\/904"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=901"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}