ทำไมบางภาษาแนะนำให้ใช้ช่องว่างแทนแท็บ [ปิด]


10

บางทีฉันอยู่คนเดียวในเรื่องนี้ แต่บางสิ่งรบกวนฉันเหมือนคนที่เยื้องใช้ช่องว่างแทนแท็บ การพิมพ์SpaceSpaceSpaceSpaceง่ายและง่ายกว่าการพิมพ์Tabอย่างไร แน่นอนว่าความกว้างของแท็บนั้นแปรผัน แต่มันบ่งบอกถึงพื้นที่เยื้องได้ดีกว่าการเว้นวรรค สิ่งเดียวกันกลับไปเพื่อการถอยหลัง Backspace หนึ่งหรือสี่ครั้ง

ทำไมภาษาอย่างหลามแนะนำให้ใช้ช่องว่างทับแท็บ


24
tabคุณสามารถกำหนดค่าส่วนใหญ่บรรณาธิการเพื่อแทรกช่องว่างแทนของแท็บเมื่อคุณกด หากคุณไม่สามารถกำหนดค่าสิ่งนั้นในโปรแกรมแก้ไขที่คุณโปรดปราน
อดัมเลียร์

สิ่งหนึ่งที่ตัวแก้ไขจำนวนมากสามารถติดตั้งเพื่อแทรกช่องว่าง 4-8 เมื่อกด 'แท็บ' ดังนั้นมันเป็นเพียงกดปุ่มเดียวเช่นเดียวกับแท็บ
Echo พูดว่า Reinstate Monica

2
มันยังไม่ตอบคำถามของฉัน ทำไมต้องเว้นวรรคแทนแท็บ แน่นอนว่าคุณสามารถกำหนดค่าตัวแก้ไขให้แทรกช่องว่างแทนแท็บได้ แต่คุณสามารถแทรกแท็บด้วยช่องว่างได้ คำถามคือทำไมคุณต้องการทำเช่นนี้? ประโยชน์ที่ได้รับคืออะไร?
Naftuli Kay

4
@Tk Spaces เป็นแท็บที่ไม่สามารถเปลี่ยนแปลงได้
Martin Beckett

3
@TKKocheran เนื่องจากแท็บทำสิ่งที่ขี้ขลาดกับเอาต์พุตของคุณเมื่อคุณตั้งใจแทรกลงในสตริง
zzzzBov

คำตอบ:


15

ความสอดคล้องเป็นหลัก

นอกจากนี้บางสิ่งบางอย่างเกิดขึ้นพร้อมกันที่ใช้ช่องว่างเช่น Python: บอกฉันว่าจะเกิดอะไรขึ้นถ้าฉันเรียกใช้ข้อมูลโค้ดต่อไปนี้

def foo():
    print "a"
    print "b"

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

จากนั้นมีกรณีที่น่าผิดหวังเมื่อบรรณาธิการของนักพัฒนาคนหนึ่งมีแท็บตั้งค่าเป็น 8 ช่องว่างและอีกชุดหนึ่งตั้งไว้ที่ 4 และมีผู้ใช้ 5 คนด้วยเหตุผลแปลก ๆ ... มันอาจดูปกติในเวิร์กสเตชันเครื่องเดียว แต่เมื่อตรวจสอบแล้ว SVN และคนอื่นอัปเดตพวกเขาจะเห็นความน่ากลัวและน่ากลัว

ดังนั้นสิ่งเหล่านี้จึงเป็นเหตุผลที่ดีสองประการที่จะต้องสอดคล้องกันเสมอไม่ว่าจะเป็นช่องว่างหรือแท็บ

แต่ช่องว่างช่วยให้สามารถควบคุมการเยื้องได้มากกว่าแท็บและไม่ต้องการการกำหนดค่าพิเศษใด ๆ ในโปรแกรมแก้ไขเพื่อให้สามารถใช้งานได้ (แม้ว่าจะสามารถทำได้ง่ายขึ้น - ตัวอย่างเช่นใน vim เพียงใช้set expandtabเพื่อแทรกช่องว่างเมื่อใดก็ตามที่คุณกดแท็บ)

แก้ไข: และพอน่าขบขันเว็บไซต์ดูเหมือนว่าจะทำให้แท็บของฉันเป็นปกติในช่องว่างเพื่อให้เบราว์เซอร์สามารถแสดงได้อย่างถูกต้อง คลิกที่ "แก้ไข" เพื่อดูแท็บดั้งเดิมรวมอยู่;)


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

@HorusKol Nope ความสยดสยองนั้นเป็นเพราะช่องว่างและแท็บต่างกัน ฉันเดาว่าฉันไม่ได้ทำให้ชัดเจนเพียงพอ (ดูประโยคเดียวหลังจากบรรทัด "น่าเกลียดน่ากลัวน่าขยะแขยง") ดังนั้นช่องว่างจึงถูกจัดให้อยู่ในแนวเดียวกับแท็บเมื่อมีการตั้งค่าให้เทียบเท่า 4 สเปซ แต่จากนั้นเมื่อมีคนอื่นดู (ไม่ว่าจะตั้งค่าแท็บต่อพื้นที่) หรือไม่ก็ตาม
Izkata

4
ฉันเข้าใจแล้ว - คุณต้องกำหนดแนวทางสำหรับทีมของคุณ - ใช้ช่องว่างหรือแท็บอย่างต่อเนื่อง ... ไม่ว่าจะด้วยวิธีใดแท็บหนึ่งต่อช่องว่างเป็นความคิดที่ไม่ดีรอบตัว);
HorusKol

21
นี่คือเหตุผลที่ฉันพิจารณาความคิดของภาษาที่มีความหมายในช่องว่างเพื่อเป็นข้อบกพร่องในการออกแบบ สิ่งที่คุณมองไม่เห็นไม่ควรทำลายรหัสของคุณ
พอลนาธาน

สำหรับบันทึกฉันเห็นด้วยกับ @PaulNathan
Izkata

11

นี่คือการสนทนาที่ดีเกี่ยวกับการเยื้องและช่องว่างใน Python; จากบทความ:

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

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

สำหรับตัวฉันเองฉันชอบช่องว่างเพราะรหัสจะแสดงด้วยการเยื้องในจำนวนเท่ากันไม่ว่าฉันจะดูใน IDE หรือlessหรือ Notepad; ช่องว่างคือแบบพกพามากขึ้น


3
เรื่อง: "ไม่ว่าฉันจะดูใน IDE หรือน้อยกว่าหรือ Notepad นั่นคือช่องว่างพกพาได้มากกว่า" - นี่คืออาร์กิวเมนต์ที่ดีที่สุดสำหรับช่องว่างที่ฉันเคยได้ยินมา ฉันเป็นคน "แท็บ" ด้วยตัวเอง แต่บางครั้งก็ไม่ชอบที่จะเห็นโค้ดที่เว้นระยะแท็บแสดงผลในรูปแบบที่ไม่คาดคิด
Aerik

2

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

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


ฉันกังวลมากขึ้นเกี่ยวกับเวลาที่เสียไปกับการใช้พื้นที่พิมพ์หรือ Backspace สี่ครั้งเมื่อกดแป้นเดียวเพื่อทำทั้งสองอย่าง
Naftuli Kay

ใช่ แต่ Python นั้นแปลกมาก ฉันไม่เคยเจอสิ่งอื่นใดที่สนใจพื้นที่
Aerik

@TKKocheran โอ้นั่นคือความกังวลที่แท้จริงของคุณ? ฉันไม่ทราบว่าพวกเขาทำได้อย่างไร แต่มีการตั้งค่าการทำงานของฉันเพื่อให้ backspace กลับไปที่ tabstop สุดท้ายผ่านช่องว่างหลายช่องโปร่งใสอย่างสมบูรณ์
Izkata

คุณ.vimrcช่วยฉันได้ไหม :)
Naftuli Kay

1
@TKKocheran ค้นพบ - เป็นเพียงset softtabstop=4และทั้ง TAB และ BACKSPACE จะใช้แท็บ 4 ช่องว่าง (สำหรับแต่ละแท็บสต็อปรักษาความกว้างเป็น 4 ช่องว่าง)
Izkata

2

ควรใช้ช่องว่างเสมอเนื่องจากแท็บเพียงอย่างเดียวไม่ยืดหยุ่นพอสำหรับหลาย ๆ สไตล์และแท็บ intermixing และช่องว่าง (เกือบ) จะสร้างความยุ่งเหยิงอย่างแน่นอน

สำหรับตัวอย่างของสไตล์หนึ่งที่โดยทั่วไปต้องการช่องว่างให้พิจารณาดังนี้:

call_some_function(parameter1,
                   parameter2,
                   parameter3,
                   parameter4,
                   parameter5,
                   parameter6,
                   parameter7);

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

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

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

a.m = 9;   // this is the slope
a.i = 4;   // this is the intensity
a.x = 1;   // this is the x-intercept

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

a.m = 9;          // this is the slope
a.i = 4;  // this is the intensity
a.x = 1;          // this is the x-intercept

ทันใดนั้นความแตกต่างเล็ก ๆ น้อย ๆ ของความกว้างระหว่าง 'i' และ 'm' หรือ 'x' ในแบบอักษรความกว้างตัวแปรของเรานั้นถูกขยายจนหยุดแท็บทั้งหมด

บรรทัดล่างคือเกือบทุกการเปลี่ยนแปลงในวิธีที่คุณดูโค้ดด้วยแท็บไม่ว่าจะดูเล็กน้อยเล่น ๆ และมักจะทำให้เกิดความยุ่งเหยิงที่อ่านไม่ได้

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

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


1
ฉันเห็นคุณพูดว่า "ฟอนต์ตามสัดส่วนแบ่งทั้งช่องว่างและแท็บ แต่แบ่งแท็บแย่กว่าดังนั้นใช้ช่องว่าง" ทำไมไม่ใช้แท็บที่ยืดได้? nickgravgaard.com/elastictabstops
amara

@sparkleshy: เป็นความคิดที่ดี แต่ไม่ได้สร้างความแตกต่างให้กับรหัสจริงและจะไม่แก้ไขจนกว่าจะมีบรรณาธิการจริง (หรืออย่างน้อยส่วนใหญ่) เข้ามารวมอยู่ด้วย
Jerry Coffin

... ฉันรู้ว่า: '(- - เอาละคุณยังคงสามารถใช้เครื่องมือแก้ไขที่สำรองข้อมูลด้วยช่องว่าง (เช่นปุ่มแท็บควรเป็นถ้าคุณใช้ช่องว่าง) แต่แสร้งทำเป็นว่าแท็บยืดหยุ่นได้ทำให้จัดการช่องว่างได้ ง่ายขึ้น
amara

2
หากคุณกำลังเขียนโปรแกรมในแบบอักษรที่มีความกว้างตามสัดส่วนคุณมีปัญหามากกว่าแท็บที่ต้องกังวล ...
Brian Knoblauch

1
@BrianKnoblauch: ในฐานะคนที่ใช้ eurofurence แบบอักษรฉันต้องไม่เห็นด้วย สิ่งเดียวที่ทำให้ฉันมีปัญหาคือช่องว่าง นอกจากนี้ยังเกี่ยวข้องกับรูปแบบการเยื้องของฉันซึ่งไม่แตกต่างกันมากกว่าหนึ่งแท็บระหว่างบรรทัด สมมติว่าฉันเคยได้รับแท็บยืดหยุ่นรหัสของฉันจะดูดียิ่งขึ้น
Magus

2

ปัญหาใหญ่คือความไม่สอดคล้องกันของความกว้าง "แท็บ" บางครั้งพวกเขาจะแสดงเป็นช่องว่างสี่ครั้งบางครั้งแปด ในบรรณาธิการจำนวนมากคุณสามารถตั้งค่าให้เป็นอะไรก็ได้ตั้งแต่ 1 ถึง 9 ช่องว่าง

ดังนั้นสิ่งนี้จะเปลี่ยนโปรแกรมแก้ไข WYSWYG อย่างง่ายให้กลายเป็นสิ่งที่คุณเห็นคือสิ่งที่คนอื่น ๆ

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

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