Intellij IDEA 13: come disabilitare i commenti e le stringhe di refactoring?


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

Sto cercando di rifattorizzare la variabile di classe value, che avviene sul posto. Ciò significa che non viene visualizzata alcuna finestra di dialogo; Premo invio e prova a eseguire il refactoring dell'intero progetto, inclusi commenti e cosa no, tra cui:

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

in un file .jsp. Questo è troppo "intelligente" per provare a refactoring di commenti che corrispondono all'intero progetto. Questo spesso causa molti rischi di bug e il refactoring in un ambiente Java non è più sicuro.

La stessa cosa stava accadendo in Intellij 12. Seriamente, non ho bisogno che Intellij consigli qualcosa che è considerato non sicuro, o quando non è sicuro che sia la stessa cosa!

Posso escludere i refactoring ma non ho tempo per valutare ogni volta cinque "suggerimenti". Aumenta solo la possibilità di errore umano: la maggior parte delle volte premo semplicemente Invio e le cose woops vengono refactoring.

Il refactoring è anche un grosso problema in un ambiente Java quando a volte tenta di sostituire le cose nei file .js. Seriamente, questo deve finire.

Senza la finestra di dialogo popup, non posso deselezionare "stringhe di ricerca". Anche se fosse spuntato, Intellij non dovrebbe mai includere i suggerimenti per impostazione predefinita, specialmente quando è al di fuori del file corrente. Può consigliare anche il refactoring, ma dovrebbero essere esclusi per impostazione predefinita. Cioè, dovrebbe essere una funzione di attivazione, piuttosto che per impostazione predefinita distruggere tutto.

Questo è un grave problema di esperienza utente con il più recente refactoring Intellij "intelligente". Durante il refactoring dei file JS, non voglio cercare nei file Java commenti o stringhe! Periodo! E viceversa!

La sicurezza viene prima di tutto! Gli sviluppatori che sanno cosa stanno facendo cercheranno le stringhe se necessario. In un ambiente linguistico dinamico rende Intellij impossibile da usare, perché frequentemente, e senza uno schema chiaro, a volte passano i refactoring, a volte cambia le cose nel progetto e cosa no.

Dovrebbe esserci un'opzione che dice "refactoring solo relativo a questo file o quando dedotto al 100%!", Specialmente per i linguaggi dinamici! Per i linguaggi statici non dovrebbe nemmeno tentare di cercare commenti e stringhe all'esterno del file.

Non volevo renderlo pubblico, ma ho sollevato questo problema più di 2 anni fa nel bugtracker, ma nessuno ha prestato attenzione.

MODIFICARE

Per quelli di voi che pensano che potrei andare troppo lontano, ho appena provato questo:

Con questa classe:

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

E aggiungendolo a qualsiasi classe Java, ad esempio:

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

Quando eseguo KV.valil refactoring come prima, ottengo i seguenti consigli, un INVIO dal disastro e qualcosa che devo valutare ed escludere uno alla volta. Ci vuole impegno ed è solo fastidioso e rischioso. È come se qualcuno gridasse, STOP! E poi ooh, niente dopo un minuto, frustrazione e un saggio di 1000 parole lunghe (questo).

inserisci qui la descrizione dell'immagine

Sul serio, c'è un modo per disabilitare questo tipo di comportamento rischioso !? E c'è qualche motivo per cui questo è attivo per impostazione predefinita?

EDIT 20200706

La merda continua nel 2020: https://youtrack.jetbrains.com/issue/IDEA-245370


5
Intellij è pieno di cose che mi sono state imposte. Se Android supportasse altri editor, cambierei in un batter d'occhio. Mi ritrovo a combattere contro l'editor, invece di perdere tempo a scrivere codice. Trascorro del tempo qui cercando di trovare un modo per spegnere le cose. La maggior parte delle volte, non consigliano soluzioni. La maggior parte delle volte dicono ... "PERCHÉ ODI QUESTA CARATTERISTICA?"
TatiOverflow

1
Per lo meno questa funzione dovrebbe avere un limite di lunghezza minimo, ad esempio se sto rifattorizzando una variabile con un nome comune di 3 lettere, non ha alcun senso cercare e sostituire quella in stringhe e commenti per impostazione predefinita . Quella sequenza di 3 lettere è estremamente probabile che esista in una stringa casuale se si tratta di un grande progetto. Uffa.
Vicky Chijwani

1
Ora è semplice e semplicemente rotto. Era l'unico IDE che aveva senso. Non essere in grado di disattivare questo terribile comportamento predefinito rende IntelliJ uno strumento così terribile da usare, ho inconsapevolmente creato terribili bug apparentemente non correlati semplicemente rinominando variabili come IntelliJ mi ha insegnato negli anni ... Continuo a dimenticare che posso " Non mi fido più del suo refactoring -.-
yeoman

1
Oggi, ha cambiato il percorso di una mappatura POST Spring MVC perché ho spostato la classe in un pacchetto diverso (!!!!!!!)
yeoman

1
Sì, questa è una delle peggiori caratteristiche di intellij. Se voglio rinominare una classe, posso finire per rompere l'intero progetto in cui il nome della classe appare nelle stringhe. Quindi, se rinomini la classe Userin MyUseressa, rinominerai tutto, inclusi file di configurazione, etichette, URL, percorsi nella mappatura delle chiamate di riposo ...
ACV

Risposte:


99

Quando premi Shift + F6 (Refactor Rename)due volte, si apre la finestra di dialogo e puoi disabilitare "Cerca nei commenti e nelle stringhe"


9
Per essere chiari che sta attivando la scorciatoia per "Refactor Rename" DUE VOLTE. Potrebbe essere una combinazione diversa a seconda della mappatura dei tasti.
Kris Erickson

4
Grazie, ho visto che puoi disabilitare anche il refactor inplace, anche se è bello, perché sembra sempre sicuro. Il punto principale del mio post era evidenziare che la ricerca di commenti e stringhe dovrebbe essere disattivata a livello globale. Non ha senso tentare di alterare un valore in una variabile in un'altra classe. Non è intelligente. C'è un problema quando l'intelligenza o l'intelligenza artificiale presumono che aumentando la probabilità di essere corrette, in qualche modo è consentito avere un margine di errore. Voglio refactoring java rigorosi, che dovrebbero includere file XML a meno che non esista l'intero nome del pacchetto
mmm

1
Ma poiché ricorda le impostazioni, non vedo alcun problema con esso. È possibile utilizzare o meno il refactoring del testo completo, a seconda di ciò di cui si ha bisogno.
Meo

3
Sfortunatamente, la casella di controllo sembra riapparire di tanto in tanto. Qualcuno sa di un'impostazione che lo disattiverà in modo permanente? Come è stato accennato prima, IntelliJ è troppo "intelligente" per il suo bene qui ...
Erk

@Meo non lo rispetta ovunque. Al giorno d'oggi il refactoring del testo inline, incode in javascript sta modificando valori e commenti nel codice, nemmeno nella funzione.
mmm

8

E c'è qualche motivo per cui questo è attivo per impostazione predefinita?

Si C'è. Oggigiorno le persone tendono a utilizzare troppi DSL, modelli e iniezioni di lingue. Nel vecchio Java normale tutte queste cose esistono principalmente come stringhe. L'API Reflection rappresenta anche il nome del metodo / classe come String. Non è possibile per alcun IDE supportarli e riconoscerli tutti, quindi è meglio fornire una rete di sicurezza contro possibili errori di refactoring. Se hai un'eccellente copertura di unit test, allora probabilmente sei al sicuro qui.

Per quanto riguarda i commenti, spesso contengono esempi di codice. Questi blocchi di codice diventano rapidamente obsoleti durante le ridenominazioni, quindi è utile quando IDE ti ricorda della loro esistenza.

Questo controllo, ovviamente, a volte si traduce in falsi positivi. Tuttavia, se si danno alle variabili nomi autoesplicativi descrittivi (non intendo "var" o "val"), è improbabile che ciò accada. Quindi, IDE ti sta spingendo verso uno stile di codice migliore in qualche modo.

Se ancora non sei convinto, segui un consiglio di @Meo e disabilita la ricerca nelle stringhe e nei commenti.


9
Sì, è un buon suggerimento. Ma come ho commentato il suo, c'è un problema quando l'intelligenza o l'intelligenza artificiale presumono che aumentando la probabilità di essere corrette, in qualche modo è consentito avere un margine di errore. Voglio rigidi refactoring java, che dovrebbero includere file XML a meno che non esista l'intero nome del pacchetto, e anche in questo caso, voglio essere avvisato. I risultati del refactoring non dovrebbero prima elencare commenti e stringhe e dovrebbero essere esclusi per impostazione predefinita. È diventato meno facile da usare e richiede la mia concentrazione che mi costringe a piegarmi in avanti e affatica i miei occhi.
mmm

2
È come cercare di prendere un numero di telefono pieno. Puoi ripetere questo numero: 392314213343234295423442? Per me è lo stesso tipo di sforzo, e sicuramente per molti altri. Spero che i ragazzi di Intellij rispondano e ci diano la possibilità di disattivarlo.
mmm

10
"Se hai un'eccellente copertura di unit test, però, allora probabilmente sei al sicuro qui" - questa non è una scusa per fornirci un'IDEA che tratta Java come un linguaggio dinamico. Se volessi un linguaggio dinamico, codificherei in Groovy. "Se dai alle tue variabili nomi autoesplicativi descrittivi (non intendo" var "o" val ")" - Il rischio di collisione esiste comunque. Dacci solo una modalità / opzione Java "Strict", come Eclipse e Intellij offrivano.
mmm

5
Un clic sbagliato e cancellerò il framework di Symfony. Dovremmo essere in grado di "escludere per impostazione predefinita".
Nicolas Zozol

3
Mi sono imbattuto anche in questo. Assolutamente pericoloso default da avere e ho commesso l'errore di rinominare cose come "valore" un paio di volte e di non accorgermi subito del danno epico che può fare a un progetto.
Jilles van Gurp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.