Intellij IDEA 13: ฉันจะปิดใช้งานความคิดเห็นและสตริงของ 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;
    } 
}

ฉันกำลังพยายาม refactor ตัวแปรคลาสvalueซึ่งเกิดขึ้นในสถานที่ นั่นหมายความว่าไม่มีกล่องโต้ตอบปรากฏขึ้น ฉันกด Enter และมันพยายามที่จะ refactor ในโครงการทั้งหมดรวมถึงความคิดเห็นและสิ่งที่ไม่รวมถึง:

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

ในไฟล์. jsp นั่นเป็นวิธีที่ "ฉลาด" เกินไปที่จะพยายามปรับเปลี่ยนความคิดเห็นที่ตรงกันทั่วทั้งโครงการ ซึ่งมักก่อให้เกิดความเสี่ยงต่อข้อผิดพลาดมากมายและการปรับโครงสร้างใหม่ในสภาพแวดล้อม Java จะไม่ปลอดภัยอีกต่อไป

สิ่งเดียวกันนี้เกิดขึ้นใน Intellij 12 อย่างจริงจังฉันไม่ต้องการให้ Intellij แนะนำสิ่งที่คิดว่าไม่ปลอดภัยหรือเมื่อไม่แน่ใจว่าเป็นสิ่งเดียวกัน!

ฉันสามารถยกเว้นการปรับโครงสร้างใหม่ได้ แต่ฉันไม่มีเวลาประเมิน "คำแนะนำ" ห้าข้อทุกครั้ง มันเพิ่มโอกาสที่จะเกิดความผิดพลาดของมนุษย์โดยส่วนใหญ่แล้วฉันแค่กด Enter และสิ่งต่างๆจะถูกปรับโครงสร้างใหม่

การปรับโครงสร้างใหม่ยังเป็นปัญหาหลักในสภาพแวดล้อม Java เมื่อบางครั้งพยายามแทนที่สิ่งต่างๆในไฟล์. js อย่างจริงจังนี้ต้องหยุด

หากไม่มีกล่องโต้ตอบป๊อปอัปฉันจะไม่สามารถยกเลิกการเลือก "สตริงการค้นหา" ได้ แม้ว่าจะมีการทำเครื่องหมายไว้แล้วก็ตาม Intellij ไม่ควรรวมคำแนะนำไว้โดยค่าเริ่มต้นโดยเฉพาะอย่างยิ่งเมื่ออยู่นอกไฟล์ปัจจุบัน สามารถแนะนำให้ refactor พวกเขาได้เช่นกัน แต่ควรถูกยกเว้นโดยค่าเริ่มต้น นั่นคือควรเป็นคุณลักษณะที่เลือกใช้แทนที่จะทำลายทุกอย่างโดยค่าเริ่มต้น

นี่เป็นปัญหาร้ายแรงของประสบการณ์การใช้งานของผู้ใช้ที่เรียกว่าการปรับโครงสร้าง Intellij "อัจฉริยะ" ล่าสุด เมื่อปรับโครงสร้างไฟล์ JS ใหม่ฉันไม่ต้องการค้นหาไฟล์ Java สำหรับความคิดเห็นหรือสตริง! งวด! และในทางกลับกัน!

ความปลอดภัยมาก่อน! นักพัฒนาที่รู้ว่ากำลังทำอะไรอยู่จะค้นหาสตริงด้วยตนเองหากจำเป็น ในสภาพแวดล้อมของภาษาแบบไดนามิกทำให้ Intellij ไม่สามารถใช้งานได้เนื่องจากบ่อยครั้งและไม่มีรูปแบบที่ชัดเจนบางครั้งการปรับโครงสร้างใหม่ก็ผ่านไปบางครั้งการเปลี่ยนแปลงในโครงการและสิ่งที่ไม่เป็นเช่นนั้น

ควรมีตัวเลือกที่ระบุว่า "refactor only ที่สัมพันธ์กับไฟล์นี้หรือเมื่ออนุมาน 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เหมือนเดิมฉันได้รับคำแนะนำต่อไปนี้การเข้าสู่จากภัยพิบัติและสิ่งที่ฉันต้องประเมินและแยกออกทีละรายการ ต้องใช้ความพยายามและน่ารำคาญและมีความเสี่ยง เหมือนมีคนตะโกนว่า STOP! หลังจากนั้นไม่กี่นาทีความหงุดหงิดและเรียงความยาว 1,000 คำ (นี้)

ป้อนคำอธิบายภาพที่นี่

อย่างจริงจังมีวิธีปิดพฤติกรรมเสี่ยงแบบนี้ไหม!? และมีเหตุผลใดบ้างที่ทำไมถึงเปิดใช้งานโดยปริยาย ??

แก้ไข 20200706

อึยังคงดำเนินต่อไปในปี 2020: https://youtrack.jetbrains.com/issue/IDEA-245370


5
Intellij เต็มไปด้วยสิ่งที่บังคับให้ฉัน ถ้า Android รองรับโปรแกรมแก้ไขอื่น ๆ ฉันจะเปลี่ยนเป็น heartbeat ฉันพบว่าตัวเองกำลังต่อสู้กับบรรณาธิการแทนที่จะใช้เวลาเขียนโค้ด ฉันใช้เวลาที่นี่เพื่อพยายามหาทางปิดสิ่งต่างๆ ส่วนใหญ่ไม่แนะนำวิธีแก้ปัญหา บ่อยครั้งที่พวกเขาพูดว่า ... "ทำไมคุณถึงเกลียดคุณสมบัตินี้?"
TatiOverflow

1
อย่างน้อยที่สุดคุณลักษณะนี้ควรมีขีดจำกัดความยาวขั้นต่ำเช่นถ้าฉันปรับโครงสร้างตัวแปรด้วยชื่อ 3 ตัวอักษรทั่วไปการค้นหาและแทนที่ในสตริงและความคิดเห็นตามค่าเริ่มต้นจะไม่มีเหตุผล ลำดับ 3 ตัวอักษรนั้นมีแนวโน้มที่จะมีอยู่ในสตริงแบบสุ่มอย่างท่วมท้นหากเป็นโครงการขนาดใหญ่ ฮึ.
Vicky Chijwani

1
ตอนนี้มันธรรมดาและพังง่าย เคยเป็น IDE หนึ่งเดียวที่เข้าท่า การไม่สามารถปิดพฤติกรรมเริ่มต้นที่น่ากลัวนี้ได้ทำให้ IntelliJ เป็นเครื่องมือที่แย่มากที่จะใช้ฉันได้สร้างจุดบกพร่องที่ดูเหมือนจะไม่เกี่ยวข้องโดยไม่รู้ตัวโดยการเปลี่ยนชื่อตัวแปรเช่น IntelliJ ทำให้ฉันใช้เวลาหลายปี ... ฉันลืมไปว่าฉันทำได้ ' เสื้อไว้วางใจ refactoring ของมันที่ทุกคนอีกต่อไป -.-
องค์รักษ์

1
วันนี้มันเปลี่ยนเส้นทางการทำแผนที่ฤดูใบไม้ผลิ MVC POST เพราะผมย้ายชั้นเรียนเพื่อเป็นแพคเกจที่แตกต่างกัน (!!!!!!!)
องค์รักษ์

1
ใช่นี่เป็นหนึ่งในคุณสมบัติที่แย่ที่สุดของ intellij ถ้าฉันต้องการเปลี่ยนชื่อคลาสฉันสามารถจบโปรเจ็กต์ทั้งหมดโดยที่ชื่อคลาสนั้นปรากฏในสตริง ดังนั้นถ้าคุณเปลี่ยนชื่อคลาสUserเป็นMyUserมันจะเปลี่ยนชื่อทุกอย่างรวมถึงไฟล์ config, เลเบล, url, พา ธ ในส่วนที่เหลือเรียกแมป ...
ACV

คำตอบ:


100

เมื่อคุณกดShift + F6 (Refactor Rename)สองครั้งกล่องโต้ตอบจะเปิดขึ้นและคุณสามารถปิด "ค้นหาในความคิดเห็นและสตริง"


9
เพื่อให้ชัดเจนว่ากำลังเปิดใช้งานทางลัดสำหรับ "Refactor Rename" TWICE อาจเป็นชุดค่าผสมที่แตกต่างกันขึ้นอยู่กับการแมปคีย์ของคุณ
Kris Erickson

4
ขอบคุณฉันเห็นว่าคุณสามารถปิดใช้งาน refactor inplace ได้เช่นกันแม้ว่าจะเป็นเรื่องดีเพราะนั่นให้ความรู้สึกปลอดภัยเสมอ ประเด็นหลักของโพสต์ของฉันคือการเน้นว่าควรปิดการค้นหาความคิดเห็นและสตริงทั่วโลก ไม่มีเหตุผลที่จะพยายามแก้ไขค่าในตัวแปรในคลาสอื่น มันไม่ฉลาด มีปัญหาเมื่อหน่วยสืบราชการลับหรือ AI สันนิษฐานว่าโดยการเพิ่มโอกาสที่จะถูกต้องจะได้รับอนุญาตให้มีข้อผิดพลาดเล็กน้อย ฉันต้องการ refactorings java ที่เข้มงวดซึ่งควรรวมถึงไฟล์ XML เว้นแต่จะมีชื่อแพ็คเกจทั้งหมด
mmm

1
แต่เนื่องจากมันจำการตั้งค่าได้ฉันจึงไม่เห็นปัญหาใด ๆ คุณสามารถใช้การปรับโครงสร้างข้อความแบบเต็มหรือไม่ก็ได้ขึ้นอยู่กับสิ่งที่คุณต้องการ
แม้ว

3
ขออภัยดูเหมือนว่าช่องทำเครื่องหมายจะปรากฏขึ้นอีกครั้งในตอนนี้ มีใครทราบการตั้งค่าที่จะปิดอย่างถาวรไหม อย่างที่เคยพูดไปก่อนหน้านี้ IntelliJ นั้น "ฉลาด" เกินไปสำหรับความดีของตัวเองที่นี่ ...
เอิร์

@Mo มันไม่เคารพทุกที่ ปัจจุบันการปรับโครงสร้างข้อความแบบอินโค้ดในจาวาสคริปต์กำลังแก้ไขค่าและความคิดเห็นในโค้ดไม่ได้อยู่ในฟังก์ชัน
mmm

8

และมีเหตุผลใดบ้างที่ทำไมถึงเปิดใช้งานโดยปริยาย ??

ใช่มี. ผู้คนมักจะใช้ DSL เทมเพลตและการแทรกภาษามากเกินไปในปัจจุบัน ใน Java แบบเก่า ๆ สิ่งเหล่านี้ส่วนใหญ่มีอยู่เป็น Strings Reflection API ยังแสดงเมธอด / ชื่อคลาสเป็นสตริง เป็นไปไม่ได้ที่ IDE ใด ๆ จะสนับสนุนและจดจำได้ทั้งหมดดังนั้นจึงเป็นการดีที่สุดที่จะจัดหาเครือข่ายความปลอดภัยให้กับคุณจากข้อผิดพลาดในการปรับโครงสร้างใหม่ที่อาจเกิดขึ้น หากคุณมีความครอบคลุมการทดสอบหน่วยที่ดีเยี่ยมคุณอาจปลอดภัยที่นี่

ส่วนความคิดเห็นมักมีตัวอย่างโค้ด ส่วนรหัสเหล่านี้ล้าสมัยอย่างรวดเร็วในระหว่างการเปลี่ยนชื่อดังนั้นจึงมีประโยชน์เมื่อ IDE เตือนคุณเกี่ยวกับการมีอยู่

แน่นอนว่าการตรวจสอบนี้ส่งผลให้เกิดผลบวกปลอมในบางครั้ง อย่างไรก็ตามหากคุณตั้งชื่อที่อธิบายตัวเองให้กับตัวแปร (ฉันหมายถึงไม่ใช่ "var" หรือ "val") สิ่งนี้ไม่น่าจะเกิดขึ้น ดังนั้น IDE จึงผลักดันคุณไปสู่รูปแบบโค้ดที่ดีขึ้นไม่ทางใดก็ทางหนึ่ง

หากคุณยังไม่มั่นใจให้ทำตามคำแนะนำของ @Meo และปิดการค้นหาในสตริงและความคิดเห็น


9
ใช่เป็นข้อเสนอแนะที่ดี แต่ตามที่ฉันแสดงความคิดเห็นเกี่ยวกับเขามีปัญหาเมื่อหน่วยสืบราชการลับหรือ AI สันนิษฐานว่าการเพิ่มโอกาสที่จะถูกต้องจะได้รับอนุญาตให้มีข้อผิดพลาดเล็กน้อย ฉันต้องการ refactorings java ที่เข้มงวดซึ่งควรรวมถึงไฟล์ XML เว้นแต่จะมีชื่อแพ็กเกจทั้งหมดและถึงอย่างนั้นฉันก็ต้องการได้รับการแจ้งเตือน ผลลัพธ์ refactor ไม่ควรแสดงความคิดเห็นและสตริงก่อนและควรยกเว้นโดยค่าเริ่มต้น มันกลายเป็นมิตรกับผู้ใช้น้อยลงและต้องการการโฟกัสของฉันซึ่งบังคับให้ฉันเอนไปข้างหน้าและข่มตาลง
mmm

2
มันเหมือนกับการพยายามลบหมายเลขโทรศัพท์ที่หนาทึบ คุณสามารถพูดซ้ำหมายเลขนี้: 392314213343234295423442? สำหรับฉันมันเป็นความพยายามแบบเดียวกันและแน่นอนสำหรับคนอื่น ๆ อีกมากมาย ฉันหวังว่าพวก Intellij จะรับและให้ทางเลือกแก่เราในการปิดสิ่งนี้
mmm

10
"หากคุณมีความครอบคลุมการทดสอบหน่วยที่ดีเยี่ยมคุณก็น่าจะปลอดภัยที่นี่" - นั่นไม่ใช่ข้ออ้างในการให้ IDEA ที่ถือว่า Java เป็นภาษาไดนามิก ถ้าฉันต้องการภาษาแบบไดนามิกฉันจะเขียนโค้ดใน Groovy "ถ้าคุณตั้งชื่อที่อธิบายตัวเองให้กับตัวแปรของคุณ (ฉันหมายถึงไม่ใช่" var "หรือ" val ") - ความเสี่ยงของการชนกันยังคงมีอยู่ เพียงแค่ระบุโหมด / ตัวเลือก Java ที่ "เข้มงวด" เช่น Eclipse และ Intellij ที่ใช้ในการเสนอ
mmm

5
คลิกผิดครั้งเดียวและฉันจะลบกรอบของ Symfony เราควรจะสามารถ "ยกเว้นโดยค่าเริ่มต้น" ได้
Nicolas Zozol

3
เพิ่งวิ่งเข้าไปในนี้เช่นกัน ค่าเริ่มต้นที่อันตรายอย่างยิ่งที่จะมีและฉันได้ทำผิดพลาดในการเปลี่ยนชื่อสิ่งต่างๆเช่น 'มูลค่า' สองสามครั้งและสังเกตเห็นความเสียหายครั้งยิ่งใหญ่ที่สามารถทำกับโครงการได้ทันที
Jilles van Gurp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.