{"id":1202,"date":"2014-05-27T09:12:19","date_gmt":"2014-05-27T08:12:19","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1202"},"modified":"2014-05-29T10:46:20","modified_gmt":"2014-05-29T09:46:20","slug":"aplicacion-legacy-c-refactorizacion-reingenieria-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/","title":{"rendered":"Aplicaci\u00f3n Legacy C &#8211; \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (II)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft  wp-image-1865\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/WordCLegacy_UseCases2.jpg\" alt=\"WordCLegacy_UseCases2\" width=\"376\" height=\"250\" \/><\/a>Continuamos esta serie sobre los diferentes casos de uso que puedan surgir en relaci\u00f3n con la transferencia de una aplicaci\u00f3n Lecagy en C, desde el an\u00e1lisis del c\u00f3digo fuente de Word 1.1a, la primera versi\u00f3n de este software de Microsoft publicado en 1990.<br \/>\n<!--more--><\/p>\n<p>Los dos primeros articulos se dedicaron a las <a href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">m\u00e9tricas cuantitativas<\/a> de tama\u00f1o (LOCs), de complejidad (CC), el nivel de comentarios y de duplicaci\u00f3n, as\u00ed como los diferentes tipos de <a href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-2\/\" target=\"_blank\">&#8216;Issues\u2019 Blocker, Critical, Major y Minor<\/a>.<\/p>\n<p>Con el fin de poder medir el coste de diferentes\u00a0estrategias, incluyendo <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">refactorizaci\u00f3n y reingenieria<\/a>, hemos empezado a trabajar en la Complejidad Ciclom\u00e1tica (CC ) de las funciones y su distribuci\u00f3n. Ahora vamos a realizar el mismo trabajo con los programas para identificar cu\u00e1les son los m\u00e1s complejos y \/ o que incorporan tambi\u00e9n funciones complejas.<\/p>\n<h2>Complejidad<\/h2>\n<h3>Programas<\/h3>\n<p>La siguiente tabla presenta la distribuci\u00f3n de la complejidad entre los archivos:<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 4 \u2013 Complejidad Ciclom\u00e1tica de los programas de la aplicaci\u00f3n Word Opus<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Files_Distrib.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1870\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Files_Distrib.jpg\" alt=\"Word_Files_Distrib\" width=\"247\" height=\"221\" \/><\/a>171 ficheros no tienen Complejidad Ciclom\u00e1tica (CC). Encontr\u00e9 130 archivos .h en la aplicaci\u00f3n, la mayor\u00eda de ellos con definici\u00f3n de estructuras de datos y constantes, sin ning\u00fan algoritmo que corresponde a una regla funcional o t\u00e9cnica. Por otro lado, 156 archivos tienen una CC por encima de 90 puntos, por lo que esta aplicaci\u00f3n es extremadamente polarizada entre archivos con un bajo nivel o incluso cero complejidad y archivos con alta complejidad. O muy elevada, ya que de nuevo, una regla de tipo &#8216;Major&#8217; me permite identificar 159 archivos con m\u00e1s de 80 puntos de CC.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Files.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1885\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Avoid_Cplx_Files.jpg\" alt=\"Word_Avoid_Cplx_Files\" width=\"461\" height=\"36\" \/><\/a>Al igual que con la funciones, he calculado la distribuci\u00f3n de los archivos m\u00e1s complejos.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 5 \u2013 Distribuci\u00f3n de los ficheros m\u00e1s complejos<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Files_Distrib2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1872\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Files_Distrib2.jpg\" alt=\"Word_Files_Distrib2\" width=\"513\" height=\"142\" \/><\/a>159 programs, o el 45,6% de los 349 archivos que cuenta esta aplicaci\u00f2n, tienen m\u00e1s de 80 puntos de CC, para un total entre ellos de 43 058 puntos de CC, el 98,2 % del total de la Complejidad Ciclom\u00e1tica (43 846). \u00a1Cuando os digo que esta aplicaci\u00f3n est\u00e1 muy polarizada en t\u00e9rminos de complejidad de los programas!<\/p>\n<p>Podemos notar 24 archivos con m\u00e1s de 400 puntos de CC, por lo que de nuevo \u2013 al igual que las funciones \u2013 un n\u00famero limitado de objetos (15%) constituye una parte importante (30%) de la complejidad general. Si sumamos los 27 archivos con m\u00e1s de 300 puntos de CC, tenemos 51 programas (14,6% de todos los 349 ficheros de la aplicaci\u00f3n) por encima de 300 CC y una complejidad total de (12 860 + 9 472) igual a 22 332, o sea 51% de toda la Complejidad Ciclom\u00e1tica para toda la aplicaci\u00f3n (43 846).<\/p>\n<p>Tambi\u00e9n comprob\u00e9 c\u00f3mo se reparten las funciones m\u00e1s complejas en estos programas:<\/p>\n<ul>\n<li>3 archivos de m\u00e1s de 400 CC tienen al menos una funci\u00f3n de m\u00e1s de 200 CC y una funci\u00f3n de m\u00e1s de 100 CC (en rojo en la figura siguiente).<\/li>\n<li>1 archivo de m\u00e1s de 400 CC y 2 archivos de m\u00e1s de 300 CC con al menos una funci\u00f3n de m\u00e1s de 200 CC (naranja oscuro).<\/li>\n<li>7 archivos con m\u00e1s de 400 CC con al menos una funci\u00f3n de m\u00e1s de 100 CC (naranja claro).<\/li>\n<li>6 archivos con m\u00e1s de 300 CC con al menos una funci\u00f3n de m\u00e1s de 100 CC (amarillo).<\/li>\n<\/ul>\n<p style=\"text-align: center\"><em><strong>Figura 1 \u2013 Convergencia de las funciones y de los programas m\u00e1s complejos<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Fn_Distrib.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1879\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_Fn_Distrib.jpg\" alt=\"Word_Fn_Distrib\" width=\"791\" height=\"656\" \/><\/a> Ahora conocemos las funciones y los programas que tratar con prioridad, en los que debemos enfocar primero nuestros esfuerzos, con una evaluaci\u00f3n de su nivel de complejidad.<\/p>\n<h2>Tama\u00f1o<\/h2>\n<p>Como lo hemos visto en <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">el post anterior<\/a>, el tama\u00f1o es tambi\u00e9n un elemento de evaluaci\u00f3n de los esfuerzos de refactorizaci\u00f3n o de reingenier\u00eda.<\/p>\n<h3>Funciones<\/h3>\n<p>De nuevo tengo una regla que me permite identificar las funciones que superan un umbral de tama\u00f1o m\u00e1s all\u00e1 de 100 l\u00edneas de c\u00f3digo (LOCs).<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_AvoidFnsSize.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1882\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_AvoidFnsSize.jpg\" alt=\"Word_AvoidFnsSize\" width=\"547\" height=\"35\" \/><\/a>De nuevo he calculado la distribuci\u00f3n de funciones con el mayor n\u00famero de LOCs.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 6 \u2013 Distribuci\u00f3n de las funciones por tama\u00f1o<\/strong><\/em><\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_FunctionsSize_Distrib1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1901\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_FunctionsSize_Distrib1.jpg\" alt=\"Word_FunctionsSize_Distrib\" width=\"463\" height=\"138\" \/><\/a>En 478 funciones con m\u00e1s de 100 LOCs:<\/p>\n<ul>\n<li>3 funciones superan las 1 000 l\u00edneas de c\u00f3digo.<\/li>\n<li>21 tienen m\u00e1s de 500 l\u00edneas de c\u00f3digo.<\/li>\n<li>126 est\u00e1n entre 200 et 500 l\u00edneas de c\u00f3digo.<\/li>\n<\/ul>\n<p>Tambi\u00e9n he buscado una convergencia entre el tama\u00f1o (LOC) y la Complejidad Ciclom\u00e1tica, con los siguientes resultados :<\/p>\n<ul>\n<li>La funci\u00f3n m\u00e1s compleja, con 355 puntos de CC, cuenta con 2 063 l\u00edneas de c\u00f3digo (en el archivo &#8216;Opus\\RTFOUT.c&#8217;).<\/li>\n<li>En las 6 m\u00e1s complejas funciones, m\u00e1s all\u00e1 de 200 CC, 3 tienen un tama\u00f1o superior a 1 000 LOCs (incluida la anterior), otras dos exceden las 700 l\u00edneas y la \u00faltima llega a 393 l\u00edneas.<\/li>\n<li>De las 30 funciones identificadas anteriormente con m\u00e1s de 100 CC, 15 tienen un tama\u00f1o entre 500 y 1 000 LOCs, y el resto entre 250 y 500 LOCs.<\/li>\n<\/ul>\n<p>Sin sorpresa, encontramos estas funciones en los archivos marcado en rojo\/naranja en la Figura 1 anterior.<\/p>\n<h3>Programas<\/h3>\n<p>Hemos visto que la complejidad era muy polarizada entre los programas, con 159 de ellos m\u00e1s all\u00e1 de los 80 puntos de CC. Una otra regla nos permite tambi\u00e9n identificar 149 archivos con m\u00e1s de 1 000 l\u00edneas de c\u00f3digo.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_AvoidPgmSize.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1886\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_AvoidPgmSize.jpg\" alt=\"Word_AvoidPgmSize\" width=\"537\" height=\"31\" \/><\/a>Tenemos 9 ficheros m\u00e1s all\u00e1 de 3 000 l\u00edneas, incluyendo 1 con 4 117 LOCs, y 36 archivos entre 2 000 y 3 000 l\u00edneas. He comprobado si estos 9 programas m\u00e1s importantes incluyen funciones tambi\u00e9n grandes, y en qu\u00e9 proporci\u00f3n (n\u00famero y tama\u00f1o de estas funciones).<\/p>\n<p><em><strong>Tabla 7 &#8211; Convergencia de los programas m\u00e1s voluminosos con las funciones de tama\u00f1o alto<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_FilesFns_Size.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1887\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/Word_FilesFns_Size.jpg\" alt=\"Word_FilesFns_Size\" width=\"572\" height=\"290\" \/><\/a>La columna &#8216;Nbr. Functions&#8217; lista el n\u00famero de funciones de m\u00e1s de 100 LOCs en el archivo, y luego las 3 columnas &#8216;Funcion size&#8217; el n\u00famero de funciones m\u00e1s all\u00e1 de 1 000 \/ 500 \/ 200 LOCs. Por ejemplo:<\/p>\n<ul>\n<li>El programa &#8216;Opus\\Wordtech\\select.c&#8217; tiene 7 funciones de m\u00e1s de 100 l\u00edneas, 1 de ellas con m\u00e1s de 500 l\u00edneas y 5 con m\u00e1s de 200 l\u00edneas.<\/li>\n<li>El programa &#8216;Opus\\interp\\elcore.c&#8217; tiene 5 funciones de m\u00e1s de 100 l\u00edneas, 1 con m\u00e1s de 1 000 l\u00edneas y 1 de m\u00e1s de 500 l\u00edneas.<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>Podemos ver que el n\u00famero de funciones de grande tama\u00f1o disminuye en proporci\u00f3n con el tama\u00f1o del programa. Encontr\u00e9 dos excepciones:<\/p>\n<ul>\n<li>El archivo &#8216;RTFOUT.c&#8217; con 2 222 LOCs y la funci\u00f3n m\u00e1s compleja, con 355 puntos de CC y 2 063 l\u00edneas de c\u00f3digo.<\/li>\n<li>El archivo &#8216;formula.c&#8217; con 2 179 LOCs y una funci\u00f3n de m\u00e1s de 1000 l\u00edneas de c\u00f3digo.<\/li>\n<\/ul>\n<p>Tambi\u00e9n, en los 36 archivos entre 2 000 y 3 000 LOCs:<\/p>\n<ul>\n<li>8 progamas entre 2 000 y 3 000 LOCs tienen 10 funciones con m\u00e1s de 500 LOCs, incluyendo 6 con al menos una funci\u00f3n adicional de m\u00e1s de 200 LOCs.<\/li>\n<li>25 ficheros entre 2 000 y 3 000 LOCs tienen 25 funciones entre 200 y 500 LOCs.<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/PictComplexity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1890\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/05\/PictComplexity.jpg\" alt=\"PictComplexity\" width=\"290\" height=\"126\" \/><\/a><\/li>\n<\/ul>\n<p>Hemos identificado las funciones y los programas que pesan m\u00e1s en el esfuerzo y por lo tanto en los costes de <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">refactorizaci\u00f3n y reingenieria<\/a>, por su complejidad y tama\u00f1o.<\/p>\n<p>En el pr\u00f3ximo post, vamos a comprobar si estos archivos tambi\u00e9n contienen defectos estructurales (bloques anidados, Goto, etc.) que podr\u00edan hacer a\u00fan m\u00e1s dif\u00edcil la comprensi\u00f3n y la evoluci\u00f3n del c\u00f3digo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuamos esta serie sobre los diferentes casos de uso que puedan surgir en relaci\u00f3n con la transferencia de una aplicaci\u00f3n Lecagy en C, desde el an\u00e1lisis del c\u00f3digo fuente de Word 1.1a, la primera versi\u00f3n de este software de Microsoft publicado en 1990.<\/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-1202","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1202"}],"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=1202"}],"version-history":[{"count":24,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1202\/revisions"}],"predecessor-version":[{"id":1228,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1202\/revisions\/1228"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1202"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}