{"id":1031,"date":"2014-02-23T17:06:01","date_gmt":"2014-02-23T16:06:01","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1031"},"modified":"2014-02-23T18:39:43","modified_gmt":"2014-02-23T17:39:43","slug":"analisis-plsql-con-sonarqube-evaluar-la-calidad-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-evaluar-la-calidad-2\/","title":{"rendered":"An\u00e1lisis PL\/SQL con SonarQube \u2013 Evaluar la calidad (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\" \/><\/a>Lo siento por el tiempo pasado desde el \u00faltimo post de esta serie sobre PL\/SQL y SonarQube, pero estaba muy ocupado entre viajes, el trabajo y mi laptop que decidi\u00f3 abandonarme, por supuesto invocando la ley de Murphy para justificar fallar en el peor momento.<\/p>\n<p>En los posts anteriores: despu\u00e9s de configurar un <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-sonarqube-configuracion\/\" target=\"_blank\">an\u00e1lisis de c\u00f3digo PL\/SQL con SonarQube<\/a>, hemos elaboraro <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-el-quality-profile-plsql\/\" target=\"_blank\">nuestro propio Quality Profile<\/a> con una orientaci\u00f3n a la robustez, el rendimiento y la seguridad en las reglas <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-blockers\/\" target=\"_blank\">Blockers<\/a> y <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-criticals\/\" target=\"_blank\">Criticals<\/a>.<\/p>\n<p>\u00bfA que parece ahora nuestro dashboard SonarQube? <!--more--><\/p>\n<p>Hemos examinado en el post anterior <a href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-evaluar-la-calidad-1\/\" target=\"_blank\">las m\u00e9tricas de tama\u00f1o<\/a> y no dimos cuenta que el n\u00famero medio de l\u00edneas de c\u00f3digo por objeto (procedimiento, funci\u00f3n, trigger, etc. ) no estaba mal.<\/p>\n<p>Con el nuevo widget File Bubble Chart, descubrimos m\u00e1s de 58.000 l\u00edneas de c\u00f3digo en un \u00fanico archivo &#8216;CreatePackageBody.sql&#8217;, con toda la l\u00f3gica de negocio implementada en la base de datos, lo que sin duda resultar\u00e1 en un coste de mantenimiento alto para esta aplicaci\u00f3n.<\/p>\n<h2>Complejidad y duplicaci\u00f3n<\/h2>\n<h3>Complejidad<\/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\" \/><\/a> Si echamos un ojos a la Complejidad Ciclom\u00e1tica (CC), encontramos resultados similares: la complejidad promedio por objeto es relativamente baja con 6.9 puntos de CC, y un m\u00e1ximo de 12 puntos. Pero la complejidad por archivo supera los 600 puntos, y tenemos un total de poco m\u00e1s de 10.000 puntos de CC en toda la aplicaci\u00f3n, lo cual no es muy alto.<br \/>\n<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\" \/><\/a><\/p>\n<p>El esfuerzo de test para esta aplicaci\u00f3n no es muy importante. Recordemos que la Complejidad Ciclom\u00e1tica es una medida de la cantidad de diferentes &#8216;caminos&#8217; en una aplicaci\u00f3n. Lo ideal ser\u00eda hacer pruebas de todos los caminos, por lo que la CC nos da una idea del esfuerzo de pruebas.<\/p>\n<p>Se considera que a partir de 20 000 puntos para una aplicaci\u00f3n, es necesario realizar un control de calidad (QA) espec\u00edfico, definir y realizar casos de test y si es posible, automatizar las pruebas. En nuestro caso, podemos dejar el equipo del proyecto realizar estas pruebas de forma interna.<br \/>\nPero como se puede ver con el siguiente Treemap que he configurado para mostrar la Complejidad Ciclom\u00e1tica &#8230;<\/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\" \/><\/a><\/p>\n<p>Nuestro fichero &#8216;CreatePackageBody.sql&#8217; representa 90% de la complejidad y por lo tanto, de la l\u00f3gica de la aplicaci\u00f3n. As\u00ed que una vez m\u00e1s, tenemos cifras correctas a nivel de aplicaci\u00f3n excepto que la casi toda la aplicaci\u00f3n se encuentra en un solo archivo.<\/p>\n<h3>Duplicaciones<\/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\" \/><\/a>Despu\u00e9s de la complejidad, voy a interesarme en el nivel de duplicaci\u00f3n, bastante alto. Sin sorpresa, el mismo archivo monstruoso que implementa la l\u00f3gica de negocio se encuentra de nuevo en primera fila.<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1667 aligncenter\" alt=\"PLSQL_DuplicHotspot\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/02\/PLSQL_DuplicHotspot.jpg\" width=\"582\" height=\"193\" \/><\/a><\/p>\n<p>Sin embargo, nos encontramos con un gran n\u00famero de Copiado\/Pegado en los otros archivos, especialmente en el fichero &#8216;Create_tables.sql&#8217;. Este script se encarga de crear las tablas de la base de datos, lo que significa\u00a0que se duplican muchas estructuras de datos.<\/p>\n<p>Eso puede indicar que el modelo de datos no est\u00e1 optimizado. Esto sucede por una aplicaci\u00f3n de tipo Legacy, porque es m\u00e1s f\u00e1cil agregar nuevas tablas que hacer evolucionar las existentes. Pero m\u00e1s tablas significa m\u00e1s enlaces, y por consiguiente un rendimiento inferior y m\u00e1s complejidad para mantener estas estructuras de datos.<\/p>\n<p>En el contexto de una auditor\u00eda real de la calidad de esta aplicaci\u00f3n, yo tomar\u00eda el tiempo para investigar este fichero y investigar esta hip\u00f3tesis y encontrar algunos ejemplos que pueden apoyar un refactoring del &#8216;data model&#8217;.<\/p>\n<p>Por ejemplo, hay 687 sentencias &#8216;CREATE TABLE&#8217; en este archivo, y entonces 687 tablas en total (sin contar las &#8216;views&#8217;). 8 963 l\u00edneas duplicadas en este script significa un promedio de 13 l\u00edneas, pues 13 campos similares en cada tabla. Tiene sentido tener algunos campos &#8216;claves&#8217; para llevar a cabo los &#8216;join&#8217;, pero tal vez no tantos.<\/p>\n<h2>Componentes con riesgo<\/h2>\n<p>Despu\u00e9s de ver los indicadores cuantitativos, ya tenemos una gran cantidad de informaci\u00f3n con respecto a esta aplicaci\u00f3n, sin duda m\u00e1s que por lo general conocen los responsables del proyecto, por no hablar de los stakeholders y los responsables de TI.<\/p>\n<p>La segunda parte de una evaluaci\u00f3n de la calidad consiste en identificar las principales amenazas, y esto requiere buscar los componentes de mayor riesgo. Hemos visto en los art\u00edculos anteriores:<\/p>\n<ul>\n<li>16 bloqueadores en la regla \u2018Use IS NULL and IS NOT NULL instead of direct NULL comparisons\u2019, y adem\u00e1s duplicados varias veces: es probable que alguien en el equipo necesita refescarse la memoria acerca de esta regla.<\/li>\n<li>2 &#8216;Calling COMMIT or ROLLBACK from within a trigger will lead to an ORA-04092 exception&#8217;. Y 1 &#8216;Do not declare a variable more than once in a given scope (PLS-00371)\u2019: errores por falta de atenci\u00f3n probablemente, la perfecci\u00f3n no es de este mundo. En todos los casos, a corregir urgentamente por el riesgo que estos defectos representan para los usuarios.<\/li>\n<\/ul>\n<p>He promocionado unas reglas r\u00e8gles Major a la categoria Critical, y entonces ahora tenemos:<\/p>\n<ul>\n<li>320 \u2018Sensitive SYS owned functions should not be used\u2019, incluyendo 270 en nuestro fiechero \u2018CreatePackageBody.sql\u2019: esto es el problema con el Copy \/ Paste, se duplican defectos cr\u00edticos para la seguridad de las aplicaciones.<\/li>\n<li>Una serie de nuevos defectos para las reglas principales que hemos puesto en esta categor\u00eda 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\" \/><\/a><\/p>\n<p>La mayor\u00eda de estas reglas impactan el rendimiento o la fiabilidad de la aplicaci\u00f3n, y por lo tanto representan un riesgo para el usuario final.<\/p>\n<p>Entonces se recomienda corregir estos componentes riesgosos, sobre todo si la satisfacci\u00f3n de los usuarios es un objetivo importante para nuestro departamento de TI. Pero \u00bfa qu\u00e9 precio?<\/p>\n<p>Esto es lo que veremos en el pr\u00f3ximo post, con el plugin SQALE de la deuda t\u00e9cnica.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lo siento por el tiempo pasado desde el \u00faltimo post de esta serie sobre PL\/SQL y SonarQube, pero estaba muy ocupado entre viajes, el trabajo y mi laptop que decidi\u00f3 abandonarme, por supuesto invocando la ley de Murphy para justificar fallar en el peor momento. En los posts anteriores: despu\u00e9s de configurar un an\u00e1lisis de [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-1031","post","type-post","status-publish","format-standard","hentry","category-sonarqube-plsql"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1031"}],"collection":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/comments?post=1031"}],"version-history":[{"count":19,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1031\/revisions"}],"predecessor-version":[{"id":1033,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1031\/revisions\/1033"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1031"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}