Intellij IDEA 13: ¿cómo desactivo los comentarios y cadenas de refactorización?

89
public class KV<K, V> {
    public K key;
    public V value;
    public KV(K key, V value) {
        this.key = key;
        this.value = value;
    } 
}

Estoy tratando de refactorizar la variable de clase value, que sucede en su lugar. Eso significa que no aparece ningún diálogo; Presiono enter e intenta refactorizar en todo el proyecto, incluidos los comentarios y lo que no, incluidos:

<%--<link href="<c:url value="../core/core.css" />" />--%>

en un archivo .jsp. Eso es demasiado "inteligente" para intentar refactorizar comentarios que coincidan en todo el proyecto. Esto a menudo causa mucho riesgo de errores y la refactorización en un entorno Java ya no es segura.

Lo mismo estaba ocurriendo en Intellij 12. En serio, no necesito que Intellij recomiende nada que se considere inseguro, ¡o cuando no esté seguro de que sea lo mismo!

Puedo excluir las refactorizaciones pero no tengo tiempo para evaluar cinco "sugerencias" cada vez. Simplemente aumenta la posibilidad de error humano: la mayoría de las veces simplemente presiono enter, y las cosas se refactorizan.

La refactorización también es un problema importante en un entorno Java cuando a veces intenta reemplazar cosas en archivos .js. En serio, esto tiene que terminar.

Sin el cuadro de diálogo emergente, no puedo desmarcar "cadenas de búsqueda". Incluso si eso estuviera marcado, Intellij debería nunca incluir las sugerencias de forma predeterminada, especialmente cuando está fuera del archivo actual. También puede recomendar refactorizarlos, pero deberían excluirse de forma predeterminada. Es decir, debería ser una función opcional, en lugar de destruir todo por defecto.

Este es un problema serio de experiencia de usuario con la refactorización de Intellij más reciente llamada "inteligente". Al refactorizar archivos JS, no quiero buscar comentarios o cadenas en archivos Java. ¡Período! ¡Y viceversa!

¡La seguridad es lo primero! Los desarrolladores que saben lo que están haciendo buscarán cadenas ellos mismos si es necesario. En un entorno de lenguaje dinámico, hace que Intellij sea imposible de usar, porque con frecuencia, y sin un patrón claro, a veces se realizan refactorizaciones, a veces cambian las cosas a lo largo del proyecto y otras cosas.

Debería haber una opción que diga, "¡refactorizar solo en relación con este archivo o cuando se infiera al 100%!", ¡Especialmente para lenguajes dinámicos! Para los lenguajes estáticos, ni siquiera debería intentar buscar comentarios y cadenas fuera del archivo.

No era mi intención publicarlo, pero planteé este problema hace más de 2 años en el bugtracker, pero nadie prestó atención.

EDITAR

Para aquellos de ustedes que piensan que podría llegar demasiado lejos, acabo de probar esto:

Con esta clase:

public class KV<K, V> {
    public K key;
    public V val;
    public KV(K key, V val) {
        this.key = key;
        this.val = val;
    }
}

Y agregando esto a cualquier clase de Java, por ejemplo:

public class CoreConfig {
    String abc = "kv.val";
    String def = "somethingElse.val";
}

Al refactorizar KV.valcomo antes, obtengo las siguientes recomendaciones, un ENTRAR del desastre y algo que tengo que evaluar y excluir uno a la vez. Requiere esfuerzo y es molesto y arriesgado. Es como si alguien gritara: ¡ALTO! Y luego, ooh, nada después de un minuto, frustración y un ensayo de 1000 palabras (esto).

ingrese la descripción de la imagen aquí

En serio, ¿hay alguna manera de desactivar este tipo de comportamiento de riesgo? ¿Y hay alguna razón por la que esto esté activado de forma predeterminada?

EDITAR 20200706

La mierda continúa en 2020: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
fuente
5
Intellij está lleno de cosas que se me imponen. Si Android admitiera otros editores, cambiaría en un santiamén. Me encuentro luchando contra el editor, en lugar de perder tiempo codificando. Paso tiempo aquí tratando de encontrar una manera de apagar las cosas. La mayoría de las veces, no recomiendan soluciones. La mayoría de las veces están diciendo ... "¿POR QUÉ ODIAS ESTA FUNCIÓN?"
TatiOverflow
1
Como mínimo, esta función debería tener un límite de longitud mínimo, como si estuviera refactorizando una variable con un nombre común de 3 letras, no tiene sentido buscar y reemplazar eso en cadenas y comentarios por defecto . Es abrumadoramente probable que esa secuencia de 3 letras exista en una cadena aleatoria si se trata de un proyecto grande. Ugh.
Vicky Chijwani
1
Ahora está simple y simplemente roto. Solía ​​ser el único IDE que tenía sentido. No poder desactivar este terrible comportamiento predeterminado hace que IntelliJ sea una herramienta tan terrible de usar, sin saberlo, he creado terribles errores aparentemente no relacionados simplemente cambiando el nombre de variables como IntelliJ me ha enseñado durante años ... sigo olvidando que puedo ' No confíes más en su refactorización -.-
yeoman
1
Hoy, cambió la ruta de un mapeo de Spring MVC POST porque moví la clase a un paquete diferente (!!!!!!!)
yeoman
1
Sí, esta es una de las peores características de intellij. Si quiero cambiar el nombre de una clase, puedo terminar rompiendo todo el proyecto donde el nombre de esa clase aparece en cadenas. Así que si cambia el nombre de la clase Usera la MyUserque va a cambiar el nombre de todo, incluyendo los archivos de configuración, etiquetas, URLs, caminos en las llamadas de descanso mapeo ...
ACV

Respuestas:

99

Cuando presiona Shift + F6 (Refactor Rename)dos veces, se abre el cuadro de diálogo y puede deshabilitar "Buscar en comentarios y cadenas"

Meo
fuente
9
Que quede claro que está activando el atajo de "Refactor Rename" DOS VECES. Puede ser una combinación diferente dependiendo de su keymapping.
Kris Erickson
4
Gracias, vi que también puedes deshabilitar el refactor inplace, aunque es bueno, porque siempre se siente seguro. El punto principal de mi publicación fue resaltar que la búsqueda de comentarios y cadenas debe desactivarse globalmente. No tiene sentido que intente alterar un valor en una variable en otra clase. No es inteligente. Existe un problema cuando la inteligencia o la IA asume que al aumentar la probabilidad de ser correcto, de alguna manera se permite tener un margen de error. Quiero refactorizaciones estrictas de Java, que deberían incluir archivos XML a menos que exista el nombre completo del paquete
mmm
1
Pero como recuerda la configuración, no veo ningún problema con él. Puede usar esa refactorización de texto completo o no, dependiendo de lo que necesite.
Meo
3
Desafortunadamente, la casilla de verificación parece reaparecer de vez en cuando. ¿Alguien sabe de una configuración que desactivará esto permanentemente? Como se ha mencionado antes, IntelliJ es demasiado "inteligente" para su propio bien aquí ...
Erk
@Meo no respeta eso en todas partes. Hoy en día, la refactorización de texto en línea, en código en javascript es modificar valores y comentarios en el código ni siquiera en la función.
mmm
8

¿Y hay alguna razón por la que esto esté activado de forma predeterminada?

Sí hay. La gente tiende a usar demasiados DSL, plantillas e inyecciones de lenguaje en estos días. En Java simple y antiguo, todas estas cosas existen principalmente como cadenas. La API de Reflection también representa el nombre del método / clase como una cadena. No es posible que ningún IDE los admita y reconozca a todos, por lo que es mejor proporcionarle una red de seguridad contra posibles errores de refactorización. Sin embargo, si tiene una excelente cobertura de prueba unitaria, probablemente esté seguro aquí.

En cuanto a los comentarios, a menudo contienen ejemplos de código. Estos fragmentos de código se vuelven obsoletos rápidamente durante el cambio de nombre, por lo que es útil cuando el IDE le recuerda su existencia.

Esta verificación, por supuesto, a veces da como resultado falsos positivos. Sin embargo, si le está dando a sus variables nombres descriptivos que se expliquen por sí mismos (no quiero decir "var" o "val"), es poco probable que esto suceda. Entonces, IDE te está empujando hacia un mejor estilo de código de alguna manera.

Si aún no está convencido, siga un consejo de @Meo y desactive la búsqueda en cadenas y comentarios.

Jk1
fuente
9
Sí, es una buena sugerencia. Pero como comenté en el suyo, hay un problema cuando la inteligencia o la IA asume que al aumentar la probabilidad de ser correcto, de alguna manera se permite tener un margen de error. Quiero refactorizaciones estrictas de Java, que deberían incluir archivos XML a menos que exista el nombre completo del paquete, e incluso entonces, quiero ser notificado. Los resultados de la refactorización no deben enumerar los comentarios y las cadenas primero y deben excluirse de forma predeterminada. Se ha vuelto menos fácil de usar y requiere mi atención, lo que me obliga a inclinarme hacia adelante y fatiga mis ojos.
mmm
2
Es como intentar anotar un número de teléfono abarrotado. ¿Puede repetir este número: 392314213343234295423442? Para mí es el mismo esfuerzo, y seguramente para muchos otros. Espero que los chicos de Intellij se den cuenta y nos den la opción de apagar esto.
mmm
10
"Sin embargo, si tiene una excelente cobertura de pruebas unitarias, entonces probablemente esté seguro aquí", eso no es una excusa para brindarnos una IDEA que trate a Java como un lenguaje dinámico. Si quisiera un lenguaje dinámico, codificaría en Groovy. "Si le está dando a sus variables nombres descriptivos que se expliquen por sí mismos (no quiero decir" var "o" val ")", el riesgo de colisión aún existe. Solo danos un modo / opción de Java "estricto", como Eclipse e Intellij solían ofrecer.
mmm
5
Un mal clic y borraré el marco de Symfony. Deberíamos poder "excluir por defecto".
Nicolas Zozol
3
Me encontré con esto también. Absolutamente peligroso tener un valor predeterminado y cometí el error de cambiar el nombre de cosas como 'valor' un par de veces y no darme cuenta de inmediato del daño épico que puede causar a un proyecto.
Jilles van Gurp