Intellij IDEA 13: comment désactiver les commentaires et les chaînes de refactor?

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

J'essaye de refactoriser la variable de classe value, qui se produit en place. Cela signifie qu'aucune boîte de dialogue n'apparaît; J'appuie sur Entrée et il essaie de refactoriser l'ensemble du projet, y compris les commentaires et autres, y compris:

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

dans un fichier .jsp. C'est bien trop «intelligent» pour essayer de refactoriser les commentaires qui correspondent à l'ensemble du projet. Cela entraîne souvent de nombreux risques de bogues et la refactorisation dans un environnement Java n'est plus sûre.

La même chose se produisait dans Intellij 12. Sérieusement, je n'ai pas besoin qu'Intellij recommande quoi que ce soit qui est considéré comme dangereux, ou quand on n'est pas sûr que ce soit la même chose!

Je peux exclure les refactorisations mais je n'ai pas le temps d'évaluer cinq "suggestions" à chaque fois. Cela augmente simplement le risque d'erreur humaine: la plupart du temps, j'appuie simplement sur Entrée, et les choses sont remaniées.

Le refactoring est également un problème majeur dans un environnement Java lorsqu'il tente parfois de remplacer des éléments dans des fichiers .js. Sérieusement, cela doit cesser.

Sans la boîte de dialogue contextuelle, je ne peux pas décocher "chaînes de recherche". Même si cela était coché, Intellij ne devrait jamais inclure les suggestions par défaut, surtout quand il est en dehors du fichier actuel. Il peut également recommander de les refactoriser, mais ils doivent être exclus par défaut. Autrement dit, il devrait s'agir d'une fonctionnalité optionnelle, plutôt que de tout détruire par défaut.

Il s'agit d'un sérieux problème d'expérience utilisateur avec la refactorisation Intellij plus récente dite "intelligente". Lors de la refactorisation de fichiers JS, je ne veux pas rechercher dans les fichiers Java des commentaires ou des chaînes! Période! Et vice versa!

La sécurité passe avant tout! Les développeurs qui savent ce qu'ils font rechercheront eux-mêmes les chaînes si nécessaire. Dans un environnement de langage dynamique, cela rend Intellij impossible à utiliser, car fréquemment, et sans modèle clair, des refactorisations sont parfois effectuées, parfois cela change les choses à travers le projet et ainsi de suite.

Il devrait y avoir une option qui dit, "refactoriser uniquement par rapport à ce fichier ou lorsque 100% inféré!", En particulier pour les langages dynamiques! Pour les langages statiques, il ne devrait même pas essayer de rechercher des commentaires et des chaînes en dehors du fichier.

Je ne voulais pas le publier en public, mais j'ai soulevé ce problème il y a plus de 2 ans dans le bugtracker, mais personne n'y a prêté attention.

ÉDITER

Pour ceux d'entre vous qui pensent que je pourrais aller trop loin, j'ai juste essayé ceci:

Avec cette classe:

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

Et en ajoutant ceci à n'importe quelle classe Java, par exemple:

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

Lors de la refactorisation KV.valcomme avant, j'obtiens les recommandations suivantes, une entrée en cas de catastrophe et quelque chose que je dois évaluer et exclure une à la fois. Cela demande des efforts et est juste ennuyeux et risqué. C'est comme si quelqu'un hurlait, STOP! Et puis ooh, rien après une minute, de la frustration et un long essai de 1000 mots (ça).

entrez la description de l'image ici

Sérieusement, y a-t-il un moyen de désactiver ce genre de comportement à risque !? Et y a-t-il une raison pour laquelle cela est activé par défaut?

EDIT 20200706

La merde continue en 2020: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
la source
5
Intellij est plein de choses qui m'ont été imposées. Si Android supportait d'autres éditeurs, je passerais en un clin d'œil. Je me retrouve à me battre contre l'éditeur au lieu de passer du temps à coder. Je passe du temps ici à essayer de trouver un moyen d'éteindre les choses. La plupart du temps, ils ne recommandent pas de solutions. La plupart du temps, ils disent ... "POURQUOI DÉTESTEZ-VOUS CETTE FONCTIONNALITÉ?"
TatiOverflow le
1
À tout le moins, cette fonctionnalité devrait avoir une limite de longueur minimale - comme si je refactore une variable avec un nom commun à 3 lettres, il n'a aucun sens de rechercher et de remplacer cela dans les chaînes et les commentaires par défaut . Cette séquence de 3 lettres est extrêmement susceptible d'exister dans une chaîne aléatoire s'il s'agit d'un grand projet. Pouah.
Vicky Chijwani
1
C'est maintenant clair et simplement cassé. C'était le seul IDE qui avait du sens. Ne pas pouvoir désactiver ce terrible comportement par défaut fait d'IntelliJ un outil si terrible à utiliser, j'ai sans le savoir créé de terribles bogues apparemment sans rapport en renommant simplement des variables comme IntelliJ m'a appris à depuis des années ... J'oublie toujours que je peux ' Je ne fais plus confiance à son refactoring -.-
yeoman
1
Aujourd'hui, cela a changé le chemin d'un mappage Spring MVC POST parce que j'ai déplacé la classe vers un package différent (!!!!!!!)
yeoman
1
Oui, c'est l'une des pires caractéristiques d'intellij. Si je veux renommer une classe, je peux finir par casser tout le projet où ce nom de classe apparaît dans des chaînes. Donc , si vous renommez la classe Userpour MyUserqu'il renommera tout , y compris les fichiers de configuration, les étiquettes, les urls, les chemins dans les appels de repos cartographie ...
ACV

Réponses:

99

Lorsque vous appuyez Shift + F6 (Refactor Rename)deux fois, cela ouvre la boîte de dialogue et vous pouvez désactiver "Rechercher dans les commentaires et les chaînes"

Meo
la source
9
Pour être clair, cela active le raccourci pour "Refactor Rename" DEUX FOIS. Cela peut être une combinaison différente en fonction de votre keymapping.
Kris Erickson
4
Merci, j'ai vu que vous pouvez également désactiver le refactor en place, même si c'est bien, car cela semble toujours sûr. Le point principal de mon article était de souligner que la recherche de commentaires et de chaînes devrait être désactivée globalement. Cela n'a aucun sens qu'il essaie de modifier une valeur dans une variable dans une autre classe. Ce n'est pas intelligent. Il y a un problème lorsque l'intelligence ou l'IA suppose qu'en augmentant la probabilité d'être correcte, il est en quelque sorte autorisé à avoir une marge d'erreur. Je veux des refactorisations Java strictes, qui devraient inclure des fichiers XML à moins que le nom complet du package n'existe
mmm
1
Mais comme il se souvient des paramètres, je n'y vois aucun problème. Vous pouvez utiliser cette refactorisation du texte intégral ou non, en fonction de vos besoins.
Meo
3
Malheureusement, la case à cocher semble réapparaître de temps en temps. Quelqu'un connaît-il un paramètre qui désactivera cette option de manière permanente? Comme cela a été mentionné avant, IntelliJ est trop "intelligent" pour son propre bien ici ...
Erk
@Meo ça ne respecte pas ça partout. De nos jours, le refactoring de texte incode en ligne en javascript modifie les valeurs et les commentaires dans le code même pas dans la fonction.
mmm
8

Et y a-t-il une raison pour laquelle cela est activé par défaut?

Oui il y a. Les gens ont tendance à utiliser beaucoup trop de DSL, de modèles et d'injections de langage de nos jours. Dans le vieux Java, toutes ces choses existent principalement sous forme de chaînes. L'API Reflection représente également le nom de la méthode / classe sous forme de chaîne. Il n'est pas possible pour aucun IDE de les prendre en charge et de les reconnaître tous, il est donc préférable de vous fournir un filet de sécurité contre d'éventuelles erreurs de refactoring. Si vous avez une excellente couverture de test unitaire, vous êtes probablement en sécurité ici.

Quant aux commentaires, ils contiennent souvent des exemples de code. Ces morceaux de code deviennent rapidement obsolètes lors des renommage, il est donc utile lorsque l'EDI vous rappelle leur existence.

Ce contrôle, bien sûr, entraîne parfois des faux positifs. Cependant, si vous donnez à vos variables des noms explicites et descriptifs (je ne veux pas dire "var" ou "val"), il est peu probable que cela se produise. Ainsi, IDE vous pousse vers un meilleur style de code d'une certaine manière.

Si vous n'êtes toujours pas convaincu, suivez les conseils de @Meo et désactivez la recherche dans les chaînes et les commentaires.

Jk1
la source
9
Ouais, c'est une bonne suggestion. Mais comme je l'ai commenté sur le sien, il y a un problème lorsque l'intelligence ou l'IA suppose qu'en augmentant la probabilité d'être correct, il est en quelque sorte autorisé à avoir une marge d'erreur. Je veux des refactorisations java strictes, qui devraient inclure des fichiers XML à moins que le nom complet du package n'existe, et même dans ce cas, je veux être averti. Les résultats de la refactorisation ne doivent pas répertorier les commentaires et les chaînes en premier et doivent être exclus par défaut. Il est devenu moins convivial et nécessite ma concentration, ce qui me force à me pencher en avant et me fatigue les yeux.
mmm
2
C'est comme essayer de prendre un numéro de téléphone bondé. Pouvez-vous répéter ce numéro: 392314213343234295423442? Pour moi, c'est le même genre d'effort, et sûrement pour beaucoup d'autres. J'espère que les gars d'Intellij reprennent et nous donnent la possibilité de désactiver cela.
mmm
10
"Si vous avez une excellente couverture des tests unitaires, vous êtes probablement en sécurité ici" - ce n'est pas une excuse pour nous fournir une IDEA qui traite Java comme un langage dynamique. Si je voulais un langage dynamique, je coderais en Groovy. "Si vous donnez à vos variables des noms explicites et descriptifs (je ne veux pas dire" var "ou" val ")" - Le risque de collision existe cependant toujours. Donnez-nous simplement un mode / une option Java "Strict", comme Eclipse et Intellij offraient auparavant.
mmm
5
Un clic et j'effacerai le framework de Symfony. Nous devrions pouvoir «exclure par défaut».
Nicolas Zozol
3
Je viens juste de rencontrer ça aussi. Par défaut absolument dangereux et j'ai commis l'erreur de renommer des choses comme «valeur» plusieurs fois et de ne pas remarquer tout de suite les dégâts épiques que cela peut causer à un projet.
Jilles van Gurp