Intellij IDEA 13: jak wyłączyć komentarze i ciągi znaków refaktoryzacji?

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

Próbuję refaktoryzować zmienną klasy value, co dzieje się w miejscu. Oznacza to, że nie pojawia się żadne okno dialogowe; Wciskam Enter i próbuje refaktoryzować cały projekt, włączając komentarze, a co nie, w tym:

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

w pliku .jsp. Jest to zbyt „sprytne”, aby próbować refaktoryzować komentarze pasujące do całego projektu. Często powoduje to duże ryzyko błędów, a refaktoryzacja w środowisku Java nie jest już bezpieczna.

To samo działo się w Intellij 12. Poważnie, nie potrzebuję Intellij do rekomendowania czegokolwiek, co jest uważane za niebezpieczne lub gdy nie ma pewności, że jest to to samo!

Mogę wykluczyć refaktoryzacje, ale nie mam czasu na ocenę pięciu „sugestii” za każdym razem. Po prostu zwiększa ryzyko błędu ludzkiego: przez większość czasu po prostu wciskam enter i ups, wszystko jest refaktoryzowane.

Refaktoryzacja jest również poważnym problemem w środowisku Java, gdy czasami próbuje zastąpić elementy w plikach .js. Poważnie, to musi się skończyć.

Bez wyskakującego okienka nie mogę odznaczyć opcji „ciągi wyszukiwania”. Nawet jeśli jest zaznaczone, Intellij nigdy nie powinien domyślnie uwzględniać sugestii, zwłaszcza gdy znajduje się poza bieżącym plikiem. Może również zalecić ich refaktoryzację, ale powinny one być domyślnie wykluczone. Oznacza to, że powinna to być funkcja opt-in, a nie domyślnie wszystko niszczyć.

Jest to poważny problem z doświadczeniem użytkownika w przypadku nowszych tak zwanych „inteligentnych” refaktoryzacji Intellij. Podczas refaktoryzacji plików JS nie chcę przeszukiwać plików Java pod kątem komentarzy lub ciągów! Kropka! I wzajemnie!

Bezpieczeństwo jest najważniejsze! Programiści, którzy wiedzą, co robią, w razie potrzeby sami wyszukają łańcuchy. W dynamicznym środowisku językowym uniemożliwia korzystanie z Intellij, ponieważ często i bez wyraźnego wzorca czasami przechodzą refaktoryzacje, a czasami zmienia rzeczy w całym projekcie, a co nie.

Powinna istnieć opcja, która mówi: „refaktoryzuj tylko w odniesieniu do tego pliku lub gdy zostanie wyciągnięty w 100%!”, Szczególnie w przypadku języków dynamicznych! W przypadku języków statycznych nie powinien nawet próbować szukać komentarzy i łańcuchów poza plikiem.

Nie chciałem tego publicznie ujawnić, ale poruszyłem ten problem ponad 2 lata temu w bugtrackerze, ale nikt nie zwrócił na to uwagi.

EDYTOWAĆ

Dla tych z Was, którzy myślą, że mogę zajść daleko, właśnie wypróbowałem to:

W tej klasie:

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

I dodając to do dowolnej klasy Java, na przykład:

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

Podczas refaktoryzacji KV.valjak poprzednio otrzymuję następujące zalecenia, ENTER od katastrofy i coś, co muszę oceniać i wykluczać pojedynczo. Wymaga wysiłku, jest po prostu denerwujące i ryzykowne. To tak, jakby ktoś krzyczał: STOP! A potem ooh, nic po minucie, frustracja i 1000 słów eseju (to).

wprowadź opis obrazu tutaj

Poważnie, czy istnieje sposób na wyłączenie tego rodzaju ryzykownych zachowań !? I czy jest jakiś powód, dla którego to jest domyślnie włączone?

EDYCJA 20200706

Gówno trwa dalej w 2020 roku: https://youtrack.jetbrains.com/issue/IDEA-245370

mmm
źródło
5
Intellij jest pełen rzeczy narzuconych mi. Gdyby Android obsługiwał inne edytory, przełączałbym się w mgnieniu oka. Walczę z edytorem, zamiast spędzać czas na kodowaniu. Spędzam tu czas, próbując znaleźć sposób na wyłączenie rzeczy. W większości przypadków nie polecają rozwiązań. Przez większość czasu mówią ... „DLACZEGO NIENAWIDZISZ TEGO FUNKCJI?”
TatiOverflow
1
Przynajmniej ta funkcja powinna mieć minimalny limit długości - tak jak w przypadku refaktoryzacji zmiennej o wspólnej nazwie 3-literowej, domyślnie nie ma sensu wyszukiwać i zastępować ją w łańcuchach i komentarzach . Ta 3-literowa sekwencja z dużym prawdopodobieństwem istnieje w losowym łańcuchu, jeśli jest to duży projekt. Fuj.
Vicky Chijwani,
1
Jest teraz prosty i po prostu zepsuty. Kiedyś było to jedyne IDE, które miało sens. Brak możliwości wyłączenia tego okropnego domyślnego zachowania sprawia, że ​​IntelliJ jest tak okropnym narzędziem w użyciu, że nieświadomie stworzyłem okropne, pozornie niezwiązane ze sobą błędy, po prostu zmieniając nazwy zmiennych, takich jak IntelliJ, do których nauczył mnie przez lata ... Ciągle zapominam, że mogę '' w ogóle nie ufam jego refaktoryzacji -.-
yeoman
1
Dzisiaj zmieniłem ścieżkę mapowania Spring MVC POST, ponieważ przeniosłem klasę do innego pakietu (!!!!!!!)
yeoman
1
Tak, to jedna z najgorszych cech Intellij. Jeśli chcę zmienić nazwę klasy, mogę skończyć z zerwaniem całego projektu, w którym nazwa klasy pojawia się w ciągach. Więc jeśli zmienisz nazwę klasy Userna MyUserto, zmienisz nazwę wszystkiego, w tym plików konfiguracyjnych, etykiet, adresów URL, ścieżek w mapowaniu wywołań reszty ...
ACV

Odpowiedzi:

99

Po Shift + F6 (Refactor Rename)dwukrotnym naciśnięciu otwiera się okno dialogowe, w którym można wyłączyć opcję „Szukaj w komentarzach i ciągach znaków”

Meo
źródło
9
Aby było jasne, że jest to DWUKROTNE aktywowanie skrótu do „Zmień nazwę refaktoryzacji”. Może to być inna kombinacja, w zależności od układu klawiszy.
Kris Erickson
4
Dzięki, widziałem, że możesz również wyłączyć refaktor w miejscu, chociaż jest fajny, ponieważ zawsze wydaje się, że jest bezpieczny. Głównym celem mojego postu było podkreślenie, że wyszukiwanie komentarzy i ciągów znaków powinno być wyłączone globalnie. Nie ma sensu, że próbuje zmienić wartość w zmiennej w innej klasie. To nie jest mądre. Istnieje problem, gdy inteligencja lub sztuczna inteligencja zakłada, że ​​zwiększając prawdopodobieństwo bycia poprawnym, w jakiś sposób dopuszcza się margines błędu. Chcę ścisłych refaktoryzacji java, które powinny zawierać pliki XML, chyba że istnieje cała nazwa pakietu
mmm
1
Ale ponieważ pamięta ustawienia, nie widzę z tym problemu. Możesz użyć tego refaktoryzacji pełnego tekstu lub nie, w zależności od tego, czego potrzebujesz.
Meo
3
Niestety, pole wyboru wydaje się pojawiać od czasu do czasu. Czy ktoś wie o ustawieniu, które wyłączy to na stałe? Jak wspomniano wcześniej, IntelliJ jest tutaj zbyt „inteligentny” dla własnego dobra ...
Erk
@Meo nie wszędzie to szanuje. Obecnie refaktoryzacja tekstu inline, incode w javascript polega na modyfikowaniu wartości i komentarzy w kodzie, nawet w funkcji.
mmm
8

I czy jest jakiś powód, dla którego to jest domyślnie włączone?

Tak jest. Obecnie ludzie mają tendencję do używania zbyt wielu DSL, szablonów i zastrzyków językowych. W zwykłej starej Javie wszystkie te rzeczy istnieją głównie jako łańcuchy. Interfejs API odbicia reprezentuje również nazwę metody / klasy jako ciąg. Żadne IDE nie jest w stanie obsługiwać i rozpoznawać ich wszystkich, dlatego najlepiej jest zapewnić Ci siatkę bezpieczeństwa przed możliwymi błędami w refaktoryzacji. Jeśli jednak masz doskonałe pokrycie testów jednostkowych, prawdopodobnie jesteś tutaj bezpieczny.

Jeśli chodzi o komentarze, często zawierają próbki kodu. Te fragmenty kodu szybko stają się przestarzałe podczas zmiany nazwy, więc jest pomocne, gdy IDE przypomina o ich istnieniu.

Ta kontrola oczywiście czasami prowadzi do fałszywych alarmów. Jeśli jednak nadasz swoim zmiennym opisowe, nie wymagające wyjaśnienia nazwy (nie mam na myśli „var” czy „val”), jest to mało prawdopodobne. Tak więc, IDE w jakiś sposób popycha Cię w kierunku lepszego stylu kodu.

Jeśli nadal nie jesteś przekonany, skorzystaj z porady @Meo i wyłącz wyszukiwanie w ciągach znaków i komentarzach.

Jk1
źródło
9
Tak, to dobra sugestia. Ale jak to skomentowałem, pojawia się problem, gdy inteligencja lub sztuczna inteligencja zakłada, że ​​zwiększając prawdopodobieństwo bycia poprawnym, w jakiś sposób dopuszcza się margines błędu. Chcę ścisłych refaktoryzacji java, które powinny zawierać pliki XML, chyba że istnieje cała nazwa pakietu, a nawet wtedy chcę być powiadamiany. Wyniki refaktoryzacji nie powinny najpierw wymieniać komentarzy i ciągów i powinny być domyślnie wykluczane. Stał się mniej przyjazny dla użytkownika i wymaga skupienia, co zmusza mnie do pochylania się do przodu i męczy oczy.
mmm
2
To jak próba zapisania zapchanego numeru telefonu. Czy możesz powtórzyć ten numer: 392314213343234295423442? Dla mnie to ten sam rodzaj wysiłku i na pewno dla wielu innych. Mam nadzieję, że faceci z Intellij podchwycą i dadzą nam opcję wyłączenia tego.
mmm
10
„Jeśli jednak masz doskonałe pokrycie testów jednostkowych, prawdopodobnie jesteś tutaj bezpieczny” - to nie jest wymówka, aby przedstawić nam IDEA, która traktuje Javę jako język dynamiczny. Gdybym chciał dynamicznego języka, kodowałbym w Groovy. „Jeśli nadasz zmiennym opisowe nazwy, które nie wymagają wyjaśnienia (nie mam na myśli„ var ”czy„ val ”)” - ryzyko kolizji nadal istnieje. Po prostu daj nam "Ścisły" tryb / opcję Java, taką jak kiedyś Eclipse i Intellij.
mmm
5
Jedno błędne kliknięcie i wymażę framework Symfony. Powinniśmy mieć możliwość „domyślnego wykluczania”.
Nicolas Zozol,
3
Właśnie na to wpadłem. Absolutnie niebezpieczna opcja domyślna i popełniłem błąd, zmieniając kilka razy nazwy rzeczy takich jak `` wartość '' i nie zauważając od razu ogromnych szkód, które mogą wyrządzić projektowi.
Jilles van Gurp