# CheckStyle
## Que es CheckStyle?
Es una herramienta de desarrollo que permite a un equipo escribir código Java para que se adhiera a un estándar de codificación (Linter). Automatiza el proceso de comprobación de código Java.
### Ventajas
* Si no existe alguna regla se puede crear una custom con codigo
* Checkstyle es altamente configurable y se puede hacer para apoyar casi cualquier estándar de codificación. De tal manera que se puedan suministrar diferentes estándares de código para su posterior comprobación mediante la herramienta.
* No hay que esperar a realizar un PR para ser notificado del incumplimiento de alguna regla. por ej con algun plugin o extencion instalado en el editor de codigo o IDE, o en un proyecto Gradle corriendo `./gradle checkformat` (o el nombre que se puso a esa tarea)
* Se enfoca específicamente en el cumplimiento de las normas de codificación, lo que lo hace ideal para proyectos en los que se requiere un alto nivel de coherencia en el estilo de codificación.
* Tiene una gran comunidad de usuarios y desarrolladores, lo que significa que hay una amplia gama de recursos y soporte disponibles.
### Desventajas
* la configuración puede ser compleja, especialmente para proyectos más grandes con muchas reglas personalizadas. Además, cada proyecto requiere su propio archivo de configuración.
# Comparativa con SonarQube
### Ventajas respecto a SonarQube
* Checkstyle es fácil de configurar y personalizar para cumplir con los estándares de codificación específicos de cada proyecto, mientras que SonarQube requiere una mayor configuración para lograr los mismos objetivos.
### Desventajas respecto a SonarQube
* Checkstyle no tiene la capacidad de encontrar errores de código complejos, como lo hace SonarQube.
* Checkstyle no proporciona una evaluación de la duplicación de código, como lo hace SonarQube.
* Checkstyle puede ser demasiado restrictivo y dificultar el desarrollo rápido y ágil.
* Checkstyle tiene la facilidad de crear reglas aunque es muy posible que la mayoria de las reglas no puedan ser configuradas por este.
* Checkstyle no proporciona una evaluación de la complejidad del código, como lo hace SonarQube.
* Checkstyle o tiene la capacidad de proporcionar informes de calidad de código personalizados, como lo hace SonarQube.
* Checkstyle no tiene la capacidad de detectar problemas de seguridad en el código, como lo hace SonarQube.
* Requiere una configuración manual en cada proyecto, mientras que SonarQube puede configurarse para aplicarse automáticamente a todos los proyectos.
* Aunque existen plugins para algunos IDEs populares, la integración no siempre es perfecta y los usuarios pueden tener dificultades para configurar los plugins.
# Demo
Ejecutar la tarea, en este caso la C017 (evadir el uso de imports con *) estará saltando incumplimiento
### Configuración
```Gradle=
plugins {
id 'checkstyle'
}
dependencies {
checkstyle 'com.puppycrawl.tools:checkstyle:10.8.1'
}
checkstyle {
toolVersion = '10.8.1'
config = rootProject.resources.text.fromFile('checkstyle.xml')
}
task checkformat(type: Checkstyle) {
group = 'verification'
description = 'Runs Checkstyle on the main source set'
source 'domain', 'applications'
include '**/*.java'
exclude '**/gen/**'
classpath = configurations.checkstyle
}
```
# Conclusiones
CheckStyle es una buena opcion para asegurar rapidamente y sin complicaciones reglas de estilos para los proyectos, sin embargo hay que tenerlo junto a sonar, mas no hacer una migracion hacia checkstyle.
Los unicos contras de su implementacion es que hay que configurarlo en cada proyecto, asegurar que todos los proyectos tengan exactamente el mismo checkstyle.xml y a demas de tambien configurarlo en cada pipeline.
Estos contras podrían evadirse "aparentemente" gracias al primer link de interés de este documento el cual permite meter el checkstyle dentro de sonar, lo cual hará el proceso de generalizacion para todos los repos absurdamente mas facil.
# Links de interés
[CheckStyle en SonarQube](https://github.com/checkstyle/sonar-checkstyle)
[CheckStyle con Gradle](https://docs.gradle.org/current/userguide/checkstyle_plugin.html)
[CheckStyle con Maven](https://maven.apache.org/plugins/maven-checkstyle-plugin/usage.html)
[Reglas](https://checkstyle.sourceforge.io/config_javadoc.html)