Intellij IDEA 13: bagaimana cara menonaktifkan komentar dan string refactor?

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

Saya mencoba untuk merefaktor variabel kelas value, yang terjadi di tempat. Itu berarti tidak ada dialog yang muncul; Saya menekan enter dan mencoba melakukan refactor di seluruh proyek, termasuk komentar dan apa yang tidak, termasuk:

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

dalam file .jsp. Itu terlalu "pintar" untuk mencoba mengubah komentar yang cocok di seluruh proyek. Hal ini sering kali menyebabkan banyak risiko bug, dan pemfaktoran ulang di lingkungan Java tidak lagi aman.

Hal yang sama terjadi di Intellij 12. Sungguh, saya tidak perlu Intellij merekomendasikan apa pun yang dianggap tidak aman, atau bila tidak yakin itu adalah hal yang sama!

Saya dapat mengecualikan pemfaktoran ulang tetapi saya tidak punya waktu untuk mengevaluasi lima "saran" setiap saat. Itu hanya meningkatkan kemungkinan kesalahan manusia: sebagian besar waktu saya hanya menekan enter, dan banyak hal yang difaktor ulang.

Refactoring juga merupakan masalah utama dalam lingkungan Java ketika terkadang mencoba mengganti sesuatu dalam file .js. Serius, ini harus dihentikan.

Tanpa dialog popup, saya tidak bisa menghapus centang "string pencarian". Meskipun sudah dicentang, Intellij tidak boleh menyertakan saran secara default, terutama bila itu berada di luar file saat ini. Ini dapat merekomendasikan untuk memfaktor ulang mereka juga, tetapi mereka harus dikecualikan secara default. Artinya, itu harus menjadi fitur keikutsertaan, daripada secara default menghancurkan semuanya.

Ini adalah masalah pengalaman pengguna yang serius dengan yang lebih baru yang disebut pemfaktoran ulang "pintar" Intellij. Saat melakukan refactoring file JS, saya tidak ingin mencari file Java untuk komentar atau string! Titik! Dan sebaliknya!

Keamanan adalah yang utama! Pengembang yang tahu apa yang mereka lakukan akan mencari string sendiri jika diperlukan. Dalam lingkungan bahasa yang dinamis, hal itu membuat Intellij tidak mungkin digunakan, karena seringkali, dan tanpa pola yang jelas, terkadang refactorings berjalan, terkadang hal itu mengubah banyak hal di seluruh proyek dan apa yang tidak.

Harus ada opsi yang mengatakan, "refactor hanya relatif terhadap file ini atau ketika 100% disimpulkan!", Terutama untuk bahasa dinamis! Untuk bahasa statis seharusnya tidak mencoba mencari komentar dan string di luar file.

Saya tidak bermaksud untuk mempublikasikannya, tetapi saya telah mengangkat masalah ini lebih dari 2 tahun yang lalu di bugtracker, tetapi tidak ada yang memperhatikan.

EDIT

Bagi Anda yang berpikir bahwa saya mungkin akan bertindak jauh, saya baru saja mencoba ini:

Dengan kelas ini:

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

Dan menambahkan ini ke kelas Java apa pun , misalnya:

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

Ketika melakukan refactoring KV.valseperti sebelumnya, saya mendapatkan rekomendasi berikut, ENTER dari bencana dan sesuatu yang harus saya evaluasi dan kecualikan satu per satu. Itu membutuhkan usaha dan hanya mengganggu dan berisiko. Ini seperti seseorang berteriak, BERHENTI! Dan kemudian ooh, tidak ada setelah satu menit, frustrasi dan esai 1000 kata panjang (ini).

masukkan deskripsi gambar di sini

Sungguh, apakah ada cara untuk menonaktifkan perilaku berisiko seperti ini !? Dan apakah ada alasan mengapa ini diaktifkan secara default ??

EDIT 20200706

Sial berlanjut di 2020: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
sumber
5
Intellij penuh dengan hal-hal yang dipaksakan padaku. Jika android mendukung editor lain, saya akan beralih dalam sekejap. Saya mendapati diri saya melawan editor, alih-alih menghabiskan waktu untuk membuat kode. Saya menghabiskan waktu di sini mencoba menemukan cara untuk mematikan segalanya. Seringkali, mereka tidak merekomendasikan solusi. Sering kali mereka berkata ... "KENAPA ANDA MEMBENCI FITUR INI?"
TatiOverflow
1
Setidaknya fitur ini harus memiliki batas panjang minimum - seperti jika saya memfaktorkan ulang variabel dengan nama 3 huruf yang umum, tidak masuk akal untuk mencari dan menggantinya dalam string dan komentar secara default . Urutan 3 huruf itu sangat mungkin ada dalam string acak jika itu adalah proyek besar. Ugh.
Vicky Chijwani
1
Sekarang sudah jelas dan rusak. Dulu ini adalah IDE yang masuk akal. Tidak dapat menonaktifkan perilaku default yang buruk ini membuat IntelliJ menjadi alat yang sangat buruk untuk digunakan, tanpa sadar saya telah membuat bug yang tampaknya tidak terkait dengan hanya mengganti nama variabel seperti yang IntelliJ pikirkan selama bertahun-tahun ... Saya terus lupa bahwa saya bisa ' tidak percaya refactoringnya sama sekali -.-
yeoman
1
Hari ini, itu mengubah jalur pemetaan MVC POST Musim Semi karena saya memindahkan kelas ke paket yang berbeda (!!!!!!!)
yeoman
1
Ya, ini adalah salah satu fitur terburuk dari intellij. Jika saya ingin mengganti nama kelas, saya dapat merusak seluruh proyek di mana nama kelas itu muncul di string. Jadi jika Anda mengganti nama kelas Usermenjadi MyUseritu akan mengganti nama semuanya termasuk file konfigurasi, label, url, jalur dalam pemetaan panggilan istirahat ...
ACV

Jawaban:

99

Saat Anda menekan Shift + F6 (Refactor Rename)dua kali, dialog akan terbuka dan Anda dapat menonaktifkan "Telusuri di komentar dan string"

Meo
sumber
9
Untuk lebih jelasnya yaitu mengaktifkan shortcut untuk "Refactor Rename" TWICE. Ini mungkin kombinasi yang berbeda tergantung pada keymapping Anda.
Kris Erickson
4
Terima kasih, saya melihat Anda juga dapat menonaktifkan refactor di tempat, meskipun bagus, karena itu selalu terasa aman. Poin utama dari posting saya adalah untuk menyoroti bahwa pencarian komentar dan string harus dimatikan secara global. Tidak masuk akal jika mencoba mengubah nilai dalam variabel di kelas lain. Itu tidak pintar. Ada masalah ketika intelijen atau AI mengasumsikan bahwa dengan meningkatkan kemungkinan untuk menjadi benar, entah bagaimana itu diizinkan untuk memiliki margin kesalahan. Saya ingin refactoring java yang ketat, yang harus menyertakan file XML kecuali seluruh nama paket ada
mmm
1
Tapi karena dia mengingat pengaturannya, saya tidak melihat ada masalah dengan itu. Anda dapat menggunakan pemfaktoran ulang teks lengkap itu atau tidak, tergantung pada apa yang Anda butuhkan.
Meo
3
Sayangnya, kotak centang tampaknya muncul kembali sekarang dan nanti. Adakah yang tahu tentang pengaturan yang akan mematikan ini secara permanen? Seperti yang telah disebutkan sebelumnya IntelliJ terlalu "pintar" untuk kebaikannya sendiri di sini ...
Erk
@Meo tidak menghormati itu di mana-mana. Saat ini refactoring teks inline dan incode dalam javascript memodifikasi nilai dan komentar dalam kode bahkan tidak dalam fungsinya.
mmm
8

Dan apakah ada alasan mengapa ini diaktifkan secara default ??

Ya ada. Orang-orang cenderung menggunakan terlalu banyak DSL, templat, dan suntikan bahasa akhir-akhir ini. Di Jawa lama biasa semua hal ini terutama ada sebagai String. API Refleksi juga mewakili metode / nama kelas sebagai String. IDE tidak mungkin mendukung dan mengenali semuanya, jadi sebaiknya berikan jaring pengaman kepada Anda dari kemungkinan kesalahan pemfaktoran ulang. Jika Anda memiliki cakupan pengujian unit yang sangat baik, Anda mungkin aman di sini.

Adapun komentar, sering kali berisi contoh kode. Potongan kode ini menjadi usang dengan cepat selama penggantian nama, jadi akan membantu jika IDE mengingatkan Anda tentang keberadaannya.

Pemeriksaan ini, tentu saja, terkadang menghasilkan positif palsu. Namun, jika Anda memberi nama variabel deskriptif penjelasan diri (maksud saya bukan "var" atau "val"), ini tidak mungkin terjadi. Jadi, IDE mendorong Anda menuju gaya kode yang lebih baik dalam beberapa cara.

Jika Anda masih belum yakin, ikuti saran oleh @Meo dan nonaktifkan pencarian di string dan komentar.

Jk1
sumber
9
Ya, itu saran yang bagus. Tapi seperti yang saya komentari, ada masalah ketika intelijen atau AI mengasumsikan bahwa dengan meningkatkan kemungkinan menjadi benar, entah bagaimana itu diizinkan untuk memiliki margin kesalahan. Saya ingin refactorings java yang ketat, yang harus menyertakan file XML kecuali seluruh nama paket ada, dan bahkan kemudian, saya ingin diberi tahu. Hasil refactor seharusnya tidak mencantumkan komentar dan string terlebih dahulu dan harus mengecualikan secara default. Ini menjadi kurang ramah pengguna, dan membutuhkan fokus saya yang memaksa saya untuk mencondongkan tubuh ke depan dan membuat mata saya tegang.
mmm
2
Ini seperti mencoba mencatat nomor telepon yang berdesakan. Dapatkah Anda mengulangi nomor ini: 392314213343234295423442? Bagi saya itu adalah jenis usaha yang sama, dan tentunya bagi banyak orang lainnya. Saya berharap orang-orang Intellij menerima dan memberi kami opsi untuk mematikan ini.
mmm
10
"Jika Anda memiliki cakupan pengujian unit yang sangat baik, Anda mungkin aman di sini" - itu bukan alasan untuk memberi kami IDEA yang memperlakukan Java sebagai bahasa dinamis. Jika saya menginginkan bahasa dinamis, saya akan membuat kode di Groovy. "Jika Anda memberi nama variabel deskriptif penjelasan diri (maksud saya bukan" var "atau" val ")" - Risiko tabrakan masih ada. Cukup beri kami mode / opsi Java "Ketat", seperti yang biasa ditawarkan Eclipse dan Intellij.
mmm
5
Satu kesalahan klik dan saya akan menghapus kerangka Symfony. Kami seharusnya dapat 'mengecualikan secara default'.
Nicolas Zozol
3
Baru saja mengalami ini juga. Default yang benar-benar berbahaya untuk dimiliki dan saya telah membuat kesalahan dengan mengganti nama hal-hal seperti 'nilai' beberapa kali dan tidak segera menyadari kerusakan epik yang dapat dilakukan pada suatu proyek.
Jilles van Gurp