{"id":339,"date":"2013-02-04T10:19:12","date_gmt":"2013-02-04T09:19:12","guid":{"rendered":"http:\/\/qualilogy.com\/fr\/?p=339"},"modified":"2013-02-04T17:04:22","modified_gmt":"2013-02-04T16:04:22","slug":"bonnes-pratiques-de-programmation-abap-les-defauts-majeurs","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/fr\/bonnes-pratiques-de-programmation-abap-les-defauts-majeurs\/","title":{"rendered":"Bonnes pratiques de programmation ABAP &#8211; Les d\u00e9fauts majeurs"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-342\" alt=\"Bonnes pratiques de programmation ABAP - Les d\u00e9fauts majeurs\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/QualSonarAbapRules.jpg\" width=\"350\" height=\"174\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/QualSonarAbapRules.jpg 350w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/QualSonarAbapRules-300x149.jpg 300w\" sizes=\"(max-width: 350px) 100vw, 350px\" \/><\/a>Nous avons vu pr\u00e9c\u00e9demment <a title=\"Bonnes pratiques de programmation ABAP \u2013 Les d\u00e9fauts 'Blockers'\" href=\"http:\/\/qualilogy.com\/fr\/bonnes-pratiques-de-programmation-abap-les-blockers\/\" target=\"_blank\">les d\u00e9fauts bloquants ou \u2018Blockers\u2019<\/a>, ainsi nomm\u00e9s car aucune violation de ce type ne peut se tol\u00e9rer, et <a title=\"Bonnes pratiques de programmation ABAP \u2013 Les d\u00e9fauts critiques\" href=\"http:\/\/qualilogy.com\/fr\/bonnes-pratiques-de-programmation-abap-les-defauts-critiques\/\" target=\"_blank\">les d\u00e9fauts critiques ou \u2018Critical\u2019<\/a>, suffisamment graves pour n\u00e9cessiter une correction imm\u00e9diate, mais pour lesquels une exception peut \u2013 et doit absolument \u2013 se justifier.<\/p>\n<p>Dans notre Quality Profile SONAR, les \u2018Blockers\u2019 portent sur tout ce qui peut interrompre une transaction ou un programme et les \u2018Critical\u2019\u00a0 sur des pratiques de programmation qui pr\u00e9sentent un risque pour la performance.<\/p>\n<p>Nous allons terminer cette s\u00e9rie sur les bonnes pratiques de programmation ABAP avec les r\u00e8gles restantes, qui vont concerner principalement la maintenabilit\u00e9 du code. <!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-331\" alt=\"Mon application ABAP\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_LOC.jpg\" width=\"286\" height=\"114\" \/><\/p>\n<p>Notre application ABAP n\u2019est pas de taille tr\u00e8s importante : un peu moins de 700 fichiers pour environ 26 000 lignes, soit en moyenne 40 lignes de code par programme.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-348\" alt=\"SONAR ABAP Taux de commentaires et de copier-coll\u00e9\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_Comments.jpg\" width=\"285\" height=\"134\" \/>Le taux de commentaires est correct, au-dessus de 22%. Nous pouvons constater \u00e9galement un pourcentage important de code dupliqu\u00e9.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_Violations.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-347\" alt=\"SONAR ABAP - Liste des violations\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_Violations.jpg\" width=\"204\" height=\"142\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Mais il s\u2019agit l\u00e0 d\u2019une moyenne qui peut donc refl\u00e9ter une variance et donc des r\u00e9alit\u00e9s tr\u00e8s diff\u00e9rentes. Pour v\u00e9rifier cela, allons voir ce que nous avons dans les d\u00e9fauts \u2018Major\u2019.<\/p>\n<h2>Niveau de commentaires<\/h2>\n<p>Les principales violations de ce type concernent des m\u00e9thodes, classes, forms, functions, etc. sans aucun commentaires, ainsi qu\u2019un certain nombre d\u2019objets avec un niveau de commentaires insuffisant.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-346\" alt=\"SONAR ABAP - Commentaires dans les objets\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules.jpg\" width=\"2208\" height=\"1320\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules.jpg 2208w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules-300x179.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules-1024x612.jpg 1024w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CommentsRules-624x373.jpg 624w\" sizes=\"(max-width: 2208px) 100vw, 2208px\" \/><\/a><\/p>\n<p>A noter qu\u2019il existe un ABAP orient\u00e9 Objet, avec des classes et des m\u00e9thodes. Ce type de code n\u2019est pas vraiment tr\u00e8s r\u00e9pandu, mais l\u2019on peut voir que SONAR sait analyser celui-ci.<br \/>\nSONAR liste \u00e9galement :<\/p>\n<ul>\n<li>Les fichiers avec une densit\u00e9 de commentaires inf\u00e9rieure \u00e0 20%.<\/li>\n<li>Les objets (d\u00e9finis dans ces fichiers) tels que les includes ou les programmes avec une densit\u00e9 de commentaires inf\u00e9rieure \u00e0 15%.<\/li>\n<\/ul>\n<p>Un code est maintenable s\u2019il est compr\u00e9hensible. Plus un programme est long et compliqu\u00e9, plus l\u2019effort sera important pour introduire un changement dans celui-ci, et plus le risque sera \u00e9lev\u00e9 de cr\u00e9er un d\u00e9faut par la m\u00eame occasion. La pr\u00e9sence de commentaires dans le code doit permettre au d\u00e9veloppeur de comprendre plus facilement la logique du programme, les \u00e9volutions ant\u00e9rieures et minimise donc les co\u00fbts de maintenance et les risques pour la stabilit\u00e9 de l\u2019application.<\/p>\n<h2>Code dupliqu\u00e9<\/h2>\n<p>Nous avons \u00e9galement 58 programmes, soit un peu plus de 8% du total de ceux-ci avec du code dupliqu\u00e9.<\/p>\n<p>Le code dupliqu\u00e9 est tout simplement du code \u2018Copier-Coll\u00e9\u2019. Un d\u00e9veloppeur doit impl\u00e9menter une fonctionnalit\u00e9, un traitement d\u00e9j\u00e0 cod\u00e9 par ailleurs (g\u00e9n\u00e9ralement par lui-m\u00eame), donc quoi de plus simple que de reproduire celui-ci autant de fois que n\u00e9cessaire.<\/p>\n<p>Cette \u2018bad practice\u2019 est certainement plus dangereuse qu\u2019un niveau de commentaires insuffisant, car toute modification d\u2019un de ces blocs de code devra \u00eatre report\u00e9 sur l\u2019ensemble de ses copies, sauf \u00e0 ce que l\u2019un d\u2019entre eux cesse de fonctionner correctement. Cela multiplie donc d\u2019autant le nombre de modifications \u00e0 faire, sachant bien s\u00fbr qu\u2019il est impossible de se rappeler de toutes ses duplications. L\u2019effort de maintenance est consid\u00e9rablement accru, et surtout, le risque d\u2019introduire un d\u00e9faut devient tr\u00e8s \u00e9lev\u00e9.<\/p>\n<p>Il est recommand\u00e9 de corriger ces violations le plus t\u00f4t possible, en localisant celui-ci \u2013 avec SONAR par exemple \u2013 et en rempla\u00e7ant les blocs dupliqu\u00e9s par des fonctions r\u00e9utilisables.<\/p>\n<h2>Structure du code<\/h2>\n<p>Un code incorrectement structur\u00e9 est difficile \u00e0 lire.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CASEwithTooManyLOC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-353\" alt=\"SONAR ABAP - CASE\/WHEN with too many lines of code\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CASEwithTooManyLOC.jpg\" width=\"540\" height=\"57\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CASEwithTooManyLOC.jpg 540w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_CASEwithTooManyLOC-300x31.jpg 300w\" sizes=\"(max-width: 540px) 100vw, 540px\" \/><\/a><\/p>\n<p>Ici, nous avons des traitements de type CASE (pour plus de pr\u00e9cision concernant cette instruction, voir le post sur <a title=\"Bonnes pratiques de programmation ABAP \u2013 Les d\u00e9fauts critiques\" href=\"http:\/\/qualilogy.com\/fr\/bonnes-pratiques-de-programmation-abap-les-defauts-critiques\/\" target=\"_blank\">les d\u00e9fauts critiques ou \u2018Critical\u2019<\/a>) dont un ou plusieurs branchements (WHEN) comportent plusieurs lignes de code, ce qui veut dire que le d\u00e9veloppeur a programm\u00e9 un traitement logique au sein d\u2019une structure conditionnelle. Si ce traitement comporte plusieurs lignes (plus de 4 par d\u00e9faut pour cette r\u00e8gle), il est recommand\u00e9 d\u2019encapsuler celui-ci dans une fonction qui sera appel\u00e9e par le WHEN.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidDeeplyNestedIF_DO.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-354\" alt=\"SONAR ABAP Avoid deeply nested IF\/DO\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidDeeplyNestedIF_DO.jpg\" width=\"501\" height=\"46\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidDeeplyNestedIF_DO.jpg 501w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidDeeplyNestedIF_DO-300x27.jpg 300w\" sizes=\"(max-width: 501px) 100vw, 501px\" \/><\/a><\/p>\n<p>SONAR identifie les traitements conditionnels imbriqu\u00e9s, tels que les IF sur 3 niveaux ou plus. Introduire un changement dans une telle structure demande un effort important pour en comprendre la logique, donc plus de charges de maintenance et encore une fois un risque d\u2019erreur plus \u00e9lev\u00e9.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-355\" alt=\"SONAR ABAP Avoid too complex logical expression\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression.jpg\" width=\"491\" height=\"43\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression.jpg 491w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression-300x26.jpg 300w\" sizes=\"(max-width: 491px) 100vw, 491px\" \/><\/a><\/p>\n<p>Idem pour les expressions conditionnelles trop complexes, avec plus de 4 AND ou OR. Ci-dessous, l\u2019exemple de code incorrect fourni par SONAR pour illustrer cette r\u00e8gle.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression_Exemple.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-356\" alt=\"SONAR ABAP Avoid too complex logical expression - Exemple\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression_Exemple.jpg\" width=\"745\" height=\"83\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression_Exemple.jpg 745w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression_Exemple-300x33.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidTooComplexLogicalExpression_Exemple-624x69.jpg 624w\" sizes=\"(max-width: 745px) 100vw, 745px\" \/><\/a><\/p>\n<h2>Taille et complexit\u00e9<\/h2>\n<p>D\u2019autres d\u00e9fauts majeurs que l\u2019on peut rencontrer dans une application ABAP, quoiqu\u2019en nombre restreint dans celle que nous avons analys\u00e9e : des programmes de taille importante ou comportant trop d\u2019objets.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidToomany.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-357\" alt=\"SONAR ABAP Avoid too many objects\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidToomany.jpg\" width=\"658\" height=\"83\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidToomany.jpg 658w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidToomany-300x37.jpg 300w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidToomany-624x78.jpg 624w\" sizes=\"(max-width: 658px) 100vw, 658px\" \/><\/a><\/p>\n<p>La complexit\u00e9 pr\u00e9sente \u00e9galement un risque pour la maintenabilit\u00e9 d\u2019une application,<br \/>\n<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidComplexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-358\" alt=\"SONAR ABAP - Avoid complexity\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidComplexity.jpg\" width=\"599\" height=\"107\" srcset=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidComplexity.jpg 599w, http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/02\/SONAR_ABAP_AvoidComplexity-300x53.jpg 300w\" sizes=\"(max-width: 599px) 100vw, 599px\" \/><\/a><\/p>\n<p>En fait, on ne trouve quasiment aucun objet avec un niveau de complexit\u00e9 important dans cette application.<\/p>\n<h2>Conclusion<\/h2>\n<p>Rappelez-vous qu&rsquo;il ne s&rsquo;agit l\u00e0 que de quelques r\u00e8gles de type &lsquo;Major&rsquo; pour lesquelles nous avons rencontr\u00e9 des violations dans le code analys\u00e9. Il en existe bien d&rsquo;autres, que vous pouvez d\u00e9couvrir dans le Quality Profile ABAP de Sonar. Nous aurons problablement l&rsquo;occasion de les examiner dans le futur, \u00e0 l&rsquo;occasion d&rsquo;autres articles sur le monde ABAP.<\/p>\n<p>Les \u00e9quipes de projet, les responsables d&rsquo;applications SAP ou les stakeholders pensent souvent que SONAR, parce qu&rsquo;il est un outil Open Source, ne sait travailler qu&rsquo;avec les nouvelles technologies ou J2EE uniquement. En fait, nous avons pu voir \u00e0 travers cette s\u00e9rie de posts qu&rsquo;il est simple et rapide d&rsquo;analyser du code ABAP avec SONAR, et mettre en place des processus \u2013 une Quality Gate par exemple\u00a0\u2013 qui permettent de d\u00e9celer les risques pour la robustesse et la performance, tout en contr\u00f4lant les co\u00fbts de maintenance.<\/p>\n<p><!--[if !mso]&gt;--><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous avons vu pr\u00e9c\u00e9demment les d\u00e9fauts bloquants ou \u2018Blockers\u2019, ainsi nomm\u00e9s car aucune violation de ce type ne peut se tol\u00e9rer, et les d\u00e9fauts critiques ou \u2018Critical\u2019, suffisamment graves pour n\u00e9cessiter une correction imm\u00e9diate, mais pour lesquels une exception peut \u2013 et doit absolument \u2013 se justifier. Dans notre Quality Profile SONAR, les \u2018Blockers\u2019 portent [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-339","post","type-post","status-publish","format-standard","hentry","category-sonar-abap"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/339"}],"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=339"}],"version-history":[{"count":13,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/339\/revisions"}],"predecessor-version":[{"id":341,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/posts\/339\/revisions\/341"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/media?parent=339"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/categories?post=339"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/fr\/wp-json\/wp\/v2\/tags?post=339"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}