{"id":1512,"date":"2014-11-21T14:55:00","date_gmt":"2014-11-21T13:55:00","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1512"},"modified":"2014-11-22T14:03:29","modified_gmt":"2014-11-22T13:03:29","slug":"aplicacion-legacy-reingenieria-con-sonarqube-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-reingenieria-con-sonarqube-2\/","title":{"rendered":"Aplicaci\u00f3n Legacy \u2013 Reingenier\u00eda con SonarQube (II)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-2241\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_ReengineeringWithSQ21.jpg\" alt=\"Application Legacy \u2013 Reengineering avec SonarQube\" width=\"359\" height=\"256\" \/><\/a>Hemos visto en el post anterior c\u00f3mo iniciar <a title=\"Aplicaci\u00f3n Legacy \u2013 Reingenier\u00eda con SonarQube\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-reingenieria-con-sonarqube\/\" target=\"_blank\">una reingenier\u00eda con SonarQube<\/a> empezando con una redistribuci\u00f3n funcional y un nuevo dise\u00f1o de nuestra aplicaci\u00f3n.<\/p>\n<p>Ahora podemos ir un poco m\u00e1s profundo en el c\u00f3digo para identificar a los flujos de tratamientos candidatos para la reestructuraci\u00f3n. <!--more--><\/p>\n<h2>Reestructuraci\u00f3n de los tratamientos<\/h2>\n<p>Otra vez voy a utilizar <a title=\"Aplicaci\u00f3n Legacy \u2013 Refactoring con el plugin SQALE (II)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactoring-plugin-sqale-2\/\" target=\"_blank\">el SQALE Sunburst<\/a> para navegar entre las diferentes violaci\u00f3nes de las mejores pr\u00e1cticas de programaci\u00f3n para buscar cualquier indicio de &#8216;c\u00f3digo espagueti&#8217;.<\/p>\n<p style=\"text-align: center\"><em><strong>Figure 1 \u2013 Refactoring de \u2018goto\u2019<\/strong><\/em><\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2245\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidGoto.jpg\" alt=\"Plugin SQALE - Refactoring de goto\" width=\"419\" height=\"440\" \/><\/a><\/p>\n<p>Este widget me permite cuantificar el esfuerzo de refactorizaci\u00f3n \u2013 158,8 d\u00edas \u2013 para corregir estos defectos de flujos de tratamientos y los saltos de algoritmos por todos caminos y direcciones.<br \/>\nYo puedo hacer lo mismo para cada uno de los fallos de este tipo, por ejemplo, el uso de &#8216;continue&#8217;. A continuaci\u00f3n, un clic en esta &#8216;Issue&#8217; en el SQALE Sunburst me lleva a la lista de programas con estas violaci\u00f3nes, en la figura siguiente:<\/p>\n<p style=\"text-align: center\"><em><strong>Figura 2 &#8211; Lista de violaci\u00f3nes &#8216;continue&#8217;\u00a0<\/strong><\/em><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2246\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_AvoidContinue.jpg\" alt=\"SonarQube - Avoid continue\" width=\"564\" height=\"295\" \/><\/a><\/p>\n<p>A partir de ah\u00ed, puedo hacer un drill-down con cada programa y comprobar el c\u00f3digo de cada l\u00ednea que tiene una de estas violaci\u00f3nes. En la siguiente figura, podemos ver una l\u00ednea de c\u00f3digo con un &#8216;continue&#8217; y el &#8216;break&#8217; que lo acompa\u00f1a, y la estimaci\u00f3n \u2013 30 minutos \u2013 de deuda t\u00e9cnica para resolver este c\u00f3digo espagueti.<\/p>\n<p style=\"text-align: center\"><em><strong>Figura 3 &#8211; L\u00ednea de c\u00f3digo con violaci\u00f3n y evaluaci\u00f3n de la carga de la resoluci\u00f3n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2248\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/11\/LegacyApp_RemoveContinue.jpg\" alt=\"LegacyApp_RemoveContinue\" width=\"652\" height=\"254\" \/><\/a><br \/>\nPodemos ver en este ejemplo c\u00f3mo utilizar SonarQube para ir directamente al grano:<\/p>\n<ul>\n<li>Una estimaci\u00f3n global de la refactorizaci\u00f3n de los flujos de tratamientos a trav\u00e9s del plugin SQALE.<\/li>\n<li>Una estimaci\u00f3n m\u00e1s detallada, por lo menos para l<a title=\"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (II)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/\" target=\"_blank\">os componentes m\u00e1s importantes y m\u00e1s complejos<\/a> que pesar\u00e1n m\u00e1s en la carga global de reingenier\u00eda.<\/li>\n<\/ul>\n<p>El equipo de proyecto puede hacer un drill-down en cada programa, como lo hicimos en este ejemplo, para evaluar el nivel de la destructuraci\u00f3n del c\u00f3digo y reescribirlo de acuerdo con la l\u00f3gica funcional, pero modificando la l\u00f3gica algor\u00edtmica. La soluci\u00f3n a los &#8216;goto&#8217;, &#8216;break&#8217; y &#8216;continue&#8217; es simple: el uso de &#8216;if..else&#8217;. Sin embargo, cuidado de no demasiado imbricar &#8216;if..else&#8217; dentro de otros &#8216;if..else&#8217; en demasiados niveles.<\/p>\n<p>Cada idioma tiene sus propias\u00a0caracter\u00edsticas en t\u00e9rminos de procesamiento de flujo, y las malas pr\u00e1cticas en esta \u00e1rea ser\u00e1n diferentes en C, en Cobol, o en ABAP. Lo importante es tomar en cuenta este punto, y vimos c\u00f3mo SonarQube nos podr\u00eda ayudar.<\/p>\n<h2>Reestructuraci\u00f3n de los datos<\/h2>\n<p>Una reingenier\u00eda de tratamientos suele ir usualmente con una reingenier\u00eda de los datos. Todo un tema en s\u00ed mismo, se podr\u00eda escribir un libro entero sobre esto. R\u00e1pidamente, unas pocas ideas de investigaci\u00f3n que vienen a la mente:<\/p>\n<ul>\n<li>Comprobar si la aplicaci\u00f3n utiliza archivos, y si ser\u00eda posible convertirlos en tablas. Si la informaci\u00f3n es temporal, como un log de mensajes, tendemos a guardarla en un fichero aunque tampoco ser\u00eda una mala idea hacerlo en una base de datos porque un &#8216;Insert&#8217; es m\u00e1s rapido que escribir una l\u00ednea en un archivo, y en los dos casos, temprano o tarde, tendremos que vaciar el fichero o la tabla.<\/li>\n<li>Identificar las caracter\u00edsticas del tipo de datos, el tama\u00f1o o la precisi\u00f3n y notar lo que parece extra\u00f1o o inusual. Validar con los usuarios y aprovechar la oportunidad para preguntarles si tienen alguna petici\u00f3n al respecto.<\/li>\n<li>Comprobar si existen estructuras de datos compartidas, y cuales componentes utilizan las mismas tablas. Los accesos m\u00faltiples en una tabla son una fuente importante de errores y de costes de mantenimiento. He visto aplicaciones en las que se acced\u00eda a una tabla en Insert\/Update\/Delete por m\u00e1s de 80 clases diferentes. Cada vez que un desarrollador necesitaba un tratamiento en esta tabla, programaba sus propias consultas SQL sin verificar antes que ya exist\u00eda este mismo tratamiento. Resultado: un cambio de la estructura de la tabla obligaba a verificar y posiblemente modificar estas clases. \u00a1Puedes imaginar la inversi\u00f3n necesaria para esta tarea y el nivel de riesgo si se olvida uno de estos m\u00e9todos!<\/li>\n<li>Y mientras tanto, comprobar que no haya datos redundantes.<\/li>\n<li>Lo mismo para las inconsistencias de datos: una pantalla con una medida en km y otra en metros, o en euros y en K\u20ac, o en d\u00edas y otra en horas, o en horas y en minutos, etc.<\/li>\n<li>A ver si tenemos defectos\u00a0en el c\u00f3digo SQL. \u00bfPor qu\u00e9 esos &#8216;select *&#8217;, &#8216;select &#8230; en select&#8217; o JOIN en m\u00faltiples tablas, o anidados, etc. Hemos vimos muchos de ellos en nuestra serie sobre el <a title=\"An\u00e1lisis PL\/SQL con SonarQube \u2013 Evaluar la calidad (2\/3)\" href=\"http:\/\/qualilogy.com\/es\/analisis-plsql-con-sonarqube-evaluar-la-calidad-2\/\" target=\"_blank\">an\u00e1lisis de c\u00f3digo PL\/SQL con SonarQube<\/a>.<\/li>\n<\/ul>\n<p>Si encontramos tablas temporales construidas din\u00e1micamente durante una sesi\u00f3n, esto usualmente significa procesos muy complejos que no es posible realizar mediante &#8216;simples&#8217; bucles o con cursores, como un c\u00e1lculo de agregaci\u00f3n estad\u00edstica. En tal caso, los usuarios tienen que certificarme de la criticidad de estos tratamientos. Porque no podemos tener una misma aplicaci\u00f3n con el requerimiento de visualizar en la pantalla todos los datos de cualquier cliente en menos de un segundo y, al mismo tiempo, poder correlacionar din\u00e1micamente todos los datos en todo tipo de estad\u00edsticas. Estas son dos aplicaciones diferentes, una de gesti\u00f3n y la otra de Infocenter.<\/p>\n<h2>Otros puntos<\/h2>\n<p>Comprobar el nivel de comentarios en la aplicaci\u00f3n original y tratar de mantener o mejorar este nivel de documentaci\u00f3n.<\/p>\n<p>Normas de denominaci\u00f3n: si no existen, es hora de decidirlas para los futuros desarrollos con este nuevo lenguaje. Si existen, aseg\u00farate de actualizarlas, pero en base a las normas actualmente en uso, lo que tambi\u00e9n significa verificar esas opciones con los otros equipos de proyecto, y asegurarse de que todo el mundo utiliza los mismos est\u00e1ndares.<\/p>\n<p>Utilizar una herramienta de an\u00e1lisis de c\u00f3digo para comprobar\u00a0regularmente que no se introducen violaciones de buenas pr\u00e1cticas en el nuevo lenguaje, que no son necesariamente las del lenguaje anterior. Ok, hay numerosos defectos en C que existen en C++, pero lo contrario no es cierto.<\/p>\n<p>Por encima de todo, tener en cuenta las pruebas unitarias. Ya hab\u00edamos hecho una <a title=\"Aplicaci\u00f3n Legacy \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (VII)\" href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-refactorizacion-reingenieria-7\/\" target=\"_blank\">estimaci\u00f3n del esfuerzo y de los planes de acci\u00f3n en este tema<\/a>.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>No hemos listado todas las posibles tareas de reingenier\u00eda que incorporar en el proyecto, se puede imaginar muchas otras. De hecho, esto va a ser muy dependiente del proyecto, la aplicaci\u00f3n, la tecnolog\u00eda, etc. No hay un \u00fanico camino que siempre garantiza el \u00e9xito del proyecto, pero hay una buena probabilidad de que los puntos enumerados en este post te ayudan a mejorar las posibilidades de exito de tu reingenier\u00eda.<\/p>\n<p>Un \u00faltimo consejo, pensar en el futuro: la <a title=\"Elasticidad del c\u00f3digo (2\/2)\" href=\"http:\/\/qualilogy.com\/es\/elasticidad-del-codigo-22\/\" target=\"_blank\">portabilidad de aplicaciones en el Cloud<\/a>, es decir, la disociaci\u00f3n de ciertos tipos de tratamiento, las API Restfull, la estrategia de stateless\/stateful, etc.<br \/>\nAdem\u00e1s, creo que vamos a ver m\u00e1s y m\u00e1s reingenier\u00edas de\u00a0aplicaciones con el fin de subirlas en la nube.<\/p>\n<p>Este articulo pone fin a esta larga serie sobre la refactorizaci\u00f3n y la reingenier\u00eda de una aplicaci\u00f3n Legacy. Para los pr\u00f3ximos posts, creo que voy a actualizar mi instalaci\u00f3n SonarQube y ver lo que ha cambiado con c\u00f3digo Cobol y SAP.<\/p>\n<p>Hasta pronto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hemos visto en el post anterior c\u00f3mo iniciar una reingenier\u00eda con SonarQube empezando con una redistribuci\u00f3n funcional y un nuevo dise\u00f1o de nuestra aplicaci\u00f3n. Ahora podemos ir un poco m\u00e1s profundo en el c\u00f3digo para identificar a los flujos de tratamientos candidatos para la reestructuraci\u00f3n.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1512","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1512"}],"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=1512"}],"version-history":[{"count":23,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1512\/revisions"}],"predecessor-version":[{"id":1514,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1512\/revisions\/1514"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1512"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1512"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}