Intellij IDEA 13: Wie deaktiviere ich Refactor-Kommentare und -Strings?

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

Ich versuche, die Klassenvariable zu überarbeiten value, was an Ort und Stelle geschieht. Das bedeutet, dass kein Dialogfeld angezeigt wird. Ich drücke die Eingabetaste und es wird versucht, das gesamte Projekt zu überarbeiten, einschließlich Kommentaren und was nicht, einschließlich:

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

in einer .jsp-Datei. Das ist viel zu "clever", um Kommentare zu überarbeiten , die über das gesamte Projekt hinweg übereinstimmen. Dies führt häufig zu einem hohen Fehlerrisiko, und das Refactoring in einer Java-Umgebung ist nicht mehr sicher.

Dasselbe geschah in Intellij 12. Im Ernst, ich brauche Intellij nicht, um etwas zu empfehlen, das als unsicher gilt, oder wenn es nicht sicher ist, ob es dasselbe ist!

Ich kann die Refactorings ausschließen, habe aber nicht jedes Mal Zeit, fünf "Vorschläge" zu bewerten. Es erhöht nur die Wahrscheinlichkeit menschlicher Fehler: Die meiste Zeit drücke ich einfach die Eingabetaste und woops Dinge werden überarbeitet.

Refactoring ist auch ein großes Problem in einer Java-Umgebung, wenn manchmal versucht wird, Dinge in .js-Dateien zu ersetzen. Im Ernst, das muss aufhören.

Ohne das Popup-Dialogfeld kann ich "Suchzeichenfolgen" nicht deaktivieren. Selbst wenn dies angekreuzt wurde, sollte Intellij die Vorschläge standardmäßig niemals einschließen, insbesondere wenn sie sich außerhalb der aktuellen Datei befinden. Es kann empfohlen werden, sie ebenfalls umzugestalten, sie sollten jedoch standardmäßig ausgeschlossen werden. Das heißt, es sollte eine Opt-In-Funktion sein, anstatt standardmäßig alles zu zerstören.

Dies ist ein ernstes Problem mit der Benutzererfahrung beim neueren sogenannten "intelligenten" Intellij-Refactoring. Beim Refactoring von JS-Dateien möchte ich Java-Dateien nicht nach Kommentaren oder Zeichenfolgen durchsuchen! Zeitraum! Und umgekehrt!

Sicherheit steht an erster Stelle! Entwickler, die wissen, was sie tun, suchen bei Bedarf selbst nach Zeichenfolgen. In einer dynamischen Sprachumgebung ist die Verwendung von Intellij unmöglich, da häufig und ohne klares Muster manchmal Refactorings durchgeführt werden, manchmal Änderungen im gesamten Projekt vorgenommen werden und was nicht.

Es sollte eine Option geben, die besagt: "Refactor nur relativ zu dieser Datei oder wenn 100% abgeleitet!", Insbesondere für dynamische Sprachen! Bei statischen Sprachen sollte nicht einmal versucht werden, nach Kommentaren und Zeichenfolgen außerhalb der Datei zu suchen.

Ich wollte es nicht öffentlich machen, aber ich habe dieses Problem vor über 2 Jahren im Bugtracker angesprochen, aber niemand hat darauf geachtet.

BEARBEITEN

Für diejenigen unter Ihnen, die denken, dass ich zu weit gehen könnte, habe ich dies einfach ausprobiert:

Mit dieser Klasse:

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

Und dies zu jeder Java-Klasse hinzufügen , zum Beispiel:

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

Beim Refactoring KV.valwie zuvor erhalte ich die folgenden Empfehlungen, eine EINGABE von einer Katastrophe und etwas, das ich einzeln bewerten und ausschließen muss. Es kostet Mühe und ist nur nervig und riskant. Es ist wie wenn jemand schreit, STOP! Und dann ooh, nichts nach einer Minute, Frustration und einem 1000-langen Wortaufsatz (dies).

Geben Sie hier die Bildbeschreibung ein

Im Ernst, gibt es eine Möglichkeit, diese Art von riskantem Verhalten zu deaktivieren? Und gibt es einen Grund, warum dies standardmäßig aktiviert ist?

EDIT 20200706

Die Scheiße geht 2020 weiter: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
quelle
5
Intellij ist voll von Dingen, die mir aufgezwungen werden. Wenn Android andere Editoren unterstützen würde, würde ich sofort wechseln. Ich kämpfe gegen den Editor, anstatt Zeit mit dem Codieren zu verbringen. Ich verbringe Zeit hier, um einen Weg zu finden, Dinge auszuschalten. Meistens empfehlen sie keine Lösungen. Meistens sagen sie ... "WARUM HASSEN SIE DIESE FUNKTION?"
TatiOverflow
1
Zumindest sollte diese Funktion eine Mindestlängenbeschränkung haben. Wenn ich beispielsweise eine Variable mit einem gemeinsamen Namen aus drei Buchstaben umgestalte, ist es sinnlos, diese standardmäßig in Zeichenfolgen und Kommentaren zu suchen und zu ersetzen . Diese 3-Buchstaben-Sequenz existiert mit überwältigender Wahrscheinlichkeit in einer zufälligen Zeichenfolge, wenn es sich um ein großes Projekt handelt. Pfui.
Vicky Chijwani
1
Es ist jetzt schlicht und einfach kaputt. Früher war es die einzige IDE, die Sinn machte. Wenn ich dieses schreckliche Standardverhalten nicht ausschalten kann, ist IntelliJ so ein schreckliches Werkzeug. Ich habe unwissentlich schreckliche, scheinbar nicht zusammenhängende Fehler verursacht, indem ich einfach Variablen umbenannt habe, wie es mir IntelliJ über Jahre beigebracht hat ... Ich vergesse immer wieder, dass ich es kann. ' t vertrauen seines Refactoring überhaupt nicht mehr -.-
Yeoman
1
Heute hat es den Pfad eines Spring MVC POST-Mappings geändert, weil ich die Klasse in ein anderes Paket verschoben habe (!!!!!!!)
yeoman
1
Ja, dies ist eines der schlimmsten Merkmale von Intellij. Wenn ich eine Klasse umbenennen möchte, kann dies dazu führen, dass das gesamte Projekt unterbrochen wird, in dem dieser Klassenname zufällig in Zeichenfolgen angezeigt wird. Also , wenn Sie die Klasse umbenennen , Userum MyUseres wird alles , einschließlich Konfigurationsdateien umbenennen, Etiketten, Urls, Wege in Ruhe Anrufe Mapping ...
ACV

Antworten:

98

Wenn Sie Shift + F6 (Refactor Rename)zweimal drücken , wird der Dialog geöffnet und Sie können "In Kommentaren und Zeichenfolgen suchen" deaktivieren.

Meo
quelle
9
Um klar zu sein, wird die Verknüpfung für "Refactor Rename" ZWEIMAL aktiviert. Abhängig von Ihrer Tastaturbelegung kann dies eine andere Kombination sein.
Kris Erickson
4
Danke, ich habe gesehen, dass Sie den Inplace-Refactor auch deaktivieren können, obwohl es schön ist, denn das fühlt sich immer wie der sichere an. Der Hauptpunkt meines Beitrags war hervorzuheben, dass die Suche nach Kommentaren und Zeichenfolgen global deaktiviert werden sollte. Es macht keinen Sinn, dass versucht wird, einen Wert in einer Variablen in einer anderen Klasse zu ändern. Es ist nicht klug. Es gibt ein Problem, wenn Intelligenz oder KI davon ausgehen, dass durch die Erhöhung der Wahrscheinlichkeit, korrekt zu sein, eine Fehlerquote auftreten kann. Ich möchte strenge Java-Refactorings, die XML-Dateien enthalten sollten, sofern nicht der gesamte Paketname vorhanden ist
mmm
1
Aber da es sich an die Einstellungen erinnert, sehe ich kein Problem damit. Sie können das Volltext-Refactoring verwenden oder nicht, je nachdem, was Sie benötigen.
Meo
3
Leider scheint das Kontrollkästchen ab und zu wieder zu erscheinen. Kennt jemand eine Einstellung, die dies dauerhaft ausschaltet? Wie bereits erwähnt, ist IntelliJ hier zu "schlau" für sein eigenes Wohl ...
Erk
@ Meo es respektiert das nicht überall. Heutzutage ändert das Inline-Refactoring von Incode-Text in Javascript Werte und Kommentare im Code, nicht einmal in der Funktion.
mmm
8

Und gibt es einen Grund, warum dies standardmäßig aktiviert ist?

Ja da ist. Heutzutage verwenden die Leute viel zu viele DSLs, Vorlagen und Sprachinjektionen. Im einfachen alten Java existieren all diese Dinge hauptsächlich als Strings. Die Reflection-API repräsentiert auch den Methoden- / Klassennamen als String. Es ist keiner IDE möglich, sie alle zu unterstützen und zu erkennen. Es ist daher am besten, Ihnen ein Sicherheitsnetz gegen mögliche Refactoring-Fehler zur Verfügung zu stellen. Wenn Sie jedoch eine hervorragende Abdeckung für Unit-Tests haben, sind Sie hier wahrscheinlich sicher.

Kommentare enthalten häufig Codebeispiele. Diese Codeblöcke werden beim Umbenennen schnell veraltet. Daher ist es hilfreich, wenn IDE Sie an ihre Existenz erinnert.

Diese Überprüfung führt natürlich manchmal zu Fehlalarmen. Wenn Sie Ihren Variablen jedoch beschreibende selbsterklärende Namen geben (ich meine nicht "var" oder "val"), ist dies unwahrscheinlich. IDE bringt Sie also in irgendeiner Weise zu einem besseren Codestil.

Wenn Sie immer noch nicht überzeugt sind, befolgen Sie die Anweisungen von @Meo und deaktivieren Sie die Suche in Zeichenfolgen und Kommentaren.

Jk1
quelle
9
Ja, das ist ein guter Vorschlag. Aber wie ich zu ihm gesagt habe, gibt es ein Problem, wenn Intelligenz oder KI davon ausgehen, dass durch die Erhöhung der Wahrscheinlichkeit, korrekt zu sein, eine Fehlerquote auftreten kann. Ich möchte strenge Java-Refactorings, die XML-Dateien enthalten sollten, sofern nicht der gesamte Paketname vorhanden ist, und selbst dann möchte ich benachrichtigt werden. Die Refactor-Ergebnisse sollten nicht zuerst Kommentare und Zeichenfolgen auflisten und standardmäßig ausschließen. Es ist weniger benutzerfreundlich geworden und erfordert meinen Fokus, der mich zwingt, mich nach vorne zu lehnen und meine Augen zu belasten.
mmm
2
Es ist, als würde man versuchen, eine überfüllte Telefonnummer zu notieren. Können Sie diese Nummer wiederholen: 392314213343234295423442? Für mich ist es die gleiche Anstrengung, und sicherlich für viele andere. Ich hoffe, die Intellij-Leute nehmen auf und geben uns die Möglichkeit, dies auszuschalten.
mmm
10
"Wenn Sie jedoch eine hervorragende Abdeckung für Komponententests haben, sind Sie hier wahrscheinlich sicher" - das ist keine Entschuldigung, um uns eine IDEE zu liefern, die Java als dynamische Sprache behandelt. Wenn ich eine dynamische Sprache wollte, würde ich in Groovy codieren. "Wenn Sie Ihren Variablen beschreibende selbsterklärende Namen geben (ich meine nicht" var "oder" val ")" - Das Kollisionsrisiko besteht jedoch weiterhin. Geben Sie uns einfach einen "strengen" Java-Modus / eine "strenge" Java-Option, wie sie Eclipse und Intellij angeboten haben.
mmm
5
Ein Fehlklick und ich werde das Symfony-Framework löschen. Wir sollten in der Lage sein, "standardmäßig auszuschließen".
Nicolas Zozol
3
Bin auch darauf gestoßen. Absolut gefährlicher Standard, und ich habe den Fehler gemacht, Dinge wie "Wert" ein paar Mal umzubenennen und den epischen Schaden, der einem Projekt zufügen kann, nicht sofort zu bemerken.
Jilles van Gurp