{"id":559,"date":"2013-06-08T11:18:28","date_gmt":"2013-06-08T10:18:28","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=559"},"modified":"2013-06-09T08:44:25","modified_gmt":"2013-06-09T07:44:25","slug":"creacion-de-metricas-personalizadas-2","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/creacion-de-metricas-personalizadas-2\/","title":{"rendered":"Creaci\u00f3n de m\u00e9tricas personalizadas (2)"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-902\" alt=\"Cr\u00e9er des m\u00e9triques personnalis\u00e9es (2)\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/NewMetrics2.jpg\" width=\"253\" height=\"380\" \/><\/a><\/p>\n<p>\u00bfTiene realmente inter\u00e9s crear sus propias mediciones en una herramienta de an\u00e1lisis de c\u00f3digo? \u00bfQu\u00e9 beneficios podemos esperar? \u00bfQu\u00e9 desventajas, qu\u00e9 obst\u00e1culos vamos a encontrar?<\/p>\n<p>Es sorprendente ver cuantas veces se ignoran estas preguntas en una selecci\u00f3n de software de an\u00e1lisis de c\u00f3digo. Se mide la facilidad o la dificultad para personalizar la herramienta y para crear sus propias reglas en lugar de preguntarse si realmente es necesario.<\/p>\n<p>Esta serie de art\u00edculos, por tanto, tiene por objetivo\u00a0 aclarar estas preguntas para ayudar a definir los criterios adecuados si buscas una herramienta de an\u00e1lisis de c\u00f3digo o si eres un consultor de calidad que debe ayudar a un cliente para dicha elecci\u00f3n. <!--more--><\/p>\n<p>Hemos visto anteriormente <a title=\"Las m\u00e9tricas m\u00e1s sencillas\" href=\"http:\/\/qualilogy.com\/es\/creacion-de-metricas-personalizadas\/\" target=\"_blank\">las m\u00e9tricas m\u00e1s sencillas<\/a> y en este art\u00edculo, vamos a ver m\u00e9tricas m\u00e1s complejas e incluso algunas de las normas o mejores pr\u00e1cticas que encontr\u00e9 en algunos clientes, y que son simplemente imposibles de implementar.<\/p>\n<h2>Las m\u00e9tricas complejas<\/h2>\n<p>La mayor\u00eda de las reglas realmente \u00fatiles son complejas, ya que se basan en sintaxis o pr\u00e1cticas de programaci\u00f3n complejas, de aplicar, pero en cualquier caso de identificar. Por ejemplo:<\/p>\n<ul>\n<li>Todas las declaraciones condicionales\u00a0(tipo \u2018IF \u2026 THEN &#8230; ELSE \u2026 ENDIF&#8217;) o de bucle (tipoe \u2018While \u2026 EndWhile\u2019 ou \u2018Loop \u2026 EndLoop\u2019) se estructuran en bloques multiples : \u2018IF\u2019 o \u2018While\u2019 y luego varias\u00a0l\u00edneas de c\u00f3digo (a veces en m\u00e1s de una p\u00e1gina) antes del \u2018ENDIF\u2019 o del \u2018EndWhile&#8217; de fin de sentencia. Identificar\u00a0estas instrucciones con una sola RegExp (ver <a title=\"Las m\u00e9tricas m\u00e1s sencillas\" href=\"http:\/\/qualilogy.com\/es\/creacion-de-metricas-personalizadas\/\" target=\"_blank\">el post anterior<\/a> sobre las expresiones regulares) se convierte en un verdadero dolor de cabeza. Esta es una fuente bastante com\u00fan de falsos-positivos.<\/li>\n<li>Algunas instrucciones pueden necesitar bastante memoria o tiempo de ejecuci\u00f3n, sin presentar un riesgo para el rendimiento &#8230; a menos que se encuentran en un bucle. Una vez m\u00e1s, identificar la presencia de una sintaxis en un bucle es muy complejo y requiere un conocimiento muy avanzado de las expresiones regulares.<\/li>\n<li>La mayor\u00eda de las reglas de legibilidad y comprensi\u00f3n del c\u00f3digo, y entonces de buenas pr\u00e1cticas de mantenibilidad se basan en no a\u00f1adir estas instrucciones: bucles dentro de bucles, &#8216;IF&#8217; imbricados, por lo general en varias p\u00e1ginas de c\u00f3digo. El riesgo de error y entonces el coste de mantenimiento es m\u00e1s elevado, ya que cualquier modificaci\u00f3n de este c\u00f3digo requiere un esfuerzo de programaci\u00f3n superior. De nuevo, estas reglas son complejas o muy dif\u00edcil de implementar con las expresiones regulares.<\/li>\n<li>Otras buenas pr\u00e1cticas de programaci\u00f3n dependen del tipo de objetos. El mejor ejemplo de una tal norma, presente en todos los lenguajes y las tecnolog\u00edas, es la que proh\u00edbe acceder a la base de datos desde la capa de presentaci\u00f3n. Probablemente, la regla n\u00famero uno de seguridad. No es suficiente identificar a una instrucci\u00f3n, sino a todas las diferentes instrucciones con un acceso potencial a la base de datos, y comprobar que se utilizan en una pantalla (capa de presentaci\u00f3n) y realizan un procesamiento de base de datos. De hecho, es m\u00e1s sutil y complicado que eso: ejecutar una consulta SQL desde una JSP es estrictamente prohibido, pero pasar la misma consulta a un objeto de la capa de l\u00f3gica se admite. Una buena pr\u00e1ctica es, por supuesto, pasar s\u00f3lo lo necesario para realizar la consulta SQL a un objeto que se especializa en el acceso a la capa de datos.<\/li>\n<\/ul>\n<p>Se hace muy dif\u00edcil e incluso imposible dise\u00f1ar y implementar esas m\u00e9tricas utilizando RegExp. Por lo general, necesitaremos que la herramienta de an\u00e1lisis de c\u00f3digo permite analizar el \u00e1rbol sint\u00e1ctico de instrucciones, que no es el caso con todas las herramientas. Y se necesitar\u00e1 tambi\u00e9n un conocimiento bastante avanzado en la comprensi\u00f3n de este \u2018Abstract Syntax Tree\u2019 y de las herramientas y lenguages para examinar este arbol y programar una m\u00e9trica. No es para novatos.<\/p>\n<h2>Las m\u00e9tricas imposibles<\/h2>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/Metre2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-918\" alt=\"Metre2\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/Metre2.jpg\" width=\"250\" height=\"254\" \/><\/a>M\u00e1s compleja una m\u00e9trica, m\u00e1s dif\u00edcil implementarla, a veces al l\u00edmite de lo que es posible hacer. Pero unas buenas pr\u00e1cticas personalizadas son simplemente imposibles de automatizar.<\/p>\n<p>Una de las primeras preguntas que hago a un cliente que quiere crear sus propias reglas, es para preguntarle si tiene una lista de normas u otros documentos que describen sus \u00abmejores pr\u00e1cticas\u00bb. Esto no es siempre el caso, ni siquiera a menudo, pero me alegro si responde de manera afirmativa, ya que significa que la pregunta &#8211; f\u00e1cil o no de implementar una nueva m\u00e9trica &#8211; se justifica.<\/p>\n<p>Leyendo ese documento revela sin embargo que una proporci\u00f3n significativa de estas reglas es simplemente imposible de implementar. Esta proporci\u00f3n es mayor o menor dependiendo de la tecnolog\u00eda (lo veremos en el pr\u00f3ximo post sobre este tema). Por ejemplo:<\/p>\n<ul>\n<li>\u00abUna clase, un m\u00e9todo, una funci\u00f3n, un procedimiento, un p\u00e1rrafo (COBOL), etc. deben ser documentados\u00bb en una plantilla. Ya tratar de definir una expresi\u00f3n regular que comprueba si un comentario est\u00e1 presente en la parte superior de la clase, m\u00e9todo, funci\u00f3n, etc. es complicado. Ahora construir una expresi\u00f3n regular que verifica que este comentario se refiere a un formato espec\u00edfico, de varias l\u00edneas por supuesto, con al menos el autor, la fecha, una descripci\u00f3n del objeto, etc. \u00a1Buena suerte!<\/li>\n<li>\u00abLa cabecera de cada programa debe incluir una descripci\u00f3n de la funcionalidad implementada.\u00bb Esta regla es una versi\u00f3n m\u00e1s avanzada de la anterior: no s\u00f3lo es necesario verificar que el comentario de cabecera cumpla alguna forma, pero adem\u00e1s sea coherente en el plano funcional con los tratamientos del programa. Imposible.<\/li>\n<li>\u00abLos mensajes de error deben ser traducidos en espa\u00f1ol, catal\u00e1n y euskera.\u00bb Viva el pluralismo.<\/li>\n<li>Identificaci\u00f3n de c\u00f3digo muerto. Me gustan las herramientas de an\u00e1lisis de c\u00f3digo que pretenden identificar c\u00f3digo muerto. Algo que puede hacer un programador (bastante avanzado) para comentar todo un bloque de c\u00f3digo:<\/li>\n<\/ul>\n<p style=\"padding-left: 60px\"><strong>IF 1=0<\/strong><\/p>\n<p style=\"padding-left: 90px\"><strong>\u2026 c\u00f3digo muerto<br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 60px\"><strong>ENDIF<\/strong><\/p>\n<p>Oh, por supuesto, es muy f\u00e1cil de definir una expresi\u00f3n regular que encontrar\u00e1 todas las sentencias &#8216;IF 1 = 0&#8217;. \u00bfY una RegExp para identificar las ocurrencias de &#8216;IF A = B&#8217; o &#8216;IF 1 = 2&#8217; tambi\u00e9n? Olv\u00eddalo.<\/p>\n<p>La pr\u00f3xima vez que un vendedor de software te dice que su software puede identificar c\u00f3digo muerto, dale este ejemplo (tratando de no sonre\u00edr).<\/p>\n<p>Y yo ni siquiera hablo de normas generales e imprecisas como:<\/p>\n<ul>\n<li>\u00abControl de sintaxis: hay que corregir los errores cr\u00edticos y justificar las excepciones a las reglas que no son cr\u00edticas\u00bb. Pues adelante.<\/li>\n<li>\u00abSe proh\u00edbe el desarrollo de una funci\u00f3n si ya existe una funci\u00f3n que realiza el mismo tratamiento.\u00bb Ah, s\u00ed, por supuesto, tiene sentido, pero gracias recordarlo.<\/li>\n<li>\u00abComprobar que el programa llamado existe\u00bb. Por acaso. Nota: de hecho, esta regla se puede implementar f\u00e1cilmente comprobando el c\u00f3digo de retorno &#8230; cuando existe.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/MetreBois.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-920\" alt=\"MetreBois\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/06\/MetreBois.jpg\" width=\"317\" height=\"167\" \/><\/a>S\u00f3lo quiero decir que unas reglas son completamente imposibles de implementar y son m\u00e1s numerosas de lo que piensas (s\u00ed, tengo otros ejemplos).<\/p>\n<p>En serio, si su cliente tiene un cuaderno de reglas, mejor no reirse antes de verlo, porque al menos, este documento demuestra que se preocupa por la calidad de sus aplicaciones. Simplemente, la mayor\u00eda de estos cuadernos son normas para controles manuales de c\u00f3digo, y no se puede simplemente automatizar todas las normas manuales.<\/p>\n<p>Cuando se te pregunta si una herramienta puede crear reglas personalizadas, la primera reacci\u00f3n es exponer lo que esta herramienta puede hacer, y en general con reglas de sintaxis sencilla, como las que vimos en <a title=\"Las m\u00e9tricas m\u00e1s sencillas\" href=\"http:\/\/qualilogy.com\/es\/creacion-de-metricas-personalizadas\/\" target=\"_blank\">el post anterior<\/a>. Tu cliente estar\u00e1 contento, pero esto no es la respuesta correcta. Lo que hago:<\/p>\n<ul>\n<li>Le pregunto si ha definido reglas, es decir, si tiene buenas pr\u00e1cticas que quiere implementar a trav\u00e9s de la herramienta.<\/li>\n<li>Si este es el caso (repuesta afirmativa), le pregunto si estas reglas est\u00e1n documentadas a trav\u00e9s de un documento.<\/li>\n<li>Si este no es el caso (respuesta negativa): le recuerdo que el 100% de los clientes que deseen adquirir una herramienta de an\u00e1lisis de c\u00f3digo hacen esta misma pregunta, pero el 90% no lo utilizar\u00e1n. Y el 90% del 10% restante abandonar\u00e1 la gesti\u00f3n de las m\u00e9tricas personalizadas despu\u00e9s de 2 a\u00f1os, porque es demasiado trabajo por muy poco beneficio.<\/li>\n<li>En todos los dem\u00e1s casos &#8211; repuesta indistinta como \u00ablo estamos pensando\u00bb, \u00abes para saber\u00bb, \u00abposiblemente\u00bb, etc. &#8211; lo trato como una respuesta negativa (punto anterior), o voy a la pregunta siguiente:<\/li>\n<\/ul>\n<p>M\u00e9tricas personalizadas: \u00bfpara que tecnolog\u00edas?<\/p>\n<p>Este ser\u00e1 el tema de nuestro pr\u00f3ximo post.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfTiene realmente inter\u00e9s crear sus propias mediciones en una herramienta de an\u00e1lisis de c\u00f3digo? \u00bfQu\u00e9 beneficios podemos esperar? \u00bfQu\u00e9 desventajas, qu\u00e9 obst\u00e1culos vamos a encontrar? Es sorprendente ver cuantas veces se ignoran estas preguntas en una selecci\u00f3n de software de an\u00e1lisis de c\u00f3digo. Se mide la facilidad o la dificultad para personalizar la herramienta y [&hellip;]<\/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-559","post","type-post","status-publish","format-standard","hentry","category-calidad-de-aplicaciones"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/559"}],"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=559"}],"version-history":[{"count":16,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/559\/revisions"}],"predecessor-version":[{"id":561,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/559\/revisions\/561"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=559"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}