เหตุใดการติดตามช่องว่างจึงเป็นเรื่องใหญ่ [ปิด]


116

Trailing whitespace มีปัญหาเพียงพอสำหรับโปรแกรมเมอร์ที่บรรณาธิการอย่าง Emacs มีฟังก์ชั่นพิเศษที่เน้นหรือกำจัดมันโดยอัตโนมัติและมาตรฐานการเข้ารหัสจำนวนมากต้องการให้คุณกำจัดทุกกรณีของมัน ฉันไม่แน่ใจว่าทำไม ฉันสามารถคิดถึงเหตุผลเชิงปฏิบัติอย่างหนึ่งในการหลีกเลี่ยงช่องว่างที่ไม่จำเป็นและก็คือถ้าผู้คนไม่ระวังเกี่ยวกับการหลีกเลี่ยงมันพวกเขาอาจเปลี่ยนมันในระหว่างการผูกมัดและจากนั้นเราได้รับมลภาวะ เพิ่มช่องว่าง

นี่ดูเหมือนจะเป็นเหตุผลที่ดีที่จะหลีกเลี่ยง แต่ฉันต้องการดูว่ามีมากกว่านั้นหรือไม่ เหตุใดการตามช่องว่างที่ตามมาจึงเป็นเรื่องใหญ่


30
ช่องว่างต่อท้ายนั้นแน่นอนส่งเสียง ไม่สามารถคิดเหตุผลอื่นได้
yannis

17
ดีเครื่องมือ diff ควรจะสามารถที่จะเพิกเฉยต่อท้าย (และนำเกินไปถ้าคุณต้องการ) ช่องว่าง ท้ายที่สุด Emacs สามารถทำได้ทำไมไม่ใช้ diff เครื่องมือของคุณ
FrustratedWithFormsDesigner

4
การนำทางไปยังจุดสิ้นสุดของสตริงด้วยปุ่ม 'สิ้นสุด' อาจยุ่งกับช่องว่างต่อท้ายจำนวนมาก
Iarek Kovtunenko

11
ฉันคิดว่าคุณกำลังถามคำถามผิดทาง อีกวิธีคือ: «อะไรคือข้อดีของการเว้นวรรคสีขาว? » กลายเป็นคำตอบที่ชัดเจนสวยเมื่อถามคำถามที่เหมาะสม;)
deadalnix

7
บางทีคุณอาจจะลองเขียนโปรแกรมในช่องว่าง * 8 ')
Mark Booth

คำตอบ:


76

เหตุผลที่สำคัญสำหรับฉัน:

  • เมื่อฉันกดปุ่ม "สิ้นสุด" ฉันคาดว่าเคอร์เซอร์จะไปที่จุดสิ้นสุดของบรรทัด (ขึ้นอยู่กับสิ่งที่ฉันกำลังใช้กับตัวแก้ไขและวิธีการกำหนดค่า) และฉันคาดว่าจะสามารถเริ่มพิมพ์ได้ทันที หากเคอร์เซอร์ไปถึงที่นั่นและฉันต้องลบ 3 หรือ 4 ตัวอักษรมันน่ารำคาญ โดยเฉพาะอย่างยิ่งถ้ามันไม่สอดคล้องกันตลอดทั้งไฟล์

  • เมื่อฉันมีตัวอักษรสตริงที่ขยายหลายบรรทัดช่องว่างต่อท้ายสามารถทำให้สตริงเอาต์พุตดูไม่ถูกต้องเมื่อใช้

ในขณะที่ไม่ได้เขียนโปรแกรมอย่างเคร่งครัดช่องว่างสามารถรบกวนการป้อนข้อมูลอย่างจริงจังหากมีการต่อท้าย / นำหน้าในไฟล์ที่จะถูกแยกวิเคราะห์และใช้เป็นอินพุตให้กับสิ่งอื่น สิ่งนี้เกิดขึ้นได้มากที่สุดเมื่อไฟล์อินพุตที่สะอาดและสร้างขึ้นได้รับความสกปรกโดยมีคนแก้ไขไฟล์ใน Excel หรือบางสิ่งจากนั้นจึงไล่ตามช่องว่าง (และปัญหาการจัดรูปแบบอื่น ๆ ) สามารถคืบคลานเข้ามา


8
จุดที่ 1 เป็นปัญหากับโปรแกรมแก้ไขของคุณไม่ใช่พื้นที่สีขาวต่อท้าย
Marjan Venema

33
@MarjanVenema: ใช่เครื่องมือแก้ไขสามารถออกแบบให้ไปที่ช่องว่างไม่ใช่ช่องว่างสุดท้ายได้ แต่จากนั้นคุณจะไม่เคยรู้เกี่ยวกับช่องว่างต่อท้าย (เว้นแต่จะมีการระบุวิธีอื่น - นอกจากนี้ฉันอาจพบว่าแปลกที่ END ไม่เหมือนกัน ไม่ไปที่จุดสิ้นสุดของสายซึ่งเป็นสิ่งที่ฉันคุ้นเคย) ซึ่งจะเป็นปัญหากับตัวอักษรสตริงหลายบรรทัด ดังนั้นตัวแก้ไขจะต้องรู้ว่าในตัวอักษรสตริงหลายบรรทัด END ควรไปที่อักขระตัวสุดท้ายรวมถึงช่องว่าง บรรณาธิการที่ฉันใช้ไม่ใช่คนฉลาด
FrustratedWithFormsDesigner

2
ฉันจะเพิ่มการเลือกด้วยเมาส์เป็นการยากที่จะทำโดยไม่ต้องเลือกช่องว่างเพิ่มเติมและอาจมีความสำคัญหากเป็นการตัดแปะ หรือว่ามันจะสร้างเสียงรบกวนเมื่อกระทำ (ในที่สุด confilcts!) เพื่ออะไร ไม่ใช่เรื่องใหญ่โตนัก แต่มีความรำคาญเล็กน้อย มันให้ความรู้สึกว่า dev ก่อนหน้านี้ขี้เกียจและคาดหวังให้คุณทิ้งความยุ่งเหยิงของเขา / เธอ
deadalnix

1
@deadalnix: แน่นอนว่าเป็นเหตุผลว่าทำไมคุณถึงต้องการตัวแก้ไขที่ดีพร้อมตัวเลือกเพื่อให้เหมาะกับความต้องการของคนส่วนใหญ่ ดังนั้นจุดที่ 1 จึงเป็นปัญหากับตัวแก้ไขไม่ใช่พื้นที่สีขาวต่อท้าย
Marjan Venema

1
จุดที่ 1 คือเหตุผลที่ฉันชอบมีสไตล์เฉพาะของช่องว่างต่อท้าย: บรรทัดว่างที่ถูกเยื้องกับรหัสที่พวกเขาแยกกัน อนุญาตให้ใส่รหัสใหม่ได้ทันทีโดยไม่ต้องเยื้อง
Xiong Chiamiov

29

ฉันเกลียดช่องว่างต่อท้ายจริงๆ แต่เหตุผลที่แน่นอนค่อนข้างคลุมเครือ

ฉันคิดว่าต้นกำเนิดของความรู้สึกนั้นไม่ได้อยู่ในการเขียนโปรแกรม แต่อยู่ในสาขาการเผยแพร่บนเดสก์ท็อป คุณเคยมีเอกสารที่พิมพ์โดยบุคคลอื่นที่จำเป็นต้องพิมพ์ลงในสิ่งพิมพ์หรือไม่? ในสิ่งพิมพ์สมัยใหม่ทั้งหมดโดยเฉพาะอย่างยิ่งเมื่อใช้คอลัมน์มันเป็นเรื่องปกติที่จะมีประโยคต่อกันตามลำดับภายในหนึ่งย่อหน้าไม่ใช่การขึ้นบรรทัดใหม่สำหรับแต่ละประโยค เมื่อมีช่องว่างต่อท้ายมันต้องใช้ความพยายามมากขึ้นในการทำให้ถูกต้อง (การค้นหาจำนวนมากและแทนที่การกระทำที่กำจัดช่องว่างสองครั้ง ฯลฯ ... )

เหตุผลอื่น ๆ (ในการเขียนโปรแกรม) ไม่ใช่เหตุผลที่ดีฉันรู้ แต่พวกเขารบกวนจิตใจจิตใต้สำนึกของฉันในลักษณะที่รุนแรงขึ้นทำให้พวกเขาต้องบังคับให้ฉันกำจัดมัน:

  • ใช้พื้นที่เก็บข้อมูลมากกว่าที่จำเป็น
  • เครื่องมือแยกวิเคราะห์จะต้องข้ามอักขระพิเศษโดยไม่มีเหตุผลที่ดีเมื่อรวบรวม
  • ผู้แก้ไขบางคนอาจเพิ่มบรรทัดว่างพิเศษเมื่อเปิด WordWrap และพื้นที่ต่อท้ายไม่พอดี

ใช่ฉันรู้แล้ว! ฉันรู้ว่าสิ่งเหล่านี้เป็นเหตุผลขยะ ฉันไม่ได้เป็นพวกชอบความสมบูรณ์แบบ แต่ ... ฉันอาจจะเป็นอย่างงั้นเหรอ?

เหตุผลสุดท้ายที่ฉันนึกได้ก็คือการเคลื่อนไหวของเคอร์เซอร์ไม่สอดคล้องกัน รู้สึกเหมือนเคอร์เซอร์แขวนอยู่ในอากาศบาง ๆ ในตอนท้ายของบรรทัดทุกขั้นตอนทางด้านขวาอาจทำให้มันหล่นลงหรือเลื่อนขึ้นไปในระดับที่ไม่รู้จักมันแค่รู้สึกไม่มั่นคง (เช่นบล็อกที่มองไม่เห็นหรือหายไปที่ซูเปอร์ มาริโอเคยกระโดดขึ้นไป)

น่าจะฉันสามารถวินิจฉัยด้วย trailspacefobia?


ไม่ได้ข้อมูลของฉัน แต่มันไม่ดูแปลกฉัน ... สิ่งที่ชนิดของระบบเรียงพิมพ์มันคือคุณใช้มีในการเผยแพร่เดสก์ทอปที่ไม่ได้ละเลยต่อท้าย / ช่องว่างหลายโดยค่าเริ่มต้น ? ฉันคิดว่าวิธีการ LaTeX และภาษาการเขียนโปรแกรมส่วนใหญ่จะเป็นมาตรฐานทุกที่ยกเว้นในขยะ WYSIWYG ระดับผู้บริโภค
leftaroundabout

Adobe InDesign (สิ่งนี้ยังอยู่ภายใต้ขยะ WYSIWYG ระดับผู้บริโภคหรือไม่) มันจะละเว้นช่องว่างต่อท้ายใช่ แต่แทนที่ linefeeds ทั้งหมดด้วยช่องว่างในวรรคและคุณจะจบลงด้วยช่องว่างสองครั้ง (ซึ่งจะไม่ถูกละเว้น) จากนั้นจะต้องแทนที่พิเศษเพื่อกำจัดเหล่านั้น
หลุยส์ซอมเมอร์

"การเผยแพร่บนเดสก์ท็อป" ไม่ใช่สิ่งที่คุณทำกับ "ระบบเรียงพิมพ์"
rakslice

22

คำตอบจำนวนมากเหล่านี้เกือบจะสัมผัสกับเหตุผลที่มันไม่ดีสำหรับฉัน แต่โดยทั่วไปแล้วมัน "แบ่ง" ตัวแก้ไขข้อความ ประสบการณ์ของฉันอยู่กับกลุ่ม

เสียงเรียกเข้าได้รับการออกแบบเพื่อให้การกระทำทั่วไปจับคู่กับตัวอักษรได้อย่างหมดจดโดยที่คุณไม่ต้องคิดว่าจะตีตัวอักษรหรือคีย์ผสมกันอย่างไร ปุ่มลัดต่าง ๆ ช่วยให้เคอร์เซอร์สามารถกระโดดไปมารอบ ๆ ข้อความได้อย่างรวดเร็วโดยใช้เวลาเพียงไม่กี่ปุ่มเท่านั้นในการเข้าถึงทุกที่ที่คุณต้องการ แม้แต่สิ่งต่าง ๆ เช่นพับบล็อคโค้ดนั้นรวดเร็วเนื่องจากคุณสามารถกด END หรือ $ เพื่อข้ามไปยังจุดสิ้นสุดของบรรทัดที่เคอร์เซอร์ควรทับซ้อน {หรือ} หรือ (หรือ) หรือบางสิ่งบางอย่าง - ไม่จำเป็นต้องหยุดการไหลของความคิดของคุณ รับแนวคิดบนหน้าจอ

แต่จากนั้นมาตามช่องว่างที่ต่อท้ายและการเคลื่อนไหวของเคอร์เซอร์จะไม่สามารถคาดเดาได้อีกต่อไป กระบวนการพิมพ์ของคุณถูกขัดจังหวะเนื่องจากสิ่งที่คุณไม่สามารถมองเห็นได้มีผลกระทบต่อที่ที่เคอร์เซอร์ไปดังนั้นคุณต้องหยุดการคิดเพื่อส่งไปที่ที่ควรจะเป็น

เคยสังเกตบ้างไหมว่าผู้คนรำคาญใจเมื่อพวกเขาจดจ่อกับงานและมีคนขัดขวางพวกเขาจริงๆ? ใช่การหาช่องว่างต่อท้ายเมื่อมันคาดว่าอย่างน้อยคือว่าอย่างนั้น

ในฐานะ sidenote ฉันได้สังเกตเห็นด้วยว่าคนที่ไม่สนใจช่องว่างต่อท้ายคือคนที่ใช้เมาส์เพื่อนำทางและมักจะพิมพ์ดีดช้ากว่าเพราะ ...


2
ในฐานะ sidenote ความเร็วในการพิมพ์ไม่ได้เกี่ยวข้องกับว่าคุณใช้เมาส์เพื่อนำทางหรือไม่ การนำทางบางอย่างเหมาะอย่างยิ่งสำหรับเมาส์ ; p
Steven Jeuris

2
ถ้าคุณใช้เป็นกลุ่มคุณสามารถลบทุกช่องว่างต่อท้าย:%s/ *$//
Giorgio

1
@Giorgio ฉันรู้ แต่ฉันไม่สามารถทำมันได้ตลอดเวลาเพราะมันนับเป็นการเปลี่ยนแปลงในการควบคุมเวอร์ชัน
Izkata

@izkata: จริง ฉันฟอร์แมตไฟล์ฉันต้องเปลี่ยนก่อนที่จะตรวจสอบพวกเขาใน แต่นี่คือการต่อสู้ที่หายไปหากนักพัฒนาคนอื่น ๆ ตรวจสอบในไฟล์ที่มีช่องว่างต่อท้าย
Giorgio

17

น่าแปลกที่คำตอบที่ชัดเจนที่สุดหายไป: ช่องว่างต่อท้ายสามารถทำให้เกิดข้อบกพร่องได้ยาก

สถานการณ์ที่ชัดเจนที่สุดคือสตริงหลายบรรทัด Python, JavaScript และ Bash เป็นตัวอย่างบางส่วนของภาษาที่อาจได้รับผลกระทบจากสิ่งนี้:

print("Hello\·
····World")

ผลิต:

  File "demo.py", line 1
    print("Hello\
                 ^
SyntaxError: EOL while scanning string literal

ซึ่งเป็นความลับอย่างใดและยากที่จะแก้ไขหากไม่ได้กำหนดค่าตัวแก้ไขเพื่อแสดงอักขระช่องว่าง

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

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

ภาพประกอบ: การเน้นไวยากรณ์สามารถช่วยหลีกเลี่ยงช่องว่างต่อท้ายในสถานการณ์ที่มันสามารถนำไปสู่ข้อบกพร่อง แต่ไม่ต้องพึ่งมัน

บริบทอื่นที่กล่าวถึงสั้น ๆ ในคำตอบก่อนหน้าคือข้อมูลที่เก็บไว้ในไฟล์

ตัวอย่างเช่นไฟล์ CSV ที่มีช่องว่างต่อท้ายอาจทำให้ข้อมูลไม่ตรงกันซึ่งยากต่อการตรวจจับ: ตัวแยกวิเคราะห์ที่ได้มาตรฐานจะตัดช่องว่าง (มาตรฐานบ่งชี้ว่าช่องว่างนำหน้าหรือต่อท้ายนั้นไม่เกี่ยวข้องยกเว้นคั่นด้วยเครื่องหมายคำพูดคู่) ตัวแยกวิเคราะห์บางตัวอาจทำงานผิดปกติและรักษาช่องว่างเป็นส่วนหนึ่งของค่า

รูปแบบที่กำหนดเองอื่น ๆ อาจพิจารณาเป็นพิเศษว่าช่องว่างเป็นส่วนหนึ่งของค่าที่นำไปสู่ความสอดคล้อง แต่ยังคงยากที่จะแก้ปัญหาสถานการณ์


14

ฉันเพิ่งใช้เวลาหนึ่งวันเพื่อค้นหาข้อบกพร่องที่กลายเป็นช่องว่างต่อท้ายที่ไม่คาดคิดในข้อมูล


13
ฉันคิดว่ามันเป็นข้อผิดพลาด; การประมวลผลรหัสที่มนุษย์สร้างขึ้นควรทิ้งช่องว่างต่อท้ายและบ่อยครั้งที่ช่องว่างชั้นนำควรทิ้ง
วินไคลน์

@kevincline - อย่างน้อยควรเป็น ถ้ามันไม่ปรากฏบนหน้าจอหรือบนผลงานพิมพ์ฉันไม่อยากคิดเลย
โกง

6
เพราะคุณใช้เวลาทั้งวันเพื่อมองหาข้อบกพร่องช่องว่างที่ตามมาเป็นเรื่องใหญ่หรือไม่? โปรดแก้ไขคำตอบของคุณให้กว้างกว่านั้น เพิ่มพื้นหลังการโต้เถียง ... โดยส่วนตัวฉันไม่เคยมีปัญหาช่องว่างตามมา แต่ฉันไม่ได้ใช้มันเพื่อสรุปว่าพวกเขาไม่ใช่ปัญหาเช่นกัน
Steven Jeuris

2
@ ช่องว่าง Trailing Trailing ทำให้เกิดข้อผิดพลาดซึ่งยากต่อการติดตาม ดูเหมือนจะเป็นคำตอบที่ดีสำหรับฉัน คุณสามารถจินตนาการได้ว่าโค้ดการแยกวิเคราะห์ข้อมูลบางอย่างอาจแตกในสถานการณ์นั้นได้อย่างไร
Will Sheppard

ฉันลบช่องว่างที่ส่วนท้ายของข้อมูลและตอนนี้การทดสอบล้มเหลว คุณต้องรับผิดชอบต่อสิ่งนั้น คุณชื่ออะไร? ฉันจะส่งใบเรียกเก็บเงินที่ไหน
โทมัสเวลเลอร์

8

เมื่อฉันเลือกซอร์สโค้ดโปรแกรมเพื่อคัดลอกและวาง (หรือลบ) ฉันพบว่ามันน่ารำคาญเล็กน้อยที่จะเห็นพื้นที่สีขาวพิเศษที่ผิดปกติในตอนท้ายของบรรทัด: เนื่องจากฉันต้องอ่านรหัสในขณะที่ฉันเลือกมัน พื้นที่สีขาวต่อท้ายเป็นเสียงที่ไม่จำเป็น ตัวอย่าง (จุดแสดงถึงพื้นที่สีขาว):

if (fp)........
{....
    fclose(fp);.
}
else
{.....
    prinft("File is NULL\n");
}..

ตัวอย่างนี้เป็นของเทียม แต่ฉันเห็นโค้ดจำนวนมากที่มีลักษณะเช่นนี้


7

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

ในกรณีส่วนใหญ่ช่องว่างจะมีการจัดรูปแบบรหัสสำหรับผู้อ่านของมนุษย์ ช่องว่างต่อท้ายอาจระบุหลายสิ่งรวมถึง:

  • คำสั่งที่ไม่สมบูรณ์;
  • ความคิดเห็นที่ขาดหายไป;
  • การแก้ไขที่ผิดพลาด; หรือ
  • การแก้ไขเลอะเทอะ

สองอย่างนี้อาจส่งผลให้เกิด funtioning ที่ไม่ถูกต้องและอื่น ๆ อาจทำให้ยากต่อการเข้าใจรหัส


4

มีภาษาการเขียนโปรแกรมที่ไวต่อช่องว่างท้ายบรรทัด ตัวอย่างเช่นสคริปต์ของ TCL จะให้ข้อผิดพลาดหากมีช่องว่างที่ท้ายบรรทัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.