{"id":247,"date":"2013-01-28T15:51:10","date_gmt":"2013-01-28T14:51:10","guid":{"rendered":"http:\/\/qualilogy.com\/es\/?p=247"},"modified":"2013-01-28T17:08:12","modified_gmt":"2013-01-28T16:08:12","slug":"buenas-practicas-de-programacion-abap-los-defectos-critical","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/buenas-practicas-de-programacion-abap-los-defectos-critical\/","title":{"rendered":"Buenas pr\u00e1cticas de programaci\u00f3n ABAP &#8211; Los defectos &#8216;Critical&#8217;"},"content":{"rendered":"<p><a href=\"http:\/\/vicken.deviantart.com\/\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-324\" alt=\"Qualilogy - Les d\u00e9fauts critiques en programmation ABAP\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/Qualilogy_ABAP_20130127.jpg\" width=\"359\" height=\"240\" \/><\/a>Hemos visto en el articulo anterior <a title=\"Buenas practicas de programaci\u00f3n ABAP - Los 'Blockers'\" href=\"http:\/\/qualilogy.com\/es\/buenas-practicas-de-programacion-abap-los-blockers\/\" target=\"_blank\">las violaci\u00f3nes &#8216;Blockers&#8217; a las buenas pr\u00e1cticas de programaci\u00f3n ABAP<\/a>.<\/p>\n<p>Estos defectos son bloqueantes: el c\u00f3digo no puede entrar en producci\u00f3n hasta que se realiza una correcci\u00f3n. No se permite ninguna excepci\u00f3n: tolerancia cero, porque el riesgo es demasiado alto de ver una transacci\u00f3n cancelada y que el usuario no pueda realizar el tratamiento deseado.<!--more--><\/p>\n<p>Tambi\u00e9n hemos configurado nuestro Quality Profile ABAP para identificar defectos cr\u00edticos, que se centran en el rendimiento, y que vamos a ver en este art\u00edculo.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_LOC.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-331\" alt=\"Mon application ABAP\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_LOC.jpg\" width=\"286\" height=\"114\" \/><\/a> Se me olvid\u00f3 mencionarlo la \u00faltima vez, pero mi an\u00e1lisis ABAP representa m\u00e1s o menos 700 programas para 43 000 l\u00edneas con 26 000 l\u00edneas de c\u00f3digo (el resto es comentario). Esto es para dar una idea de la cantidad de defectos con respecto al tama\u00f1o de la aplicaci\u00f3n.<\/p>\n<p>Los problemas de rendimiento son principalmente el resultado de buenas pr\u00e1cticas no respetadas en los tratamientos SQL. Pues no son espec\u00edficos de c\u00f3digo ABAP. A continuaci\u00f3n, podemos ver los m\u00e1s numerosos en la aplicaci\u00f3n que he analizado:<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_Critical1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-330\" alt=\"SONAR et ABAP : les d\u00e9fauts les plus critiques\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_Critical1.jpg\" width=\"583\" height=\"202\" \/><\/a><\/p>\n<p>Un SELECT * no es una pr\u00e1ctica aceptable en todos los lenguajes, porque este query devuelve todas las columnas de la tabla. Si el n\u00famero de filas devuelto tambi\u00e9n es importante, el tama\u00f1o de los datos transportados por la red probablemente impactar\u00e1 al rendimiento. Adem\u00e1s, cuando se agregan nuevas columnas en la tabla, los datos de estas nuevas columnas estar\u00e1n en el SELECT * aunque no se utilizan.<\/p>\n<p>Un SELECT DISTINCT permite eliminar filas duplicadas. El problema es que este tratamiento es muy pesado en t\u00e9rminos de rendimiento, especialmente si algunos de los campos utilizados con la cl\u00e1usula DISTINCT no tienen indice. Adem\u00e1s, debemos asegurarnos de que este tratamiento es \u00fatil porque a menudo sucede que no hay filas duplicadas. Finalmente, es posible evitar a menudo este tratamiento con una programaci\u00f3n diferente si pensamos bien la cl\u00e1usula WHERE.<\/p>\n<p>No se recomienda acceder a una base de datos a trav\u00e9s de un bucle, especialmente para un tratamiento como INSERT, UPDATE, MODIFY, DELETE. Generalmente, el bucle indica que se lee una tabla o un conjunto de registros para realizar esta actualizaci\u00f3n. El problema de rendimiento puede ser peque\u00f1o para una nueva aplicaci\u00f3n con una tabla que contiene pocos registros, pero con el tiempo, los datos se a\u00f1adir\u00e1n a esta tabla, el tama\u00f1o va a crecer, el bucle se hace m\u00e1s largo y los problemas de rendimiento comienzan a aparecer.<\/p>\n<p>Un SELECT sin condici\u00f3n, es decir, sin cl\u00e1usula WHERE, devuelve todos los registros en la tabla. A menudo es una indicaci\u00f3n de un error de programaci\u00f3n (se olvido el WHERE) o una programaci\u00f3n incorrecta. Una vez m\u00e1s, a lo largo del tiempo, con m\u00e1s datos en la tabla, este SELECT ser\u00e1 la causa de un problema de rendimiento.<\/p>\n<p>Bueno, encontramos en estas reglas criticas una buena pr\u00e1ctica que no se relaciona con el rendimiento, pero con la estabilidad de la aplicaci\u00f3n. Una sentencia CASE &#8230; ENDCASE permite diferentes tratamientos para diferentes valores de una variable o un campo. Es un &#8216;switch&#8217;, La cl\u00e1usula OTHERS permite gestionar todos los dem\u00e1s casos (todos los otros valores) no tratados espec\u00edficamente por el CASE. Es una simple cuesti\u00f3n de gesti\u00f3n de errores: si ocurre un evento no previsto, la ausencia de la cl\u00e1usula OTHERS significa que ning\u00fan tratamiento especial se har\u00e1. El programa seguir\u00e1 funcionando, tal vez con valores err\u00f3neos o incorrectos. El riesgo es alto de que se produzca un error y que no sea registrado. Adem\u00e1s, este error se produce normalmente mucho m\u00e1s lejos en el c\u00f3digo, y por lo tanto la detecci\u00f3n de su origen es a menudo muy largo y costoso en t\u00e9rminos de mantenimiento.<br \/>\nAlgunos clientes consideran que esta mala pr\u00e1ctica es un bloqueador. Estoy de acuerdo con eso.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_Critical2.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-332\" alt=\"SONAR et ABAP : les d\u00e9fauts les plus critiques\" src=\"http:\/\/qualilogy.com\/fr\/wp-content\/uploads\/sites\/2\/2013\/01\/SONAR_ABAP_Critical2.jpg\" width=\"531\" height=\"170\" \/><\/a><\/p>\n<p>Una instrucci\u00f3n UPDATE o DELETE sin una cl\u00e1usula WHERE significa actualizar o suprimir todas las filas de la tabla. \u00a1Es mejor asegurarse de que es el tratamiento que se espera y no es un error!<\/p>\n<p>SAP proporciona un sistema tamp\u00f3n o &#8216;buffer&#8217; que permite leer una tabla directamente desde el buffer y no desde la base de datos, con el objetivo de mejorar el rendimiento. Los tratamientos JOIN o funciones de c\u00e1lculo que implican una agregaci\u00f3n (COUNT, AVG, MAX, MIN, etc.) tienen el efecto de prohibir el uso de este buffer. Y esto, \u00a1el programador no lo sabe siempre!<\/p>\n<p>Entonces, un tratamiento que no utiliza deliberadamente (bypassing) el &#8216;buffer&#8217; tendra que ser muy bien justificado!<\/p>\n<p>Por \u00faltimo, utilizar una cl\u00e1usula LIKE no permite, una vez m\u00e1s, predecir el n\u00famero de registros devueltos, especialmente cuando la tabla crece con el tiempo. Y las consultas imbricadas (SELECT &#8230; IN SELECT &#8230;) deben evitarse en todos los lenguajes.<\/p>\n<p>Todav\u00eda hay otras normas criticas que no hemos visto, simplemente porque no he encontrado este tipo de defectos en el c\u00f3digo que he analizado. Por ejemplo,<\/p>\n<ul>\n<li>Avoid SQL queries joining on too many tables<\/li>\n<li>Avoid using GROUP BY in queries<\/li>\n<\/ul>\n<p>Pero el objetivo no es de enumerar todas las malas pr\u00e1cticas de programaci\u00f3n SQL. Tambien tenemos algunas violaci\u00f3nes cr\u00edticas espec\u00edficas de ABAP. Por ejemplo\u00a0: \u00abAvoid too many functions in function pool\u00bb.<\/p>\n<p>Un \u2018function pool\u2019 es un grupo de funciones utilizadas (llamadas) por un programa. Durante esta llamada, todas las funciones est\u00e1n subidas en memoria, y eso durante toda la vida del programa. As\u00ed que m\u00e1s este m\u00f3dulo incluye funciones, m\u00e1s tiempo para cargarlas en la memoria y m\u00e1s espacio ocupan en ella, lo que puede causar problemas de rendimiento. SONAR autom\u00e1ticamente lista todos los grupos con m\u00e1s de 15 funciones.<\/p>\n<p>Tambi\u00e9n tenemos algunas &#8216;best practices&#8217; que no se relacionan con el rendimiento pero que, al igual que los \u2018CASE \u2026 OTHERS\u2019, pr\u00e9sentan un riesgo para la robustez de la aplicaci\u00f3n:<\/p>\n<ul>\n<li>Forbid use of INSERT\/DELETE REPORT\/TEXTPOOL<\/li>\n<li>Forbid use of GENERATE REPORT \/ SUBROUTINE POOL \/ DYNPRO<\/li>\n<\/ul>\n<p>Estas instrucciones est\u00e1n prohibidas porque reservadas para SAP (porque tienen acceso a datos del kernel que pueden desaparecer en futuras versiones).<\/p>\n<p>La regla \u00abPrevent use of EDITOR-CALLS\u00bb es una instrucci\u00f3n que llama al editor de texto SAP. Pero esta instrucci\u00f3n no controla los derechos de los usuarios, como es el caso de cualquier transacci\u00f3n ABAP. En otras palabras, el programador puede dar un acceso a alguien que no tenga el correspondiente derecho. Esta declaraci\u00f3n se abandona en favor de una otra m\u00e1s controlada.<\/p>\n<p>\u00bfQue justifica que una regla sea de tipo Blocker o Cr\u00edtico? Se podr\u00eda considerar que algunas de las violaci\u00f3nes que hemos comentado en este art\u00edculo son lo suficientemente graves como para unirse a la categor\u00eda de los bloqueadores. S\u00ed, pero la diferencia es que no vamos a aceptar ninguna excepci\u00f3n para un Blocker, mientras que se puede por un Cr\u00edtical. Por supuesto, esta excepci\u00f3n debe estar siempre justificada, pero se puede aceptar que este c\u00f3digo pasa en producci\u00f3n para tener el tiempo de decidir si una correcci\u00f3n se debe hacer o no.<\/p>\n<p>Terminaremos la proxima vez la presentaci\u00f3n de nuestro Quality Profile SONAR con las ultimas reglas ABAP.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hemos visto en el articulo anterior las violaci\u00f3nes &#8216;Blockers&#8217; a las buenas pr\u00e1cticas de programaci\u00f3n ABAP. Estos defectos son bloqueantes: el c\u00f3digo no puede entrar en producci\u00f3n hasta que se realiza una correcci\u00f3n. No se permite ninguna excepci\u00f3n: tolerancia cero, porque el riesgo es demasiado alto de ver una transacci\u00f3n cancelada y que el usuario [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-247","post","type-post","status-publish","format-standard","hentry","category-sonar-abap"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/247"}],"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=247"}],"version-history":[{"count":8,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/247\/revisions"}],"predecessor-version":[{"id":255,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/247\/revisions\/255"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=247"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}