{"id":1230,"date":"2014-06-23T14:31:25","date_gmt":"2014-06-23T13:31:25","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=1230"},"modified":"2014-06-24T10:42:31","modified_gmt":"2014-06-24T09:42:31","slug":"aplicacion-legacy-c-refactorizacion-reingenieria-3","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-3\/","title":{"rendered":"Aplicaci\u00f3n Legacy C \u2013 \u00bfRefactorizaci\u00f3n o reingenier\u00eda? (III)"},"content":{"rendered":"<p><a href=\"http:\/\/500px.com\/Vicken\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-1924\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Refactoring_Reingenierie3.jpg\" alt=\"Word_Refactoring_Reingenierie3\" width=\"341\" height=\"227\" \/><\/a>Tenemos esta aplicaci\u00f3n Legacy C, la primera versi\u00f3n de Word publicada por Microsoft en el a\u00f1o 1990, para la cual se propone cuantificar el coste de diferentes estrategias: refactorizaci\u00f3n o reingenier\u00eda, por el mismo equipo de desarrolladores o por un nuevo equipo y por tanto, con una transferencia de conocimiento. <!--more--><\/p>\n<p>Despu\u00e9s de <a href=\"http:\/\/qualilogy.com\/es\/auditoria-aplicacion-legacy-c-microsoft-word-1-1a-1\/\" target=\"_blank\">analizar el c\u00f3digo<\/a> fuente de esta aplicaci\u00f3n, hemos podido identificar loscomponentes (programas y funciones) <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">m\u00e1s complejos<\/a> (Ciclom\u00e1tica Complejidad) y \/ o con <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/\" target=\"_blank\">un tama\u00f1o grande<\/a>.<\/p>\n<p>Hoy vamos a ver si estos programas tambi\u00e9n tienen violaci\u00f3nes de buenas pr\u00e1cticas de programaci\u00f3n que pueden impactar negativamente a la legibilidad y la comprensi\u00f3n del c\u00f3digo, con las consecuencias que podemos imaginar sobre los costes de nuestros diferentes estrategias.<\/p>\n<h2>Switch case<\/h2>\n<p>Un \u2018switch\u2019 es, como probablemente lo sabes, una instrucci\u00f3n que permite probar diferentes casos (&#8216;cases&#8217;) o m\u00faltiples condiciones. Obviamente, cuanto m\u00e1s largo y complejo el tratamiento de cada caso, m\u00e1s larga ser\u00e1 toda la instrucci\u00f3n \u2013 a veces por encima de una p\u00e1gina \u2013 y m\u00e1s dif\u00edcil de entender.<\/p>\n<p>La siguiente regla identifica el n\u00famero de \u2018switch cases\u2019 con m\u00e1s de 5 l\u00edneas.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1930\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Nbr.jpg\" alt=\"Word_Switch_Nbr\" width=\"543\" height=\"25\" \/><\/a>Me interes\u00e9 de nuevo en la distribuci\u00f3n de esta buena pr\u00e1ctica en relaci\u00f3n con el tama\u00f1o del \u2018switch case\u2019. Debajo de 20 l\u00edneas, pocos minutos son suficientes para entender o corregir este defecto. M\u00e1s all\u00e1 de 100 l\u00edneas, la comprensi\u00f3n del algoritmo y de los diferentes casos se vuelve m\u00e1s dif\u00edcil.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 8 \u2013 Distribuci\u00f3n de los \u2018switch cases\u2019 con arreglo a su tama\u00f1o<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1932\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_Size.jpg\" alt=\"Word_Switch_Size\" width=\"521\" height=\"115\" \/><\/a>19 \u2018switch cases\u2019 tienen m\u00e1s de 100 l\u00edneas. Quer\u00eda cruzarlos con las funciones m\u00e1s complejas. \u00bfTe acuerdas de que en <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-1\/\" target=\"_blank\">el primer post<\/a> de esta serie, hemos identificado 30 funciones con m\u00e1s de 100 CC (Complejidad Ciclom\u00e1tica) y 6 con m\u00e1s de 200 CC. En <a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/\" target=\"_blank\">el segundo post<\/a>, hemos cruzado estas 36 funciones con los programas m\u00e1s complejos, con un c\u00f3digo de color:<\/p>\n<ul>\n<li>NaranJa oscuro para las funciones con m\u00e1s de 200 CC en programas de m\u00e1s de 300 CC: dos de estos archivos aparecen en la siguiente tabla: &#8216;RTFOUT.C&#8217; y &#8216;formula.c.<\/li>\n<li>Naranja claro para el programa &#8216;print.c&#8217; con m\u00e1s de 400 CC y al menos una funci\u00f3n de m\u00e1s de 100 CC.<\/li>\n<li>Amarillo para el programa &#8216;RTFIN.c&#8217; con m\u00e1s de 300 y al menos una funci\u00f3n de m\u00e1s de 100 CC.<\/li>\n<li>Blanco para los programas \u2018wordtech\\tableins.c\u2019 y \u2018rtftrans.c\u2019 con m\u00e1s de 200 CC y al menos una funci\u00f3n de m\u00e1s de 100 CC.<\/li>\n<\/ul>\n<p style=\"text-align: center\"><em><strong>Tabla 9 \u2013 Los \u2018switch cases\u2019 m\u00e1s largos en las funciones m\u00e1s complejas<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1934\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Switch_CC.jpg\" alt=\"Word_Switch_CC\" width=\"614\" height=\"272\" \/><\/a>Esta tabla muestra que la mayor\u00eda (10 de 16) de los &#8216;switch case&#8217; con un tama\u00f1o significativo se encuentran en funciones identificadas como muy complejas. La columna &#8216;Switch Line&#8217; muestra la l\u00ednea de c\u00f3digo donde comienza el \u2018switch case\u2019. Tambi\u00e9n conozco la l\u00ednea donde se inicia la funci\u00f3n (&#8216;Line Fn&#8217;) y el tama\u00f1o de esta misma en n\u00famero de l\u00edneas (&#8216;Fn Size&#8217;), lo que me permite calcular la l\u00ednea de c\u00f3digo donde termina la funci\u00f3n (&#8216;End Fn&#8217;) y as\u00ed comprobar si\u00a0 el \u2018switch case\u2019 est\u00e1 dentro de ella (&#8216;In&#8217;).<\/p>\n<p>Por ejemplo:<\/p>\n<ul>\n<li>El archivo &#8216;RTFOUT.C&#8217; es un programa de m\u00e1s de 300 puntos de CC (naranja oscuro) con una funci\u00f3n de 355 CC, en el que hay 2 \u2018switch case\u2019, con respectivamente 296 y 181 l\u00edneas de c\u00f3digo.<\/li>\n<li>El archivo &#8216;formula.c&#8217; es tambi\u00e9n un programa de m\u00e1s de 300 CC (naranja oscuro) con una funci\u00f3n de 234 CC y 3 \u2018switch case\u2019 de 126, 105 y 183 l\u00edneas de c\u00f3digo.<\/li>\n<li>Etc.<\/li>\n<\/ul>\n<p>La existencia de estructuras de c\u00f3digo largas y dif\u00edciles de entender, como el \u2018switch case\u2019 es un factor agravante de los costes de la transferencia de conocimientos para estos programas y funciones ya muy complejos.<\/p>\n<h2>N\u00famero de par\u00e1metros<\/h2>\n<p style=\"text-align: left\">Otra regla que dese\u00e9 comprobar: funciones con un alto n\u00famero de par\u00e1metros.<br \/>\n<a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1936\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Fn_Param.jpg\" alt=\"Word_Fn_Param\" width=\"544\" height=\"25\" \/><\/a>43 funciones tienen m\u00e1s de 7 par\u00e1metros. Este n\u00famero no es muy elevado si se compara con la complejidad de las funciones o de su tama\u00f1o en n\u00famero de l\u00edneas.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 9 \u2013 funciones complejas con un alto n\u00famero de par\u00e1metros<br \/>\n<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1937\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_FnCplx_Nbr.jpg\" alt=\"Word_FnCplx_Nbr\" width=\"349\" height=\"219\" \/><\/a>Le tabla anterior muestra que estas funciones no se encuentran entre las m\u00e1s complejas. Al menos no tendremos que preocuparnos por esto.<\/p>\n<h2>Goto<\/h2>\n<p>Como todos sabemos, un &#8216;goto&#8217; es un &#8216;salto&#8217; a otra parte del c\u00f3digo, que rompe la continuidad del flujo de tratamientos. Esta instrucci\u00f3n se ha convertido en el s\u00edmbolo del c\u00f3digo &#8216;spaghetti&#8217;, dif\u00edcil de leer y mantener.<\/p>\n<p>Nos encontramos con un n\u00famero muy alto en la aplicaci\u00f3n.<\/p>\n<p style=\"text-align: left\"><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1938\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto.jpg\" alt=\"Word_Goto\" width=\"547\" height=\"30\" \/><\/a>De hecho, un vistazo al c\u00f3digo nos permite comprobar que esta pr\u00e1ctica est\u00e1 muy extendida en toda la aplicaci\u00f3n. Por ejemplo, el tratamiento de errores no se hace llamando a una funci\u00f3n espec\u00edfica, pero con un &#8216;goto&#8217; a la porci\u00f3n correspondiente de c\u00f3digo, a veces incluso en una biblioteca externa.<\/p>\n<p style=\"text-align: left\">La siguiente tabla muestra la distribuci\u00f3n de &#8216;goto&#8217; en los programas m\u00e1s complejos, superando los 300 puntos de CC.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 11 &#8211; Distribuci\u00f3n de Goto en los programas m\u00e1s complejos ( &gt; 300 CC)<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1940\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_Dist.jpg\" alt=\"Word_Goto_Dist\" width=\"531\" height=\"93\" \/><\/a><br \/>\n1 383 \u2018goto\u2019, es decir 54% del n\u00famero total (2 541) se encuentran en los programas con un nivel alto o alt\u00edsimo de Complejidad Ciclom\u00e1tica.<\/p>\n<p>Te recuerd\u00e1s que en\u00a0<a href=\"http:\/\/qualilogy.com\/es\/aplicacion-legacy-c-refactorizacion-reingenieria-2\/\" target=\"_blank\">el segundo episodio<\/a> de esta serie, hemos hecho una lista de los archivos con una alta complejidad y que incluyen por lo menos una funci\u00f3n muy compleja.<\/p>\n<p style=\"text-align: center\"><em><strong>Tabla 9 \u2013 Archivos complejos con un alto n\u00famero de Goto<\/strong><\/em><\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1941\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2014\/06\/Word_Goto_PgmsCplx.jpg\" alt=\"Word_Goto_PgmsCplx\" width=\"352\" height=\"492\" \/><\/a>Encontramos, con un n\u00famero elevado de &#8216;Goto&#8217;:<\/p>\n<ul>\n<li>2 archivos con m\u00e1s de 400 CC y al menos una funci\u00f3n de m\u00e1s de 200 CC + 1 funci\u00f3n de m\u00e1s de 100 cc (en rojo abajo), contando tambi\u00e9n con 87 y 32 &#8216;goto&#8217;.<\/li>\n<li>7 archivos con m\u00e1s de 400 CC con al menos una funci\u00f3n de m\u00e1s del 100 CC (naranja).<\/li>\n<\/ul>\n<p>Tenemos un total de:<\/p>\n<ul>\n<li>\u00a0\u00a0\u00a0 142\u00a0&#8216;goto&#8217; en dos programas con m\u00e1s de 700 CC.<\/li>\n<li>\u00a0\u00a0\u00a0 86\u00a0&#8216;goto&#8217; en 3 programas con m\u00e1s de 600 CC.<\/li>\n<li>\u00a0\u00a0\u00a0 200\u00a0&#8216;goto&#8217; en 4 programas con m\u00e1s de 500 CC.<\/li>\n<li>\u00a0\u00a0\u00a0 350\u00a0&#8216;goto&#8217; en 11 programas con m\u00e1s de 400 CC.<\/li>\n<\/ul>\n<h2>Otras &#8216;malas pr\u00e1cticas&#8217;<\/h2>\n<p>Continu\u00e9 este trabajo de busqueda de convergencias entre los programas m\u00e1s grandes y las funciones m\u00e1s complejas con las violaci\u00f3nes a las mejores pr\u00e1cticas que afectan a la legibilidad y la comprensi\u00f3n del c\u00f3digo, como &#8216;continue&#8217; should not be used (MISRA C 14.5)\u2019 ou \u2018If statements should not be nested too deeply\u2019.<\/p>\n<p>No voy a enumerar todos los resultados. Estos defectos se producen en n\u00fameros (relativamente) memos elevados que los anteriores, pero igualmente afectar\u00e1n los programas y funciones m\u00e1s complejos.<\/p>\n<p>Por \u00faltimo, nuestro objetivo no es realizar un estudio totalmente exhaustivo y extremadamente preciso \u2013 necesitar\u00eda diez o m\u00e1s articulos de este blog \u2013 pero de ilustrar un posible enfoque para calcular los costes de refactorizaci\u00f3n o de reingenier\u00eda de una aplicaci\u00f3n. Vamos a tratar esta estimaci\u00f3n en el pr\u00f3ximo post.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tenemos esta aplicaci\u00f3n Legacy C, la primera versi\u00f3n de Word publicada por Microsoft en el a\u00f1o 1990, para la cual se propone cuantificar el coste de diferentes estrategias: refactorizaci\u00f3n o reingenier\u00eda, por el mismo equipo de desarrolladores o por un nuevo equipo y por tanto, con una transferencia de conocimiento.<\/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-1230","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1230"}],"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=1230"}],"version-history":[{"count":24,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1230\/revisions"}],"predecessor-version":[{"id":1232,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/1230\/revisions\/1232"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=1230"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=1230"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=1230"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}