Archivo de la etiqueta: Roslyn

SonarLint. Analiza tu código mientras programas

Hace unos meses, en mi empresa montaron un departamento de QA (Quality Assurance o garantía de calidad), ¡y uno de los primeros proyectos que iban a auditar era uno de los míos! ¡Una hecatombe, desde que me enteré no podía ni dormir! ¡Iban a auditar mi código, a desmenuzarlo, a sacarme los fallos y a hacer un informe. ¡Horrible! Ya no podría generar código espagueti, ni crear funciones de 800 líneas, ni hacer copy paste sin parar, ni crear métodos con una complejidad ciclomática de siete cifras, ni crear siete variables llamadas a, b, c, d, e, f y g. ¡Estaba desolado! Ya veía el informe: 300 evidencias bloqueantes, 840 críticas, 1567 mayores, 8399 menores y 4300 informativas. ¡Pum! ¡Cataclán! SonarQube has crashed due a out of memmory while counting the critical bugs!

Lamentablemente, el concepto de calidad en el software, pese a estar muy documentado y cuya teoría todos conocemos en mayor o menor medida, es un aspecto del ciclo de desarrollo que, al menos en el entorno en el que me he movido, se ha tenido poco en cuenta. Puedo contar con los dedos de una mano los proyectos empresariales en los que me han permitido meterme a hacer testing para comprobar la calidad e integridad del software que había que entregar. Todo es para ayer, hay poco tiempo, los presupuestos hay que ajustarlos. Además, ¡los tests son de cobardes!

Gracias a dios, la cosa está cambiando, y parece que cada vez más, una parte del tiempo de desarrollo empieza a reservarse para pasar tests, reglas de calidad y en definitiva, aprender a mejorar la forma en la que desarrollamos nuestros proyectos.

Pensando en tener alguna herramienta que me ayudase a descubrir qué miserias aparecerían cuando auditaran mi proyecto, estuve buscando por internet, y encontré una herramienta muy interesante para VsStudio 2015 llamada SonarLint.

Su descripción en inglés dice:

SonarLint for Visual Studio is based on and benefits from the .NET Compiler Platform (“Roslyn”) and its code analysis API to provide a fully-integrated user experience in Visual Studio 2015.

SonarLint para Visual Studio se basa (y se beneficia) de la plataforma de compilación de .NET (“roslyn”) y su API de análisis de código, para proporcionar una experiencia totalmente integrada en Visual Studio.

Está desarrollado por la empresa Sonar Source, aunque tienen repositorio en Github, desde el que podréis contribuir en el proyecto si os apetece.

Esta extensión añade bastantes reglas de las que analiza el servidor SonarQube, aunque por el momento no tiene la capacidad de integrarse con él.
SonarLint es totalmente autónomo, y solo necesitamos la extensión para empezar a trabajar.

Lo bueno de esta extensión es que, al integrarse perfectamente con VisualStudio 2015, se beneficia de las características de accesibilidad del entorno, por lo que con JAWS 16 he conseguido trabajar con él perfectamente.
Lo que hace es enviarnos warnings a la lista de errores del entorno, y podremos hacer click (o enter) sobre cada uno para ir al fichero y línea en el que se está produciendo ese error.

Os pongo un ejemplo de código chungo y veréis todo lo que saca 😀

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Kastwey.PruebasSonarLint
{
	class Program
	{
		static void Main(string[] args)
		{
			try
			{
				string nombre, apellidos, docIdentidad;
				nombre = "Juanjo";
				apellidos = "Montiel";
				if (nombre.ToLower() == "juanjo")
				{
					if (apellidos.ToLower() == "montiel")
					{
						// WriteLine("Línea comentada");
						WriteLine($"Nombre completo: {nombre} {apellidos}");
					}
				}
				ReadLine();

			}
			catch
			{
			}
		}
	}
}

Y aquí, el resultado, en tiempo de desarrollo (¡ni siquiera tenemos que compilar el proyecto!):

Severity Code Description Project File Line Suppression State
Warning S1118 Add a “protected” constructor or the “static” keyword to the class declaration. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 10 Active
Warning S1172 Remove this unused method parameter “args”. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 12 Active
Warning S1481 Remove this unused “docIdentidad” local variable. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 16 Active
Warning CS0168 The variable ‘docIdentidad’ is declared but never used Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 16 Active
Warning S1449 Define the locale to be used in this String operation. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 19 Active
Warning S1066 Merge this if statement with the enclosing one. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 21 Active
Warning S1449 Define the locale to be used in this String operation. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 21 Active
Warning S125 Remove this commented out code. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 23 Active
Warning S108 Either remove or fill this block of code. Kastwey.PruebasSonarLint d:\proyectos\Kastwey.PruebasSonarLint\Kastwey.PruebasSonarLint\Program.cs 31 Active

¡Espectacular!, ¿a que sí? 😉
Ahora, imaginad que por políticas de vuestro desarrollo, os piden que en algunas funciones pongáis un pequeño ejemplo de uso con parámetros fictícios, por lo que la regla de borrar el código comentado no se aplica aquí. ¿Qué podemos hacer?
Si pulsáis con el botón derecho (o tecla aplicaciones) en el aviso, veréis un submenú que dice: “Suppress”, y dentro, tenemos dos opciones: “Suppress in source” (suprimir en el código) o “suppress in suppression file” (suprimir en un archivo de supresiones).
Si pulsamos cualquiera de los dos, el aviso desaparecerá… Y fijaros qué hace si le decimos que nos elimine el error en el código:

#pragma warning disable S125 // Sections of code should not be "commented out"
						// WriteLine("Línea comentada");
#pragma warning restore S125 // Sections of code should not be "commented out"

Está utilizando preprocesadores para decirle a VsStudio: Este error no me lo muestres aunque la extensión te esté diciendo que sí.
Lo bueno de estos preprocesadores es que podemos aplicarlos, por ejemplo, a nivel de clases.
A mí me ha resultado útil para eliminar la regla de: “utilice sobrecarga de funciones en lugar de parámetros opcionales”, ya que en los controladores de MVC, usar parámetros opcionales es la única opción viable.
Y después de mirar cada error y arreglarlo, nuestro código sin errores podría quedar tal que así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace Kastwey.PruebasSonarLint
{
	static class Program
	{
		static void Main()
		{
			try
			{
				string nombre, apellidos;
				nombre = "Juanjo";
				apellidos = "Montiel";
				if (nombre.Equals("juanjo", StringComparison.InvariantCultureIgnoreCase) && apellidos.Equals("montiel", StringComparison.InvariantCultureIgnoreCase))
				{
					WriteLine($"Nombre completo: {nombre} {apellidos}");
				}
			}
			catch (Exception ex)
			{
				WriteLine($"Error inesperado: {ex.Message}.");
			}
			ReadLine();
		}
		
	}
}

Y ya no me enrollo más. Probadla, que merece la pena, ¡y es gratis!

¡Que lo disfrutéis!

Entrada visitada 369 veces