Intellij IDEA 13: как отключить комментарии и строки рефакторинга?

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

Я пытаюсь реорганизовать переменную класса value, что происходит на месте. Это означает, что диалоговое окно не появляется; Я нажимаю Enter, и он пытается выполнить рефакторинг всего проекта, включая комментарии и многое другое, в том числе:

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

в файле .jsp. Это слишком «умно», чтобы пытаться реорганизовать комментарии , соответствующие всему проекту. Это часто вызывает большой риск ошибок, и рефакторинг в среде Java больше не является безопасным.

То же самое происходило в Intellij 12. Серьезно, мне не нужно, чтобы Intellij рекомендовал что-либо, что считается небезопасным, или когда он не уверен, что это то же самое!

Я могу исключить рефакторинг, но у меня нет времени каждый раз оценивать пять «предложений». Это просто увеличивает вероятность человеческой ошибки: большую часть времени я просто нажимаю клавишу ввода, и что-то реорганизуется.

Рефакторинг также является серьезной проблемой в среде Java, когда он иногда пытается заменить что-то в файлах .js. Серьезно, это нужно прекратить.

Без всплывающего диалогового окна я не могу убрать галочку с «строки поиска». Даже если это было отмечено, Intellij никогда не должен включать предложения по умолчанию, особенно если они находятся за пределами текущего файла. Он также может рекомендовать их рефакторинг, но они должны быть исключены по умолчанию. То есть это должна быть функция согласия, а не уничтожать все по умолчанию.

Это серьезная проблема пользовательского опыта с недавним так называемым «умным» рефакторингом Intellij. При рефакторинге файлов JS я не хочу искать в файлах Java комментарии или строки! Период! Наоборот!

Безопасность превыше всего! Разработчики, которые знают, что делают, при необходимости сами будут искать строки. В динамической языковой среде это делает Intellij невозможным для использования, потому что часто и без какого-либо четкого шаблона иногда происходит рефакторинг, иногда он меняет вещи во всем проекте, а что-то нет.

Должна быть опция, которая гласит: «Рефакторинг только относительно этого файла или при 100% выводе!», Особенно для динамических языков! Для статических языков не следует даже пытаться искать комментарии и строки вне файла.

Я не собирался обнародовать это, но я поднял этот вопрос более двух лет назад в багтрекере, но никто не обратил на это внимания.

РЕДАКТИРОВАТЬ

Для тех из вас, кто думает, что я могу зайти слишком далеко, я просто попробовал следующее:

С этим классом:

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

И добавив это, например, к любому классу Java:

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

При рефакторинге, KV.valкак и раньше, я получаю следующие рекомендации: ENTER от катастрофы и кое-что, что я должен оценивать и исключать по одному. Это требует усилий, просто раздражает и рискованно. Как будто кто-то кричит: СТОП! А потом ох, ничего через минуту, разочарование и эссе из 1000 слов (это).

введите описание изображения здесь

Серьезно, есть ли способ предотвратить такое рискованное поведение !? И есть ли причина, по которой это включено по умолчанию ??

ИЗМЕНИТЬ 20200706

Дерьмо продолжается в 2020 году: https://youtrack.jetbrains.com/issue/IDEA-245370

ммм
источник
5
Intellij полон вещей, навязанных мне. Если бы Android поддерживал другие редакторы, я бы мгновенно переключился. Я борюсь с редактором вместо того, чтобы тратить время на кодирование. Я провожу здесь время, пытаясь найти способ выключить ситуацию. В большинстве случаев они не рекомендуют решений. В большинстве случаев они говорят ... "ПОЧЕМУ ВЫ НЕНАВИЖИТЕ ЭТУ ОСОБЕННОСТЬ?"
TatiOverflow
1
По крайней мере, эта функция должна иметь ограничение на минимальную длину - например, если я реорганизую переменную с общим трехбуквенным именем, нет смысла искать и заменять это в строках и комментариях по умолчанию . Эта трехбуквенная последовательность, скорее всего, будет существовать в случайной строке, если это большой проект. Тьфу.
Vicky Chijwani
1
Теперь он простой и просто сломанный. Раньше это была единственная IDE, которая имела смысл. Невозможность отключить это ужасное поведение по умолчанию делает IntelliJ таким ужасным инструментом для использования, я неосознанно создал ужасные, казалось бы, несвязанные ошибки, просто переименовав переменные, как IntelliJ учил меня годами ... Я все время забываю, что могу '' т доверять его рефакторинга вообще больше -.-
Yeoman
1
Сегодня он изменил путь отображение Spring MVC POST, потому что я переехал класс в другой пакет (!!!!!!!)
YEOMAN
1
Да, это одна из худших особенностей intellij. Если я захочу переименовать класс, я могу сломать весь проект, где это имя класса окажется в строках. Поэтому, если вы переименуете класс Userв MyUserнего, он переименует все, включая файлы конфигурации, метки, URL-адреса, пути в сопоставлении вызовов отдыха ...
ACV

Ответы:

99

При двойном нажатии Shift + F6 (Refactor Rename)открывается диалоговое окно, и вы можете отключить «Поиск в комментариях и строках»

Meo
источник
9
Чтобы было ясно, что активируется ярлык для «Refactor Rename» ДВАЖДЫ. Это может быть другая комбинация в зависимости от вашей раскладки клавиатуры.
Крис Эриксон
4
Спасибо, я видел, что вы также можете отключить внутренний рефакторинг, хотя это хорошо, потому что это всегда кажется безопасным. Суть моего поста заключалась в том, чтобы подчеркнуть, что поиск комментариев и строк должен быть отключен глобально. Нет смысла пытаться изменить значение переменной в другом классе. Это не умно. Возникает проблема, когда интеллект или ИИ предполагают, что, увеличивая вероятность своей верности, каким-то образом допускается допуск на ошибку. Мне нужен строгий рефакторинг java, который должен включать файлы XML, если не существует полного имени пакета
ммм
1
Но поскольку он запоминает настройки, я не вижу в этом проблем. Вы можете использовать этот полнотекстовый рефакторинг или нет, в зависимости от того, что вам нужно.
Meo
3
К сожалению, этот флажок время от времени появляется снова. Кто-нибудь знает настройку, которая отключит это навсегда? Как уже упоминалось ранее, IntelliJ здесь слишком "умный" для собственного блага ...
Эрк
@Meo это не везде уважают. В настоящее время встроенный рефакторинг текста incode в javascript изменяет значения и комментарии в коде даже не в функции.
ммм
8

И есть ли причина, по которой это включено по умолчанию ??

Да, есть. В наши дни люди склонны использовать слишком много DSL, шаблонов и языковых инъекций. В простой старой Java все эти вещи в основном существуют как строки. Reflection API также представляет имя метода / класса в виде строки. Ни одна среда IDE не может поддерживать и распознавать их все, поэтому лучше всего предоставить вам страховку от возможных ошибок рефакторинга. Однако, если у вас есть отличное покрытие модульными тестами, тогда вы, вероятно, здесь в безопасности.

Что касается комментариев, то они часто содержат образцы кода. Эти фрагменты кода быстро устаревают при переименовании, поэтому полезно, когда IDE напоминает вам об их существовании.

Эта проверка, конечно, иногда приводит к ложным срабатываниям. Однако, если вы даете своим переменным описательные и понятные имена (я имею в виду не «var» или «val»), это вряд ли произойдет. Итак, IDE каким-то образом подталкивает вас к лучшему стилю кода.

Если вы все еще не уверены, то следуйте совету @Meo и отключите поиск по строкам и комментариям.

Jk1
источник
9
Да, это хорошее предложение. Но, как я прокомментировал его, возникает проблема, когда интеллект или ИИ предполагают, что, увеличивая вероятность того, что он прав, он каким-то образом допускает погрешность. Мне нужен строгий рефакторинг java, который должен включать файлы XML, если не существует полного имени пакета, и даже в этом случае я хочу получить уведомление. В результатах рефакторинга сначала не должны быть перечислены комментарии и строки, и они должны быть исключены по умолчанию. Он стал менее удобным для пользователя и требует моего внимания, что заставляет меня наклоняться вперед и напрягает глаза.
mmm
2
Это похоже на попытку снять набитый телефонный номер. Вы можете повторить этот номер: 392314213343234295423442? Для меня это такое же усилие, как и для многих других. Я надеюсь, что ребята из Intellij поймут это и дадут нам возможность отключить это.
mmm
10
«Однако, если у вас есть отличное покрытие модульных тестов, тогда вы, вероятно, здесь в безопасности» - это не повод предоставить нам IDEA, которая рассматривает Java как динамический язык. Если бы мне нужен был динамический язык, я бы написал код на Groovy. «Если вы даете своим переменным описательные и понятные имена (я имею в виду не« var »или« val »)» - риск столкновения все же существует. Просто дайте нам "строгий" режим / параметр Java, как раньше предлагали Eclipse и Intellij.
mmm
5
Один неверный щелчок - и я сотру структуру Symfony. Мы должны иметь возможность «исключать по умолчанию».
Николас Зозол
3
Просто столкнулся с этим. Абсолютно опасный дефолт, и я совершил ошибку, переименовав пару раз такие вещи, как «значение», и сразу не заметил, какой эпический ущерб может нанести проекту.
Jilles van Gurp