{"id":104,"date":"2012-03-19T20:42:28","date_gmt":"2012-03-19T19:42:28","guid":{"rendered":"http:\/\/dev.qualilogy.com\/es\/?p=104"},"modified":"2013-01-04T20:43:26","modified_gmt":"2013-01-04T19:43:26","slug":"la-metrica-abc","status":"publish","type":"post","link":"http:\/\/qualilogy.com\/es\/la-metrica-abc\/","title":{"rendered":"La m\u00e9trica ABC"},"content":{"rendered":"<p>\u00daltimamente he participado en algunas discusiones sobre la utilidad de la m\u00e9trica LOC (Lines Of Code o l\u00edneas de c\u00f3digo). Como explicado en algunos posts anteriores, esta es la m\u00e9trica que busco primero cuando hago una auditor\u00eda de la calidad de una aplicaci\u00f3n. Y uso esta m\u00e9trica s\u00f3lo con el fin de obtener una idea del tama\u00f1o de la aplicaci\u00f3n.<\/p>\n<p><!--more--><\/p>\n<p>Luego, considerar\u00e9 otras medidas tales como la Complejidad Ciclom\u00e1tica (CC) para tener una idea de su peso funcional. Siempre es interesante cruzar estas medidas, por ejemplo, calcular el n\u00famero de LOC y la CC promedio por m\u00e9todo o por clase. Esto permite identificar a las clases o m\u00e9todos que son dif\u00edciles de entender, ya sea porque el programador tendra que ir en su pantalla de arriba a abajo en un archivo largo para seguir el flujo de instrucciones, o por un n\u00famero significativo de condiciones y \/ o los enlaces y una l\u00f3gica funcional m\u00e1s compleja de entender. As\u00ed que el riesgo es mayor de introducir un defecto cuando se realiza un cambio en el c\u00f3digo.<\/p>\n<p>Si se habla de LOC en una discusi\u00f3n, probablemente te encontrar\u00e1s con algunas personas que te dir\u00e1n que esta m\u00e9trica no debe ser utilizada para medir la productividad o el esfuerzo de mantenimiento. Estoy de acuerdo que esto es incorrecto, el uso de esta m\u00e9trica debe limitarse a medir el tama\u00f1o.<\/p>\n<p>Los puntos de funci\u00f3n (Function Points) se consideran a menudo la mejor m\u00e9trica para medir la productividad. Tienen ciertas ventajas, sobre todo que se pueden utilizar con especificaciones funcionales, incluso antes de empezar el desarrollo, por lo que es \u00fatil para evaluar el esfuerzo necesario para implementar estas especificaciones en el c\u00f3digo y para estimar la la carga necesaria en d\u00edas \/ hombre. Sin embargo, esta medida tiene, en mi opini\u00f3n, un gran inconveniente: no es f\u00e1cil de automatizar el c\u00e1lculo con una herramienta de an\u00e1lisis de c\u00f3digo y un experto de FP estar\u00e1 muy cuidadoso, para no decir sospechoso a la hora de utilizar puntos de funci\u00f3n calculados de forma autom\u00e1tica.<\/p>\n<p>Mientras trabajaba en los posts anteriores con el plugin City Model para Sonar, descubr\u00ed que eXcentia, la compa\u00f1\u00eda espa\u00f1ola autora de este plugin, tambi\u00e9n ha creado uno para calcular una m\u00e9trica ABC.<\/p>\n<p>Os dejar\u00e9 ver la descripci\u00f3n de esta m\u00e9trica, a partir de un documento de su autor Jerry Fitzpatrick, <a title=\"ABC Metric\" href=\"http:\/\/www.softwarerenovation.com\/ABCMetric.pdf\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n<p>Esta m\u00e9trica se basa en:<\/p>\n<ul>\n<li>A: Assignment, o asignaci\u00f3n de valor a una variable.<\/li>\n<li>B: Branch, o llamada a una funci\u00f3n o un nuevo objeto.<\/li>\n<li>C: Condition, una prueba basada en una condici\u00f3n.<\/li>\n<\/ul>\n<p>He descargado el plugin  ABC desde esta <a title=\"eXcentia ABC\" href=\"https:\/\/servicios.excentia.es\/confluence\/display\/QAX\/SONAR+ABC+Metric+Plugin\" target=\"_blank\">pagina<\/a> en el sitio web de eXcentia, y lo he instalado en mi entorno Sonar.<\/p>\n<p>A continuaci\u00f3n, he creado una clase &#8216;TestAssignment.java&#8217; con 50 instrucciones como las siguientes:<\/p>\n<address>int var1=0;<\/address>\n<address>int var2=0;<\/address>\n<address>\u2026<\/address>\n<p>Puse en marcha un an\u00e1lisis Sonar con Jenkins (si quieres probar por ti mismo, puedes ver a algunos posts anteriores, como <a title=\"Sonar analysis\" href=\"http:\/\/qualilogy.com\/es\/analisis-de-codigo-cobol-con-sonar-y-jenkins\" target=\"_blank\">este<\/a>).<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC1Class.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1311\" title=\"ABC1Class\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC1Class-300x165.jpg\" alt=\"\" width=\"246\" height=\"135\" \/><\/a> El resultado: un \u00fanico edificio de una sola clase con los siguientes valores:<\/p>\n<ul>\n<li>ABC = 50, correspondiente a las 50 asignaciones que hemos creado.<\/li>\n<li>LOC = 55, correspondiente a las 50 l\u00edneas para estas asignaciones m\u00e1s unas pocas l\u00edneas adicionales para declarar la clase y su \u00fanico m\u00e9todo.<\/li>\n<li>Complexity = 1, el m\u00ednimo posible ya que no hay complejidad.<\/li>\n<\/ul>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC1Measure.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1313\" title=\"ABC1Measure\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC1Measure.jpg\" alt=\"\" width=\"582\" height=\"200\" \/><\/a><\/p>\n<p>Luego, he creado una nueva clase &#8216;TestCondition.java&#8217; con el siguiente c\u00f3digo:<\/p>\n<address>public class TestCondition {<\/address>\n<address>    int var1=0;<\/address>\n<address>    public TestCondition() {<\/address>\n<address>        if (this.var1 = 0){<\/address>\n<address>            this.var1 = 1;<\/address>\n<address>        }<\/address>\n<address>        else{<\/address>\n<address>            this.var1 = 2;<\/address>\n<address>        }<\/address>\n<address>&#8230;<\/address>\n<p>y las condiciones en este c\u00f3digo duplicadas 8 veces para obtener aproximadamente el mismo n\u00famero de l\u00edneas de c\u00f3digo que la clase anterior. Hay que tener en cuenta que tambi\u00e9n tendremos 25 asignaciones: 3 en cada test duplicado 8 veces = 24 + 1 correspondiente a la declaraci\u00f3n inicial de la variable var1.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC2Class.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1328\" title=\"ABC2Class\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC2Class-300x135.jpg\" alt=\"\" width=\"300\" height=\"135\" \/><\/a>Ahora tengo dos edificios, del mismo tama\u00f1o pero uno es rojo porque su nivel de CC por m\u00e9todo es alto.<\/p>\n<p>Sin embargo, la m\u00e9trica ABC para esta nueva clase ABC es s\u00f3lo ligeramente superior a las 25 asignaciones presente en su c\u00f3digo, lo que demuestra que la complejidad no pesa mucho en el resultado.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC2Measure.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1330\" title=\"ABC2Measure\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC2Measure.jpg\" alt=\"\" width=\"584\" height=\"248\" \/><\/a><\/p>\n<p>Como se puede imaginar, he creado una tercera clase &#8216;TestBranch.java&#8217; con 50 instrucciones \u00abnew\u00bb:<\/p>\n<address>TestCondition myCondition1 = new TestCondition();<\/address>\n<address>TestCondition myCondition2 = new TestCondition();<\/address>\n<address>&#8230;<\/address>\n<address>TestCondition myCondition50 = new TestCondition();<\/address>\n<address> <\/address>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC3Class.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-medium wp-image-1333\" title=\"ABC3Class\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC3Class-300x149.jpg\" alt=\"\" width=\"300\" height=\"149\" \/><\/a>La altura sigue la misma, pero el valor ABC ahora es el m\u00e1s importante ya que tenemos 50 asignaciones que acompa\u00f1an los 50 tratamientos de tipo &#8216;Branch&#8217;.<\/p>\n<p>Sin embargo, la m\u00e9trica ABC no se ha duplicado en comparaci\u00f3n con la clase TestAssignement. Esta se compone de 50 asignaciones por un valor ABC de 50, mientras que la clase TestBranch tiene 50 asignaciones y 50 &#8216;new&#8217;, pero un valor ABC ligeramente por encima de 70.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1334\" title=\"ABC3Measure\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC3Measure.jpg\" alt=\"\" width=\"583\" height=\"298\" \/><\/p>\n<p>Entonces, \u00bfqu\u00e9 podemos decir acerca de esta m\u00e9trica ABC?<\/p>\n<p>En primer lugar, podemos ver diferentes valores para estas tres clases con el mismo n\u00famero de LOC. As\u00ed la m\u00e9trica ABC es independiente del n\u00famero de l\u00edneas de c\u00f3digo.<\/p>\n<p>Ahora, no estoy seguro de que puede ser usada como una medida de la productividad o el esfuerzo de mantenimiento: se puede ver que la A de Asignaci\u00f3n pesa en su calculo. La condici\u00f3n C est\u00e1 claramente infravalorada. Es evidente que el esfuerzo requerido para hacer un cambio en una estructura de 8 &#8216;if-endif&#8217; es mayor que para introducir un cambio en una secuencia de 50 asignaciones. Especialmente que las condiciones son m\u00e1s a menudo imbricadas (if dentro de un if dentro de un if &#8230;).<\/p>\n<p>Y la mayor parte del tiempo, un enlace de tipo &#8216;Branch&#8217; provocar\u00e1 nuevas asignaciones. Y tambi\u00e9n podemos ver que la adici\u00f3n de 50 &#8216;new&#8217; y 50 asignaciones no duplica el resultado en comparaci\u00f3n con 50 asignaciones sin ning\u00fan tipo de &#8216;Branch&#8217; cuando, de hecho, creo que el esfuerzo para el programador se multiplicar\u00e1 por m\u00e1s de dos. Esto es debido a la f\u00f3rmula para calcular la m\u00e9trica ABC.<\/p>\n<p>Pues, \u00bfqu\u00e9 uso podemos hacer de la m\u00e9trica ABC? Debido a la predominancia de las asignaciones y la subvaloraci\u00f3n de la condici\u00f3n C y de las llamadas B, creo que esta medida se orienta m\u00e1s a &#8216;estructura de datos&#8217; que a &#8216;l\u00f3gica&#8217;. Esto no es un problema, puesto que ya tenemos la complejidad ciclom\u00e1tica para evaluar la l\u00f3gica funcional.<\/p>\n<p>As\u00ed que he creado un nuevo modelo de City con los siguientes par\u00e1metros:<\/p>\n<ul>\n<li>La altura sigue bas\u00e1ndose en el n\u00famero de LOC.<\/li>\n<li>La anchura basada en el n\u00famero de asignaciones, el A de la m\u00e9trica ABC.<\/li>\n<li>El color basado en el valor total de la m\u00e9trica ABC, de 1 (verde) hasta 100 (rojo).<\/li>\n<\/ul>\n<p>Esto es lo que obtengo con mis tres clases:<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCCity.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1347\" title=\"ABCCity\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCCity.jpg\" alt=\"\" width=\"583\" height=\"447\" \/><\/a><\/p>\n<p>Los tres edificios todav\u00eda siguen con la misma altura.<\/p>\n<p>El m\u00e1s peque\u00f1o con color verde es la clase TestCondition con una anchura de 25 correspondiente a sus 25 asignaciones y un color correspondiente al valor ABC de 26.2, subestimando as\u00ed el C de Condici\u00f3n.<\/p>\n<p>Los otros dos bloques corresponden a las clases TestBranch y TestAssignment con el mismo ancho correspondiente al n\u00famero de 50 asignaciones, pero TestBranch es m\u00e1s roja que TestAssignment con los tratamientos de llamadas adicionales.<\/p>\n<p>Esta representaci\u00f3n visual permite entender mejor c\u00f3mo utilizar la m\u00e9trica ABC. Yo no la usar\u00eda para medir el esfuerzo de mantenimiento, sino para medir la orientaci\u00f3n a estructura de datos o el peso de los datos en un objeto, teniendo en cuenta el ancho de cada edificio, y una medida global de riesgo del componente, en funci\u00f3n de su color. Un componente presentar\u00e1 un nivel de riesgo m\u00e1s o menos importante debido a que es bastante complejo, o m\u00e1s probablemente debido a un nivel de acoplamiento m\u00e1s elevado, adem\u00e1s de su peso en estructuras de datos.<\/p>\n<p>El plugin ABC de eXcentia viene con su propio widget (hemos visto en el <a href=\"http:\/\/qualilogy.com\/es\/city-model-nueva-version\" target=\"_blank\">post anterior<\/a> la forma de agregarlo a nuestro dashboard para personalizar Sonar):<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCWidget1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1350\" title=\"ABCWidget\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCWidget1.jpg\" alt=\"\" width=\"582\" height=\"152\" \/><\/a><\/p>\n<p>Podemos ver diferentes resultados para la m\u00e9trica ABC:<\/p>\n<ul>\n<li>Un total de 134.9 para toda la aplicaci\u00f3n.<\/li>\n<li>Un promedio de 45 por clase, lo que representa un nivel de riesgo moderado para una clase.<\/li>\n<li>Un promedio de 45 por cada m\u00e9todo, lo que representa un riesgo m\u00e1s alto y se debe considerar un refactoring para los dos m\u00e9todos con un valor ABC superior a 45.<\/li>\n<\/ul>\n<p>As\u00ed que este widget est\u00e1 en l\u00ednea con el uso que he recomendado, basado en el riesgo de introducir un defecto cuando se realiza un cambio en un componente.<\/p>\n<p>\u00bfY si quiero una mejor apreciaci\u00f3n de este riesgo, el plugin ABC me permite hacer un drill-down.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC4Class.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1351\" title=\"ABC4Class\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABC4Class.jpg\" alt=\"\" width=\"450\" height=\"307\" \/><\/a>Aqu\u00ed he seleccionado el edificio de mayor riesgo en mi City, la clase TestBranch, con sus diferentes valores.<\/p>\n<p>Me basta con hacer clic sobre su nombre para ir a una ficha espec\u00edfica de la m\u00e9trica ABC con las medidas para este objeto, y los valores para los diferentes elementos A, B y C as\u00ed que por m\u00e9todo y clase.<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCOnglet.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1353\" title=\"ABCOnglet\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCOnglet.jpg\" alt=\"\" width=\"539\" height=\"113\" \/><\/a><\/p>\n<p>La mezcla de los dos plugins eXcentia para Sonar, City Model y ABC permite una evaluaci\u00f3n visual del nivel de riesgo y la necesidad de refactorizaci\u00f3n de la aplicaci\u00f3n.<\/p>\n<p>Aqu\u00ed est\u00e1 un ejemplo real: he analizado un paquete que s\u00e9 que contiene algunas clases peligrosas:<\/p>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCSessionUsuario.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1355\" title=\"ABCSessionUsuario\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCSessionUsuario.jpg\" alt=\"\" width=\"584\" height=\"448\" \/><\/a><\/p>\n<p>Podemos ver en el barrio de derecha el paquete &#8216;TestABC&#8217; con las tres clases que hemos creado para nuestras pruebas. Ahora, en esta representaci\u00f3n, modifiqu\u00e9 la expresi\u00f3n para calcular la anchura de cada edificio con el n\u00famero promedio de asignaciones por m\u00e9todo, en lugar del total de asignaciones para la clase como antes.<\/p>\n<p>En la figura anterior, apunto a la torre roja alta a la izquierda, una clase &#8216;SesionUsuario&#8217; que administra todos los datos de un usuario quien se registra en la aplicaci\u00f3n. Podemos ver:<\/p>\n<ul>\n<li>Un n\u00famero de l\u00edneas de c\u00f3digo de 2 700 LOC, lo que explica la altura de la torre.<\/li>\n<li>Un valor ABC global de 538.6 muy alto, lo que explica el color rojo de la torre.<\/li>\n<li>Que este valor global se basa en 522 asignaciones.<\/li>\n<li>Un n\u00famero considerable de m\u00e9todos: 67, lo que explica la anchura de la torre (522 asignaciones \/ 67 m\u00e9todos).<\/li>\n<\/ul>\n<p><a href=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCSessionUsuarioMeasure1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1359\" title=\"ABCSessionUsuarioMeasure\" src=\"http:\/\/qualilogy.com\/wp-content\/uploads\/2012\/03\/ABCSessionUsuarioMeasure1.jpg\" alt=\"\" width=\"262\" height=\"20\" \/><\/a>Un drill-down en esta clase muestra la presencia de 71 Branchs y 112 Conditions en su c\u00f3digo. Esto confirma la sobrevaloraci\u00f3n de las asignaciones en el valor total de la m\u00e9trica ABC.<\/p>\n<p>Con la configuraci\u00f3n inicial del plugin City Model, esta clase tambi\u00e9n aparece de altura, con una base m\u00e1s amplia basada en el n\u00famero de sus m\u00e9todos, pero verde por completo debido a su complejidad por m\u00e9todo bastante baja. Por lo tanto, parecer\u00eda un componente importante, pero no necesariamente en la primera posici\u00f3n de una refactorizaci\u00f3n.<\/p>\n<p>Utilizando mediciones de ABC, el ancho es mucho menor, ya que el valor ABC por m\u00e9todo no es muy alto, pero el edificio es completamente rojo, lo que inmediatamente llama la atenci\u00f3n sobre el riesgo por esta clase. As\u00ed que ahora este componente es un buen candidato para una operaci\u00f3n de refactorizaci\u00f3n.<\/p>\n<p>Por supuesto, debemos tener en cuenta otros factores como la calidad del c\u00f3digo y la falta de respecto a buenas pr\u00e1cticas de programaci\u00f3n. Pero con este ejemplo, podemos ver que:<\/p>\n<ul>\n<li>La m\u00e9trica LOC es una medida del tama\u00f1o t\u00e9cnico de una aplicaci\u00f3n, que no es adecuada para evaluar el peso funcional, la productividad de un equipo de proyecto o una estimaci\u00f3n de esfuerzo de mantenimiento.<\/li>\n<li>CC es una buena medida del peso funcional basada en el n\u00famero de caminos l\u00f3gicos en el c\u00f3digo pero no es necesariamente un buen indicador para priorizar refactoring.<\/li>\n<li>Creo que la m\u00e9trica ABC es una buena medida del \u00abpeso de datos\u00bb o del nivel de estructuras de datos en un componente, y como tal, un buen complemento para la Complejidad Ciclomatica, m\u00e1s orientada a \u00abl\u00f3gica\u00bb.<\/li>\n<li>Hemos modelado una ciudad basada en los plugins de eXcentia para Sonar, que nos ayuda a identificar r\u00e1pidamente cu\u00e1les son los componentes de riesgo y definir una lista de los candidatos prioritarios para un plan de refactorizaci\u00f3n.<\/li>\n<\/ul>\n<p>Es probable que se puede imaginar muchas representaciones con el plugin City Model, para tratar diferentes preguntas. Sin embargo, tendremos otras oportunidades para experimentar con estas herramientas.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00daltimamente he participado en algunas discusiones sobre la utilidad de la m\u00e9trica LOC (Lines Of Code o l\u00edneas de c\u00f3digo). Como explicado en algunos posts anteriores, esta es la m\u00e9trica que busco primero cuando hago una auditor\u00eda de la calidad de una aplicaci\u00f3n. Y uso esta m\u00e9trica s\u00f3lo con el fin de obtener una idea [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"class_list":["post-104","post","type-post","status-publish","format-standard","hentry","category-sonar-360"],"_links":{"self":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/104"}],"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=104"}],"version-history":[{"count":1,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/104\/revisions"}],"predecessor-version":[{"id":105,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/posts\/104\/revisions\/105"}],"wp:attachment":[{"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/media?parent=104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/categories?post=104"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/qualilogy.com\/es\/wp-json\/wp\/v2\/tags?post=104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}