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環境でのリファクタリングはもはや安全ではありません。

同じことがIntellij12でも発生していました。真剣に、安全でないと見なされるもの、または同じことが確実でない場合は、Intellijが推奨する必要はありません。

リファクタリングを除外することはできますが、毎回5つの「提案」を評価する時間がありません。それは人為的エラーの可能性を高めるだけです。ほとんどの場合、Enterキーを押すだけで、物事がリファクタリングされます。

リファクタリングは、Java環境で.jsファイル内のものを置き換えようとする場合の大きな問題でもあります。真剣に、これは停止する必要があります。

ポップアップダイアログがないと、「検索文字列」のチェックを外すことはできません。それがチェックされたとして、Intellijは、特に現在のファイルの外にある場合、デフォルトで提案を含めるべきでありませ。それらもリファクタリングすることをお勧めしますが、デフォルトでは除外する必要があります。つまり、デフォルトですべてを破壊するのではなく、オプトイン機能である必要があります。

これは、最近のいわゆる「スマート」Intellijリファクタリングでの深刻なユーザーエクスペリエンスの問題です。JSファイルをリファクタリングするとき、コメントや文字列をJavaファイルで検索したくありません。限目!およびその逆!

安全第一!自分が何をしているのかを知っている開発者は、必要に応じて自分で文字列を検索します。動的言語環境では、Intellijを使用できなくなります。これは、明確なパターンがない場合に頻繁にリファクタリングが行われることもあれば、プロジェクト全体で状況が変わることもあれば、そうでないこともあるためです。

特に動的言語の場合は、「このファイルに関連して、または100%推測されたときにのみリファクタリングしてください!」というオプションがあるはずです。静的言語の場合、ファイルの外部にあるコメントや文字列を検索しようとしないでください。

公開するつもりはありませんでしたが、2年以上前にバグトラッカーでこの問題を提起しましたが、誰も注意を払っていませんでした。

編集

私が遠くに行くかもしれないと思うあなたのそれらのために、私はちょうどこれを試しました:

このクラスの場合:

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と、一度に1つずつ評価して除外する必要があるものです。それは努力を要し、ただ迷惑で危険です。誰かが叫んでいるようなものです、やめて!そして、ああ、1分後に何も、欲求不満と1000の長い単語のエッセイ(これ)。

ここに画像の説明を入力してください

真剣に、この種の危険な行動を無効にする方法はありますか?そして、これがデフォルトでオンになっている理由はありますか?

20200706を編集

たわごとは2020年も続く:https//youtrack.jetbrains.com/issue/IDEA-245370


5
Intellijは私に強制されたものでいっぱいです。Androidが他のエディターをサポートしている場合は、ハートビートに切り替えます。コーディングに時間を費やす代わりに、編集者と戦っています。私はここで物事をオフにする方法を見つけるために時間を費やしています。ほとんどの場合、彼らは解決策を推奨していません。ほとんどの場合、彼らは...「なぜこの機能が嫌いなのですか?」と言っています。
tatiOverflow 2017

1
少なくとも、この機能には最小の長さ制限が必要です。たとえば、一般的な3文字の名前で変数をリファクタリングする場合、デフォルトで文字列やコメントでそれを検索して置き換えることは意味がありません。その3文字のシーケンスは、大規模なプロジェクトの場合、ランダムな文字列に存在する可能性が非常に高くなります。うーん。
Vicky Chijwani 2017

1
今ではわかりやすく、単純に壊れています。以前は、意味のあるIDEの1つでした。このひどいデフォルトの動作をオフにできないと、IntelliJはそのようなひどいツールとして使用できるようになります。私は、IntelliJが何年にもわたって教えてくれたように、変数の名前を変更するだけで、無意識のうちにひどい一見無関係なバグを作成しました...私はできることを忘れ続けています。 tはもうそのリファクタリングをまったく信頼していません-.-–
ヨーマン

1
今日、クラスを別のパッケージに移動したため、Spring MVC POSTマッピングのパスが変更されました(!!!!!!!)
yeoman19年

1
はい、これはintellijの最悪の機能の1つです。クラスの名前を変更したい場合、そのクラス名が文字列に表示されるプロジェクト全体を壊してしまう可能性があります。あなたはクラスの名前を変更している場合UserMyUserは、設定ファイル、ラベル、URLを、残りの通話マッピングのパス...を含むすべての名前を変更します
ACV

回答:


99

Shift + F6 (Refactor Rename)2回押すとダイアログが開き、「コメントと文字列で検索」を無効にできます


9
明確にするために、それは「リファクタリングの名前変更」のショートカットを2回アクティブにすることです。キーマッピングによっては、組み合わせが異なる場合があります。
クリスエリクソン2014年

4
おかげで、インプレースリファクタリングも無効にできることがわかりましたが、それは常に安全なもののように感じるので、それは素晴らしいことです。私の投稿の主なポイントは、コメントと文字列の検索をグローバルにオフにする必要があることを強調することでした。別のクラスの変数の値を変更しようとしても意味がありません。それは賢くない。インテリジェンスまたはAIが、正しい可能性を高めることによって、何らかの形で許容誤差を許容できると想定する場合、問題が発生します。パッケージ名全体が存在しない限り、XMLファイルを含める必要がある厳密なJavaリファクタリングが必要です
mmm 2014年

1
でも設定を覚えているので問題ないです。必要に応じて、そのフルテキストリファクタリングを使用することも使用しないこともできます。
meo 2014年

3
残念ながら、チェックボックスは時々再表示されるようです。これを永久にオフにする設定を知っている人はいますか?前に述べたように、IntelliJはここでそれ自体の利益のためにあまりにも「賢い」です...
Erk 2018

@Meoそれはどこでもそれを尊重していません。現在、JavaScriptでのインラインのインコードテキストリファクタリングは、関数内でさえもコード内の値とコメントを変更しています。
うーん

8

そして、これがデフォルトでオンになっている理由はありますか?

はいあります。最近、人々はあまりにも多くのDSL、テンプレート、言語インジェクションを使用する傾向があります。プレーンオールドJavaでは、これらすべてのものは主に文字列として存在します。Reflection APIは、メソッド/クラス名も文字列として表します。IDEがそれらすべてをサポートおよび認識することは不可能であるため、リファクタリングのミスの可能性に対するセーフティネットを提供することが最善です。ただし、優れた単体テストカバレッジがある場合は、おそらくここで安全です。

コメントに関しては、多くの場合、コードサンプルが含まれています。これらのコードチャンクは、名前の変更中にすぐに廃止されるため、IDEがそれらの存在を通知するときに役立ちます。

もちろん、このチェックの結果、誤検知が発生する場合があります。ただし、変数にわかりやすい名前を付けている場合(つまり、「var」や「val」ではない)、これが発生する可能性はほとんどありません。そのため、IDEは何らかの方法でより良いコードスタイルに向けてあなたを推し進めています。

それでも確信が持てない場合は、@ Meoのアドバイスに従い、文字列とコメントの検索を無効にしてください。


9
ええ、それは良い提案です。しかし、私が彼についてコメントしたように、インテリジェンスまたはAIが、正しい可能性を高めることによって、何らかの形で許容誤差が許容されると想定する場合、問題があります。厳密なJavaリファクタリングが必要です。パッケージ名全体が存在しない限り、XMLファイルを含める必要があります。それでも、通知を受け取りたいです。リファクタリングの結果は、最初にコメントと文字列をリストするべきではなく、デフォルトで除外する必要があります。それは使い勝手が悪くなり、私が前かがみになり、目を痛めることに集中する必要があります。
mmm 2014年

2
それは、詰め込まれた電話番号を削除しようとするようなものです。この番号を繰り返すことができますか:392314213343234295423442?私にとっては同じような努力であり、他の多くの人にとっても確かです。Intellijの人たちが拾い上げて、これをオフにするオプションを提供してくれることを願っています。
mmm 2014年

10
「ただし、優れた単体テストカバレッジがある場合は、おそらくここで安全です」-これは、Javaを動的言語として扱うIDEAを提供する言い訳にはなりません。動的言語が必要な場合は、Groovyでコーディングします。「変数にわかりやすい名前を付けている場合(「var」や「val」ではないことを意味します)」-ただし、衝突のリスクは依然として存在します。EclipseやIntellijが提供していたような「厳密な」Javaモード/オプションを教えてください。
mmm 2014年

5
ワンクリックでSymfonyのフレームワークを消去します。'デフォルトで除外する'ことができるはずです。
Nicolas Zozol 2014年

3
これにも出くわしました。絶対に危険なデフォルトがあり、「value」などの名前を数回変更して、プロジェクトに与える可能性のある壮大な損害にすぐに気付かないという間違いを犯しました。
Jilles van Gurp 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.