Intellij IDEA 13: como desativo comentários de refatoração e 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;
    } 
}

Estou tentando refatorar a variável de classe value, o que acontece no lugar. Isso significa que nenhuma caixa de diálogo é exibida; Eu pressiono enter e ele tenta refatorar todo o projeto, incluindo comentários e o que não, incluindo:

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

em um arquivo .jsp. Isso é muito "inteligente" para tentar refatorar comentários que correspondam em todo o projeto. Isso geralmente causa muitos riscos de bug e a refatoração em um ambiente Java não é mais segura.

A mesma coisa estava ocorrendo no Intellij 12. Sério, eu não preciso do Intellij para recomendar nada que seja considerado inseguro, ou quando não tenho certeza se é a mesma coisa!

Posso excluir as refatorações, mas não tenho tempo para avaliar cinco "sugestões" todas as vezes. Isso apenas aumenta a chance de erro humano: na maioria das vezes eu apenas pressiono enter e, woops, as coisas são refeitas.

Refatorar também é um grande problema em um ambiente Java, quando às vezes tenta substituir coisas em arquivos .js. Sério, isso tem que parar.

Sem a caixa de diálogo pop-up, não consigo desmarcar "strings de pesquisa". Mesmo se isso estiver marcado, o Intellij nunca deve incluir as sugestões por padrão, especialmente quando estiver fora do arquivo atual. Ele pode recomendar refatorá-los também, mas eles devem ser excluídos por padrão. Ou seja, deve ser um recurso opcional, em vez de destruir tudo por padrão.

Este é um sério problema de experiência do usuário com a chamada refatoração "inteligente" do Intellij mais recente. Ao refatorar arquivos JS, não quero procurar comentários ou strings nos arquivos Java! Período! E vice versa!

A segurança está em primeiro lugar! Os desenvolvedores que sabem o que estão fazendo, eles próprios procurarão strings, se necessário. Em um ambiente de linguagem dinâmico, torna o Intellij impossível de usar, porque frequentemente, e sem nenhum padrão claro, às vezes as refatorações passam, às vezes muda as coisas no projeto e outras coisas.

Deve haver uma opção que diz, "refatorar apenas em relação a este arquivo ou quando 100% inferido!", Especialmente para linguagens dinâmicas! Para linguagens estáticas, não deve nem tentar procurar comentários e strings fora do arquivo.

Eu não queria colocá-lo em público, mas levantei esse problema há mais de 2 anos no bugtracker, mas ninguém prestou atenção.

EDITAR

Para aqueles de vocês que pensam que eu posso estar indo longe, eu apenas experimentei isto:

Com esta 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 adicionando isso a qualquer classe Java, por exemplo:

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

Ao refatorar KV.valcomo antes, recebo as seguintes recomendações, um ENTER do desastre e algo que tenho que avaliar e excluir um de cada vez. É preciso esforço e é apenas irritante e arriscado. É como se alguém gritasse, PARE! E então ooh, nada depois de um minuto, frustração e um ensaio de 1000 palavras (isso).

insira a descrição da imagem aqui

Sério, existe uma maneira de desabilitar esse tipo de comportamento de risco !? E há alguma razão para isso estar ativado por padrão ??

EDIT 20200706

A merda continua em 2020: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
fonte
5
Intellij está cheio de coisas que me foram impostas. Se o Android suportasse outros editores, eu trocaria em um piscar de olhos. Eu me pego lutando com o editor, em vez de perder tempo codificando. Passo um tempo aqui tentando encontrar uma maneira de desligar as coisas. Na maioria das vezes, eles não recomendam soluções. Na maioria das vezes eles estão dizendo ... "POR QUE VOCÊ ODEIA ESTE RECURSO?"
TatiOverflow
1
No mínimo, esse recurso deve ter um limite de comprimento mínimo - como se eu estivesse refatorando uma variável com um nome comum de 3 letras, não faz sentido pesquisar e substituir isso em strings e comentários por padrão . Essa sequência de 3 letras tem uma grande probabilidade de existir em uma string aleatória se for um projeto grande. Ugh.
Vicky Chijwani
1
Agora está claro e simplesmente quebrado. Costumava ser o único IDE que fazia sentido. Não ser capaz de desligar esse terrível comportamento padrão torna o IntelliJ uma ferramenta terrível de usar. Eu, sem saber, criei bugs terríveis aparentemente não relacionados simplesmente renomeando variáveis ​​como o IntelliJ me ensinou a fazer ao longo dos anos ... Sempre me esqueço de que posso ' não confie mais em sua refatoração -.-
yeoman
1
Hoje, ele mudou o caminho de um mapeamento do Spring MVC POST porque movi a classe para um pacote diferente (!!!!!!!)
yeoman
1
Sim, esta é uma das piores características do intellij. Se eu quiser renomear uma classe, posso acabar quebrando todo o projeto onde o nome da classe aparece em strings. Então, se você renomear a classe Userpara, MyUserela renomeará tudo, incluindo arquivos de configuração, rótulos, urls, caminhos no mapeamento de chamadas restantes ...
ACV

Respostas:

98

Quando você pressiona Shift + F6 (Refactor Rename)duas vezes, a caixa de diálogo é aberta e você pode desativar a opção "Pesquisar em comentários e strings"

Meo
fonte
9
Para ficar claro que é ativar o atalho para "Refatorar Renomear" DUAS VEZES. Pode ser uma combinação diferente dependendo do seu mapeamento de teclas.
Kris Erickson
4
Obrigado, vi que você pode desativar o refatorador local também, embora seja bom, porque sempre parece o mais seguro. O ponto principal da minha postagem foi destacar que a busca por comentários e strings deve ser desligada globalmente. Não faz sentido que ele tente alterar um valor em uma variável em outra classe. Não é inteligente. Há um problema quando a inteligência ou IA assume que, ao aumentar a probabilidade de estar correto, de alguma forma é permitido ter uma margem de erro. Eu quero refatorações java estritas, que devem incluir arquivos XML, a menos que o nome do pacote inteiro exista
mmm
1
Mas como ele lembra as configurações, não vejo problema nisso. Você pode usar essa refatoração de texto completo ou não, dependendo do que você precisa.
Meo
3
Infelizmente, a caixa de seleção parece reaparecer de vez em quando. Alguém conhece uma configuração que desligue isso permanentemente? Como foi mencionado antes, o IntelliJ é muito "inteligente" para o seu próprio bem aqui ...
Erk
@Meo não respeita isso em todos os lugares. Hoje em dia, a refatoração de texto embutida em javascript está modificando valores e comentários no código nem mesmo na função.
mmm
8

E há alguma razão para isso estar ativado por padrão ??

Sim existe. As pessoas tendem a usar muitas DSLs, modelos e injeções de linguagem hoje em dia. No antigo Java, todas essas coisas existem principalmente como Strings. A API de reflexão também representa o nome do método / classe como uma String. Não é possível para nenhum IDE suportar e reconhecer todos eles, então é melhor fornecer a você uma rede de segurança contra possíveis erros de refatoração. Porém, se você tiver uma excelente cobertura de teste de unidade, provavelmente está seguro aqui.

Quanto aos comentários, eles geralmente contêm exemplos de código. Esses fragmentos de código tornam-se obsoletos rapidamente durante as renomeações, por isso é útil quando o IDE lembra você de sua existência.

Essa verificação, é claro, às vezes resulta em falsos positivos. No entanto, se você estiver dando às suas variáveis ​​nomes descritivos e autoexplicativos (não quero dizer "var" ou "val"), é improvável que isso aconteça. Portanto, o IDE está empurrando você para um estilo de código melhor de alguma forma.

Se você ainda não está convencido, siga um conselho de @Meo e desative a busca em strings e comentários.

Jk1
fonte
9
Sim, é uma boa sugestão. Mas, como comentei nele, há um problema quando a inteligência ou IA assume que, aumentando a probabilidade de estar correto, de alguma forma é permitido ter uma margem de erro. Quero refatorações java estritas, que devem incluir arquivos XML, a menos que o nome do pacote inteiro exista e, mesmo assim, quero ser notificado. Os resultados da refatoração não devem listar comentários e strings primeiro e devem ser excluídos por padrão. Ele se tornou menos amigável e requer meu foco, o que me obriga a inclinar-me para frente e forçar meus olhos.
mmm
2
É como tentar anotar um número de telefone lotado. Você pode repetir este número: 392314213343234295423442? Para mim é o mesmo tipo de esforço, e certamente para muitos outros. Espero que os caras do Intellij atendam e nos dê a opção de desligar isso.
mmm
10
“Se você tem uma excelente cobertura de teste de unidade, então provavelmente está seguro aqui” - isso não é uma desculpa para nos fornecer uma IDÉIA que trata o Java como uma linguagem dinâmica. Se eu quisesse uma linguagem dinâmica, codificaria em Groovy. "Se você estiver dando às suas variáveis ​​nomes descritivos e autoexplicativos (não quero dizer" var "ou" val ")" - O risco de colisão ainda existe. Basta nos dar um modo / opção "Strict" de Java, como o Eclipse e o Intellij costumavam oferecer.
mmm
5
Um clique errado e apagarei o framework do Symfony. Devemos ser capazes de 'excluir por padrão'.
Nicolas Zozol
3
Apenas corri para isso também. Padrão absolutamente perigoso de se ter e cometi o erro de renomear coisas como 'valor' algumas vezes e não perceber imediatamente o dano épico que pode causar a um projeto.
Jilles van Gurp