{"id":309990,"date":"2022-12-22T20:42:38","date_gmt":"2022-12-22T19:42:38","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=qodana&#038;p=309990"},"modified":"2022-12-22T20:42:41","modified_gmt":"2022-12-22T19:42:41","slug":"el-eap-de-qodana-2022-3-ya-esta-disponible-qodana-para-net-y-go-y-mas-de-100-nuevas-inspecciones","status":"publish","type":"qodana","link":"https:\/\/blog.jetbrains.com\/es\/qodana\/2022\/12\/el-eap-de-qodana-2022-3-ya-esta-disponible-qodana-para-net-y-go-y-mas-de-100-nuevas-inspecciones\/","title":{"rendered":"El EAP de Qodana 2022.3 ya est\u00e1 disponible: Qodana para .NET y Go y m\u00e1s de 100 nuevas inspecciones"},"content":{"rendered":"<p>\u00a0<\/p>\n<p>Nos complace anunciar el lanzamiento del EAP de Qodana 2022.3. Esta versi\u00f3n de la plataforma es compatible con <strong>.NET<\/strong> y <strong>Go<\/strong>. Tambi\u00e9n hemos a\u00f1adido m\u00e1s de 100 nuevas inspecciones para los lenguajes que ya eran compatibles. Sin embargo, las im\u00e1genes de Qodana 2022.2 son m\u00e1s estables, ya que Qodana 2022.3 EAP a\u00fan est\u00e1 en sus inicios.<\/p>\n<p>\u00a0<\/p>\n<p>Siga leyendo para obtener m\u00e1s informaci\u00f3n y convertirse en uno de los primeros en probar estas nuevas y emocionantes funcionalidades.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-292996\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/Featured_image_1280x600_Qodana.png\" alt=\"\" width=\"2560\" height=\"1200\" \/><\/figure>\n<p>\u00a0<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/qodana\" target=\"_blank\" rel=\"noopener\"><br \/>COMIENCE A USAR QODANA<br \/><\/a><\/p>\n<p>\u00a0<\/p>\n<p>Nuestros nuevos linters aportan todas las ventajas de <a href=\"https:\/\/www.jetbrains.com\/rider\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rider<\/a> y <a href=\"https:\/\/www.jetbrains.com\/go\/\" target=\"_blank\" rel=\"noreferrer noopener\">GoLand<\/a> para que pueda detectar c\u00f3digo an\u00f3malo y posibles errores, eliminar c\u00f3digo muerto, mejorar la estructura general del c\u00f3digo e introducir las mejores pr\u00e1cticas de codificaci\u00f3n en todos sus proyectos .NET y Go.<\/p>\n<p>\u00a0<\/p>\n<h2>Qodana for .NET<\/h2>\n<p>\u00a0<\/p>\n<p>Qodana es compatible con casi todas las inspecciones de .NET proporcionadas por Rider. Dado que la lista es muy larga, consulte la <a href=\"https:\/\/www.jetbrains.com\/help\/rider\/Code_Analysis__Code_Inspections.html\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de Rider<\/a> para saber m\u00e1s sobre todas las inspecciones. A continuaci\u00f3n, recopilamos algunos ejemplos de las inspecciones de .NET que Qodana puede ejecutar.<\/p>\n<p>\u00a0<\/p>\n<p><strong>Orden no coherente de los bloqueos<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Una de las principales incidencias al utilizar bloqueos para lograr la seguridad de los subprocesos es evitar los bloqueos, es decir, cuando los subprocesos se bloquean de forma simultanea entre s\u00ed para continuar la ejecuci\u00f3n, por lo que no se produce ning\u00fan progreso. Con esta nueva inspecci\u00f3n, Qodana destacar\u00e1 los ciclos que conducen a posibles bloqueos durante la ejecuci\u00f3n.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293018\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/1-NET-order-of-locks.png\" alt=\"\" width=\"1776\" height=\"804\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Acceso a la variable capturada modificada<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Qodana for .NET detecta el acceso a la variable capturada desde un m\u00e9todo an\u00f3nimo cuando la variable se modifica de forma externa.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293029\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/2-NET-access-to-modified.png\" alt=\"\" width=\"1772\" height=\"570\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Evitar el uso de la lambda \u2018async\u2019 cuando el tipo de delegado devuelve \u2018void\u2019<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n detecta el uso de expresiones lambda \u2018async\u2019: cualquier excepci\u00f3n no manejada por la lambda nunca afectar\u00e1 al subproceso de la llamada y no se capturar\u00e1 con la cl\u00e1usula catch.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293040\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/3-NET-Avoid-async-lambda.png\" alt=\"\" width=\"1766\" height=\"650\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>La comprobaci\u00f3n de tipo y las transmisiones se pueden combinar<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>El operador <code>is<\/code> de comprobaci\u00f3n de tipo en su forma cl\u00e1sica <code>(Expression is Type)<\/code> devuelve <code>true<\/code> solo cuando el tipo de ejecuci\u00f3n de <code>Expression<\/code> es compatible con <code>Type<\/code> y el resultado de <code>Expression<\/code> no es <code>null<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p>Cuando utilizamos <code>is<\/code> para comprobar la compatibilidad antes de la transmisi\u00f3n, como en el ejemplo siguiente, nos encontramos con al menos dos problemas:<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>Realizamos la comprobaci\u00f3n de tipo dos veces sin motivo, lo que puede afectar al rendimiento si lo hacemos dentro de un bucle.<\/li>\n<li>El hecho de que la ejecuci\u00f3n del programa no llegue a la instrucci\u00f3n <code>if<\/code> si <code>obj<\/code> es <code>null<\/code> no queda claro de inmediato para quienes lean este c\u00f3digo.<\/li>\n<\/ul>\n<p>Qodana detectar\u00e1 este problema y le sugerir\u00e1 que lo arregle en Rider.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293051\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/4-NET-Merge-cast.png\" alt=\"\" width=\"1748\" height=\"510\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>La expresi\u00f3n lambda\/el m\u00e9todo an\u00f3nimo no debe tener capturas del contexto contenedor<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>La expresi\u00f3n lambda\/el m\u00e9todo an\u00f3nimo que se transfiere a un par\u00e1metro anotado por el atributo \u2018[RequireStaticDelegate]\u2019 no debe tener capturas del contexto que lo contiene (variables locales, funciones locales, referencia \u2018this\u2019) para evitar asignaciones del mont\u00f3n.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293062\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/5-NET-Lambda.png\" alt=\"\" width=\"1768\" height=\"676\" \/><\/figure>\n<p>\u00a0<\/p>\n<p>Para configurar el linter para .NET y ejecutar el an\u00e1lisis, consulte la <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/2022.3\/qodana-dotnet-docker-readme.html\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de Qodana<\/a>.<\/p>\n<p>\u00a0<\/p>\n<h2>Qodana for Go<\/h2>\n<p>\u00a0<\/p>\n<p>Qodana 2022.3 est\u00e1 dise\u00f1ado para ser compatible con todas las inspecciones proporcionadas por GoLand. Para ver la lista exhaustiva, consulte la <a href=\"https:\/\/www.jetbrains.com\/help\/go\/code-inspections-in-go.html\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n de GoLand<\/a>. A continuaci\u00f3n, se muestran ejemplos de algunas de las inspecciones de Go que ahora son compatibles con Qodana.<\/p>\n<p>\u00a0<\/p>\n<p><strong>El argumento de marcador de posici\u00f3n \u2018d.DeletedCount\u2019 tiene el tipo incorrecto \u2018int64\u2019 (%s)<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa del uso incorrecto de <code>fmt.Printf<\/code>, <code>fmt.Println<\/code> y funciones de formateo e impresi\u00f3n similares.<\/p>\n<p>\u00a0<\/p>\n<p>En sus cadenas de formato, las funciones de formateo utilizan verbos de formateo, como <code>%s<\/code>, <code>%d<\/code> o <code>%v<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p>Si los verbos de formateo se utilizan de forma incorrecta, el resultado de una funci\u00f3n de formateo contendr\u00e1 un error.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293073\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/6-Go-placeholder.png\" alt=\"\" width=\"1718\" height=\"548\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Error no solucionado<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa de las llamadas a funciones y m\u00e9todos que no manejan el resultado de la llamada del tipo <code>error<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p>Una API con estas funciones implica que su ejecuci\u00f3n podr\u00eda terminar sin \u00e9xito y devolver\u00eda un error. Las llamadas que no manejan el resultado del error podr\u00edan ser un indicio de mal uso de la API.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293084\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/7-Go-Unhandled.png\" alt=\"\" width=\"1718\" height=\"464\" \/><\/figure>\n<p>\u00a0<\/p>\n<p><strong>Dependencia no utilizada<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa de las dependencias no utilizadas en su proyecto. Es una buena pr\u00e1ctica buscar las dependencias no utilizadas de forma regular, ya que reduce el tama\u00f1o de la biblioteca de su proyecto y mejora la capacidad de mantenimiento.<\/p>\n<p>\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-293095\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/8-Go-unused.png\" alt=\"\" width=\"1594\" height=\"484\" \/><\/figure>\n<p>\u00a0<\/p>\n<p>Para ver Qodana en acci\u00f3n y probar estas nuevas inspecciones, no dude en entrar en nuestra documentaci\u00f3n y ver c\u00f3mo configurar linters para <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/2022.3\/qodana-go-docker-readme.html\" target=\"_blank\" rel=\"noreferrer noopener\">Go<\/a>.<\/p>\n<p>\u00a0<\/p>\n<h2>Nuevas inspecciones<\/h2>\n<p>\u00a0<\/p>\n<p>Adem\u00e1s de a\u00f1adir nuevos linters para .NET y Go, Qodana 2022.3 tambi\u00e9n incluye m\u00e1s de 100 nuevas inspecciones para los linters existentes. Veamos los ejemplos m\u00e1s destacados de inspecciones para Java, Kotlin y Python.<\/p>\n<p>\u00a0<\/p>\n<h3>Inspecciones de Java y Kotlin<\/h3>\n<p>\u00a0<\/p>\n<p>Hemos a\u00f1adido m\u00e1s de 40 nuevas inspecciones a Qodana for JVM Community y Qodana for JVM.<\/p>\n<p>\u00a0<\/p>\n<p><strong>DataFlowIssue<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa de las construcciones de c\u00f3digo que siempre violan los contratos que aceptan valores null, que pueden lanzar excepciones o que son redundantes, en funci\u00f3n del an\u00e1lisis del flujo de datos.<\/p>\n<p>\u00a0<\/p>\n<p><strong>EscapedSpace<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Java 15 introdujo la secuencia de escape de cadenas s para hacer visibles los espacios en blanco al final de los bloques de texto. En casi todos los dem\u00e1s contextos, especialmente en las expresiones regulares, esta secuencia de escape puede confundirse f\u00e1cilmente con el <code>s<\/code> de una expresi\u00f3n regular que representa un espacio en blanco. En los literales de cadena de Java, debe escribirse como <code>\\s<\/code>.<\/p>\n<p>\u00a0<\/p>\n<p><strong>MismatchedJavadocCode<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa de los casos en los que el Javadoc de un m\u00e9todo contradice de forma evidente la firma del m\u00e9todo, como el comentario que dice \u00abreturns true\u00bb cuando el m\u00e9todo devuelve una cadena.<\/p>\n<p>\u00a0<\/p>\n<p><strong>Destructure<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta inspecci\u00f3n informa de las declaraciones en Kotlin que pueden ser desestructuradas.<\/p>\n<p>\u00a0<\/p>\n<p><strong>UnresolvedRestParam<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Ahora Qodana puede detectar declaraciones de m\u00e9todos incoherentes en los servicios REST (como los par\u00e1metros <code>@PathParam<\/code> que no coinciden con un marcador de posici\u00f3n de la anotaci\u00f3n <code>@Get<\/code>), ya que estos lanzar\u00edan excepciones durante la ejecuci\u00f3n.\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><strong>ReactiveStreamsThrowInOperator<\/strong><\/p>\n<p>\u00a0<\/p>\n<p>Esta nueva inspecci\u00f3n detecta las declaraciones <code>throw<\/code> en el c\u00f3digo del operador Reactor\/RxJava en lugar de devolver los valores de error designados, lo que impide que los errores se sigan procesando. Por ejemplo, los ignora o los reemplaza con un valor alternativo.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p>Tenga en cuenta que esta versi\u00f3n de Qodana tambi\u00e9n incluye las nuevas inspecciones para Android de IntelliJ IDEA 2022.3 y Android Studio \u2013 Electric Eel | 2022.1.1.<\/p>\n<p>\u00a0<\/p>\n<h3>Inspecciones de Python<\/h3>\n<p>\u00a0<\/p>\n<p>Tambi\u00e9n hemos a\u00f1adido a Qodana for Python algunas inspecciones para Google App Engine que destacar\u00e1n los problemas antes de que causen fallos en los entornos de producci\u00f3n. Por ejemplo, ahora puede detectar:<\/p>\n<p>\u00a0<\/p>\n<ul>\n<li>Consultas GQL que no cumplen con las restricciones de consultas permitidas en el servidor de Google App Engine.<\/li>\n<li>Consultas GQL sin \u00edndices.<\/li>\n<li>Usos de caracter\u00edsticas de Python que est\u00e1n restringidas por el sandbox de Google App Engine.<\/li>\n<li>Casos en los que el threadsafe no est\u00e1 habilitado con el controlador CGI.<\/li>\n<\/ul>\n<p>Para excluir ciertas inspecciones de su an\u00e1lisis, puede personalizar su perfil de inspecci\u00f3n por defecto o crear uno nuevo. Quiz\u00e1 tambi\u00e9n quiera que se lleven a cabo las inspecciones que son importantes para sus directrices de codificaci\u00f3n. Consulte nuestra <a href=\"https:\/\/www.jetbrains.com\/help\/qodana\/qodana-yaml.html#Include+an+inspection+into+the+analysis+scope\" target=\"_blank\" rel=\"noreferrer noopener\">documentaci\u00f3n sobre Qodana<\/a> para obtener m\u00e1s informaci\u00f3n.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a1Eso es todo sobre el EAP de Qodana 2022.3! Esperamos que disfrute de esta nueva versi\u00f3n. Si tiene alguna sugerencia para futuros temas del blog o si desea saber m\u00e1s sobre c\u00f3mo Qodana puede ayudarle a usted y a su negocio, publique un comentario aqu\u00ed, etiqu\u00e9tenos en <a href=\"https:\/\/twitter.com\/Qodana\" target=\"_blank\" rel=\"noreferrer noopener\">Twitter<\/a> o p\u00f3ngase en contacto con nosotros en <a href=\"mailto:qodana-support@jetbrains.com\">qodana-support@jetbrains.com<\/a>.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a1Que tenga un desarrollo feliz y mantenga limpio su c\u00f3digo!<\/p>\n<p>\u00a0<\/p>\n<p><em>El equipo de Qodana<br \/><br \/>Art\u00edculo original en ingl\u00e9s de:<br \/><br \/><\/em><\/p>\n<p>\u00a0<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":293124,"comment_status":"closed","ping_status":"closed","template":"","categories":[5088,4113,89,907],"tags":[477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/qodana\/309990"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/qodana"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/qodana"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=309990"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/qodana\/309990\/revisions"}],"predecessor-version":[{"id":309996,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/qodana\/309990\/revisions\/309996"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/293124"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=309990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=309990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=309990"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=309990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}