इंटेलीज आईडीईए 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, जो जगह में होता है। इसका मतलब है कि कोई संवाद पॉप अप नहीं होता है; मैं एंटर दबाता हूं और यह पूरे प्रोजेक्ट में रिफ्लेक्टर करने की कोशिश करता है, जिसमें कमेंट्स भी शामिल हैं और इसमें क्या शामिल है:

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

.jsp फ़ाइल में। इस तरह से "चतुर" भी पूरे प्रोजेक्ट में मेल खाने वाली टिप्पणियों पर विचार करने की कोशिश करता है । यह अक्सर बहुत सारे जोखिम का कारण बनता है, और जावा वातावरण में रिफैक्टिंग करना अब सुरक्षित नहीं है।

Intellij 12 में वही बात हो रही थी। गंभीरता से, मुझे Intellij की ज़रूरत नहीं है कि वह ऐसी किसी भी चीज़ की सिफारिश करे, जिसे असुरक्षित माना जाता है, या जब यह सुनिश्चित नहीं होता कि यह वही बात है!

मैं रिफैक्टरिंग को बाहर कर सकता हूं लेकिन मेरे पास हर बार पांच "सुझावों" का मूल्यांकन करने का समय नहीं है। यह सिर्फ मानवीय त्रुटि का मौका उठाता है: ज्यादातर समय मैं सिर्फ एंटर दबाता हूं, और वूप्स चीजें रिफैक्ट हो जाती हैं।

जावा वातावरण में रिफैक्टरिंग भी एक प्रमुख मुद्दा है जब यह कभी-कभी .js फाइलों में चीजों को बदलने की कोशिश करता है। गंभीरता से, इसे रोकना होगा।

पॉपअप संवाद के बिना, मैं "खोज स्ट्रिंग्स" को अनटिक नहीं कर सकता। यहां तक ​​कि अगर उसे टिक किया गया था, तो इंटेलीज को कभी भी डिफ़ॉल्ट रूप से सुझावों को शामिल नहीं करना चाहिए , खासकर जब वह वर्तमान फ़ाइल के बाहर हो। यह उन्हें भी ठीक करने की सिफारिश कर सकता है, लेकिन उन्हें डिफ़ॉल्ट रूप से बाहर रखा जाना चाहिए। यही है, यह डिफ़ॉल्ट रूप से सब कुछ नष्ट करने के बजाय एक विकल्प होना चाहिए।

यह हाल ही में तथाकथित "स्मार्ट" इंटेलीज रिफैक्टिंग के साथ एक गंभीर उपयोगकर्ता अनुभव समस्या है। जब जेएस फ़ाइलों को फिर से भरना, मैं टिप्पणी या तार के लिए जावा फ़ाइलों की खोज नहीं करना चाहता! अवधि! और इसके विपरीत!

सुरक्षा पहले आती है! डेवलपर्स जो जानते हैं कि वे क्या कर रहे हैं, यदि आवश्यक हो तो वे स्वयं स्ट्रिंग्स की खोज करेंगे। एक गतिशील भाषा वातावरण में, यह इंटेलीज का उपयोग करना असंभव बनाता है, क्योंकि अक्सर, और बिना किसी स्पष्ट पैटर्न के, कभी-कभी रिफ्लेक्टरिंग से गुजरते हैं, कभी-कभी यह परियोजना के पार चीजों को बदल देता है और क्या नहीं।

एक विकल्प होना चाहिए जो कहता है, "इस फ़ाइल के सापेक्ष केवल रिफ्लेक्टर या जब 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;
    }
}

और उदाहरण के लिए किसी भी जावा वर्ग में इसे जोड़ना :

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

जब KV.valपहले की तरह रिफ्लेक्टरिंग करते हैं, तो मुझे निम्नलिखित सिफारिशें मिलती हैं, आपदा से एक एनआरई और कुछ का मूल्यांकन करना होगा और एक बार में एक को बाहर करना होगा। यह प्रयास करता है और सिर्फ कष्टप्रद और जोखिम भरा होता है। यह किसी को चिल्ला रहा है, बंद करो! और फिर ऊह, एक मिनट के बाद कुछ भी नहीं, हताशा और 1000 लंबे शब्द निबंध (यह)।

यहाँ छवि विवरण दर्ज करें

गंभीरता से, वहाँ इस तरह के जोखिम भरे व्यवहार को निष्क्रिय करने का एक तरीका है !? और क्या कोई कारण है कि यह डिफ़ॉल्ट रूप से है ??

EDIT 20200706

2020 में शिट जारी है: https://youtrack.jetbrains.com/issue/IDEA-245370


5
इंटेलीज मुझ पर मजबूर चीजों से भरा है। यदि एंड्रॉइड ने अन्य संपादकों का समर्थन किया है, तो मैं दिल की धड़कन में स्विच करूंगा। मैं खुद को समय कोडिंग खर्च करने के बजाय संपादक से लड़ता हुआ पाता हूं। मैं यहां समय बिताता हूं कि चीजों को बंद करने का तरीका ढूंढने की कोशिश कर रहा हूं। ज्यादातर बार, वे समाधान की सलाह नहीं देते हैं। ज्यादातर समय वे कह रहे हैं ... "आप इस सुविधा से क्यों नफरत करते हैं?"
TatiOverflow

1
बहुत कम से कम इस सुविधा की एक न्यूनतम लंबाई सीमा होनी चाहिए - जैसे कि अगर मैं एक सामान्य 3-अक्षर नाम के साथ एक चर को फिर से बना रहा हूं, तो यह डिफ़ॉल्ट रूप से स्ट्रिंग और टिप्पणियों में खोज और प्रतिस्थापित करने के लिए शून्य अर्थ देता है । यदि यह एक बड़ी परियोजना है, तो 3-अक्षर अनुक्रम एक यादृच्छिक स्ट्रिंग में मौजूद होने की संभावना है। ओह।
विक्की चिजवानी 21

1
यह अब सादा है और बस टूट गया है। यह एक आईडीई हुआ करता था जो समझ में आता था। इस भयानक डिफ़ॉल्ट व्यवहार को बंद करने में सक्षम नहीं होने के कारण IntelliJ उपयोग करने के लिए इतना भयानक उपकरण बनाता है, मैंने अनजाने में भयानक रूप से असंबंधित कीड़े बनाए हैं बस IntelliJ जैसे चर का नाम बदलकर मुझे वर्षों से संघर्ष किया है ... मैं भूल जाता हूं कि 'मैं' कर सकता हूं t अब सभी पर इसकी रीफैक्टरिंग पर भरोसा करें।
योमन

1
आज, यह एक वसंत MVC पोस्ट मानचित्रण के पथ बदल क्योंकि मैं एक अलग पैकेज के लिए कक्षा में ले जाया गया (!!!!!!!)
Yeoman

1
हां, यह इंटेलीज की सबसे खराब विशेषता में से एक है। अगर मैं एक वर्ग का नाम बदलना चाहता हूं तो मैं पूरी परियोजना को तोड़ सकता हूं जहां उस वर्ग का नाम तार में दिखाई देता है। इसलिए यदि आप क्लास Userको MyUserइसका नाम देते हैं तो कॉन्फिग फाइल्स, लेबल्स, यूआरएल, रेस्ट कॉलिंग मैपिंग सहित सभी चीजों का नाम बदल देगा ...
ACV

जवाबों:


99

जब आप Shift + F6 (Refactor Rename)दो बार दबाते हैं , तो यह संवाद खोलता है और आप "टिप्पणियों और स्ट्रिंग्स में खोज" को अक्षम कर सकते हैं


9
यह स्पष्ट करने के लिए कि "Refactor Rename" TWICE के शॉर्टकट को सक्रिय कर रहा है। यह आपके की-मैपिंग के आधार पर एक अलग संयोजन हो सकता है।
क्रिश एरिकसन

4
धन्यवाद, मैंने देखा कि आप निष्क्रिय रिफ्लेक्टर को भी अक्षम कर सकते हैं, हालांकि यह अच्छा है, क्योंकि वह हमेशा सुरक्षित की तरह महसूस करता है। मेरी पोस्ट का मुख्य बिंदु यह उजागर करना था कि टिप्पणियों और तारों की खोज को वैश्विक स्तर पर बंद कर दिया जाना चाहिए। इसका कोई मतलब नहीं है कि यह किसी अन्य वर्ग में एक चर में एक मूल्य को बदलने की कोशिश करता है। यह स्मार्ट नहीं है। एक समस्या है जब इंटेलिजेंस या एआई मानता है कि सही होने की संभावना को बढ़ाकर, इसे किसी तरह त्रुटि के एक मार्जिन की अनुमति है। मैं सख्त जावा रिफैक्टर चाहता हूं, जिसमें XML फाइलें शामिल होनी चाहिए जब तक कि पूरे पैकेज का नाम मौजूद न हो
mmm

1
लेकिन चूंकि यह सेटिंग्स को याद रखता है, इसलिए मुझे इसके साथ कोई समस्या नहीं है। आप उस पूर्ण पाठ रीफ़ैक्टरिंग का उपयोग कर सकते हैं या नहीं, इस पर निर्भर करता है कि आपको क्या चाहिए।
मेओ

3
दुर्भाग्य से, चेकबॉक्स अब और फिर प्रकट होता है। क्या किसी को ऐसी सेटिंग का पता है जो इसे स्थायी रूप से बंद कर देगा? जैसा कि पहले उल्लेख किया गया है IntelliJ अपने स्वयं के अच्छे के लिए यहां "स्मार्ट" है ...
Erk

@ यह हर जगह सम्मान नहीं करता है। आजकल इनलाइन, जावास्क्रिप्ट टेक्स्ट को इंस्क्रिप्ट में कोड में फ़ंक्शन में भी नहीं मान और टिप्पणियों को संशोधित कर रहा है।
एमएमएम

8

और क्या कोई कारण है कि यह डिफ़ॉल्ट रूप से है ??

हाँ वहाँ है। लोग इन दिनों बहुत से डीएसएल, टेम्प्लेट और भाषा इंजेक्शन का उपयोग करने की प्रवृत्ति रखते हैं। सादे पुराने जावा में ये सभी चीजें मुख्य रूप से स्ट्रिंग्स के रूप में मौजूद हैं। प्रतिबिंब एपीआई भी स्ट्रिंग के रूप में विधि / वर्ग नाम का प्रतिनिधित्व करता है। किसी भी आईडीई के लिए उन सभी का समर्थन करना और उन्हें पहचानना संभव नहीं है, इसलिए यह संभव है कि आप संभावित रिफ्लेक्टिंग गलतियों के खिलाफ सुरक्षा जाल प्रदान करें। यदि आपके पास एक उत्कृष्ट इकाई परीक्षण कवरेज है, हालांकि, तो आप शायद यहां सुरक्षित हैं।

टिप्पणियों के लिए, उनके पास अक्सर कोड नमूने होते हैं। ये कोड चंक नाम बदलने के दौरान जल्दी से अप्रचलित हो जाते हैं, इसलिए जब आईडीई आपको उनके अस्तित्व के बारे में याद दिलाता है तो यह मददगार होता है।

यह जाँच, निश्चित रूप से, कभी-कभी झूठी सकारात्मकता का परिणाम होती है। हालाँकि, यदि आप अपने चर वर्णनात्मक स्व-व्याख्यात्मक नाम दे रहे हैं (मेरा मतलब "var" या "val") नहीं है, तो ऐसा होने की संभावना नहीं है। इसलिए, IDE आपको किसी तरह बेहतर कोड शैली की ओर धकेल रहा है।

यदि आप अभी भी आश्वस्त नहीं हैं, तो @Meo द्वारा एक सलाह का पालन करें और स्ट्रिंग्स और टिप्पणियों में खोज को अक्षम करें।


9
हाँ, यह एक अच्छा सुझाव है। लेकिन जैसा कि मैंने उनकी टिप्पणी की थी, एक समस्या है जब खुफिया या एआई मानता है कि सही होने की संभावना को बढ़ाकर, इसे किसी भी तरह से त्रुटि के एक मार्जिन की अनुमति है। मैं सख्त जावा रिफैक्टरिंग चाहता हूं, जिसमें एक्सएमएल फाइलें शामिल होनी चाहिए जब तक कि पूरे पैकेज का नाम मौजूद न हो, और तब भी, मैं अधिसूचित होना चाहता हूं। रिफ्लेक्टर के परिणामों को पहले टिप्पणियों और तारों को सूचीबद्ध नहीं करना चाहिए और डिफ़ॉल्ट रूप से बाहर करना चाहिए। यह कम उपयोगकर्ता के अनुकूल हो गया है, और मुझे अपना ध्यान केंद्रित करने की आवश्यकता है जो मुझे आगे झुकने के लिए मजबूर करता है और मेरी आँखों को तनाव देता है।
mmm

2
यह एक crammed फोन नंबर को लेने की कोशिश करने जैसा है। क्या आप इस नंबर को दोहरा सकते हैं: 392314213343234295423442? मेरे लिए यह उसी तरह का प्रयास है, और निश्चित रूप से कई अन्य लोगों के लिए भी। मुझे उम्मीद है कि Intellij लोग उठाते हैं और हमें इसे बंद करने का विकल्प देते हैं।
एमएमएम

10
"यदि आपके पास एक उत्कृष्ट इकाई परीक्षण कवरेज है, हालांकि, तो आप शायद यहां सुरक्षित हैं" - यह एक ऐसा विचार नहीं है जो हमें एक आईडीईए प्रदान करता है जो जावा को एक गतिशील भाषा के रूप में मानता है। अगर मुझे एक गतिशील भाषा चाहिए तो मैं ग्रूवी में कोड करूंगा। "यदि आप अपने चर वर्णनात्मक स्व-व्याख्यात्मक नाम दे रहे हैं (मेरा मतलब" var "या" val "नहीं है)" - टक्कर का जोखिम अभी भी मौजूद है। बस हमें एक "स्ट्रिक्ट" जावा मोड / विकल्प दें, जैसे कि ग्रहण और Intellij की पेशकश करते थे।
mmm

5
एक मिसकॉल और मैं सिम्फनी के ढांचे को मिटा दूंगा। हमें 'डिफ़ॉल्ट रूप से बहिष्कृत' करने में सक्षम होना चाहिए।
निकोलस ज़ोज़ोल

3
बस इसी में भाग गया। करने के लिए बिल्कुल खतरनाक डिफ़ॉल्ट है और मैंने कुछ समय के लिए 'वैल्यू' जैसी चीजों का नाम बदलने की गलती की है और एक परियोजना को नुकसान पहुंचा सकने वाले महाकाव्य नुकसान को तुरंत नहीं देख सकता है।
जिल्स वैन गुरप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.