java - online - pmd netbeans
El "por qué" detrás de las reglas de PMD (4)
Cada regla está en un conjunto de reglas PMD, que puede darle una pista del razonamiento detrás de la regla (si no se explica en detalle en la página del conjunto de reglas).
En el caso de AvoidInstantiatingObjectsInLoops, puede ser costoso crear una instancia de un objeto similar una y otra vez. Sin embargo, con frecuencia es necesario. En mi propio proyecto, he deshabilitado esta regla, ya que está marcando demasiados falsos positivos.
En el caso de OnlyOneReturn, tenga en cuenta que se encuentra en un conjunto de reglas llamado Controversial , que es un indicio de que estas reglas son discutibles y dependen del caso. También he desactivado todo este conjunto de reglas.
¿Hay un buen recurso que describa el "por qué" detrás de los conjuntos de reglas de PMD? El sitio de PMD tiene el "qué", lo que hace cada regla, pero no describe por qué PMD tiene esa regla y por qué ignorar esa regla puede causarle problemas en el mundo real. En particular, me interesa saber por qué PMD tiene las reglas AvoidInstantiatingObjectsInLoops y OnlyOneReturn (la primera parece necesaria si necesita crear un nuevo objeto correspondiente a cada objeto en una colección, la segunda parece ser una necesidad en muchos casos) devuelva un valor según algunos criterios), pero lo que realmente busco es un enlace que describe el "por qué" detrás de la mayoría de las reglas de PMD, ya que esto aparece con la frecuencia suficiente.
Para que quede claro, sé que puedo deshabilitarlos y cómo hacerlo, me pregunto por qué están allí en primer lugar. Lo siento si hay algo obvio que me perdí, pero hice una búsqueda en Google y TU búsqueda antes de publicar esto. También entiendo que estos problemas son a menudo una cuestión de "gusto"; lo que busco es cuál es el argumento a favor de las reglas y qué alternativas existen. Para dar un ejemplo concreto, ¿cómo se supone que debe implementar un objeto correspondiente a cada objeto en un bucle (que es una operación común en Java) sin crear una instancia de cada objeto en un bucle?
En cada caso, la regla puede ser una cuestión de circunstancias específicas o simplemente "gusto".
La creación de un objeto en un bucle debe evitarse si hay un gran número de iteraciones y la creación de instancias es costosa. Si puede mover el código fuera del bucle, evitará muchas instancias de objetos y, por lo tanto, mejorará el rendimiento. Dicho esto, esto no siempre es posible, y en algunos casos simplemente no importa el rendimiento general del código. En estos casos, hacer lo que sea más claro.
Para OnlyOneReturn, hay varias maneras de ver esto (con partidarios vehementes detrás de cada uno), pero básicamente todas se reducen a gusto.
Para su ejemplo, los proponentes de OnlyOneReturn quieren código como:
public int performAction(String input) {
int result;
if (input.equals("bob")) {
result = 1;
} else {
result = 2;
}
return result;
}
Más bien que:
public int performAction(String input) {
if (input.equals("bob")) {
return 1;
} else {
return 2;
}
}
Como puede ver, la claridad adicional de ReturnOnlyOnce se puede debatir.
También vea esta pregunta SO que se relaciona con la creación de instancias dentro de los bucles .
Este artículo, Una comparación de las herramientas de búsqueda de errores para Java ", de Nick Rutar, Christian Almazan y Jeff Foster, compara varios comprobadores de errores para Java ..." - Documentos y publicaciones de FindBugs . El PMD se ve bastante más detallado.
Anexo: Como sugieren los autores,
"todas las herramientas eligen diferencias entre generar falsos positivos y falsos negativos".
En particular, AvoidInstantiatingObjectsInLoops puede no ser un error en absoluto si esa es la intención. Se incluye para ayudar a evitar la creación de objetos innecesarios . Asimismo, OnlyOneReturn es sugerente en la naturaleza. Los retornos múltiples representan una forma de goto , a veces considerada dañina , pero razonablemente utilizada para mejorar la legibilidad.
Mi motivo favorito son las personas que ordenan el uso de tales herramientas sin entender la noción de falsos positivos.
Como se señaló aquí , las versiones más recientes de PMD admiten una personalización mejorada cuando se integran en el proceso de compilación.
Puede ver la página de inicio de PMD, las reglas se explican aquí en detalle y, a menudo, con un porqué. El sitio está estructurado para los grupos de reglas, aquí el enlace a las reglas básicas: http://pmd.sourceforge.net/rules/basic.html