ข้อดีและข้อเสียของภาษาที่ใช้ช่องว่างกับ {} เพื่อระบุขอบเขตคืออะไร [ปิด]


17

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

ภาษาใดก็ตามที่มีช่องว่างเป็นโทเค็นจะต้องตาย

โพสต์ในภายหลังในคำตอบเดียวกัน:

ฉันถูกจัดเรียงของต่อต้านช่องว่างเป็นโทเค็นจนกว่าฉันจะลองจริง มันอาจช่วยได้ว่าเลย์เอาต์ white-space ส่วนตัวของฉันนั้นตรงกับสิ่งที่ทุกคนใน python-land ใช้ อาจเป็นเพราะฉันเป็นคนที่เรียบง่าย แต่ถ้าคุณจะเยื้อง ๆ ทำไมต้องกังวลกับ {} s?

ฉันเห็นข้อโต้แย้งที่ชัดเจนสำหรับแต่ละด้าน:

ใช้ช่องว่าง:

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

ใช้โทเค็น:

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

มีจุดใดที่ฉันพลาดหรือไม่ คุณชอบอันไหน? คำพูดใด ๆ ของปัญญาหลังจากทำงานกับคนใดคนหนึ่งเป็นเวลานาน?


PS ฉันเกลียดเมื่อภาษาไม่ใช้โทเค็นเดียวกันสำหรับแต่ละโครงสร้างการควบคุม VB นั้นน่ารำคาญมากกับข้อความEnd IfและEnd Whileข้อความภาษาอื่น ๆ ส่วนใหญ่ใช้ {} เพื่อทุกสิ่ง แต่อาจเป็นหัวข้อสำหรับคำถามอื่น ...


2
ฉันจะไม่พูดว่า "ง่ายกว่าที่จะตัดและวาง" มันง่ายขึ้นเพียงเล็กน้อยเท่านั้น
Kugel

1
ตราบใดที่คุณเก็บรักษาโค้ดให้มีขนาดเล็กและจัดระเบียบโทเค็นไม่ควรสำคัญ ... โดยวิธีรักแท็ก 'สงครามศักดิ์สิทธิ์' ฮ่า ๆ
Scott

"เครื่องมือแก้ไขข้อความบางส่วนแสดงพื้นที่ว่างต่างกัน": ?? "ปัจจุบันได้รับความนิยมมากขึ้น": ความนิยมมักไม่เกี่ยวข้องกับคุณภาพของความคิด
Giorgio

ฉันชอบไวยากรณ์ของ whitespace และฉันชอบการเขียนโค้ดใน CoffeeScript และ Haskell (ใช่ฉันรู้ว่ามันยาก) ฉันเขียนโค้ดใน JavaScript และ C และฉันไม่สามารถกลับไปที่} แต่เสียงกระเพื่อม s แสดงออกเมื่อพวกเขาจะถูกแทนที่ด้วย divs กล่องที่ดีที่สุดคือแม้ว่า:)
aoeu256

ฉันคิดว่ามันทำให้การระบุข้อผิดพลาดได้ยากขึ้นถ้าคุณต้องพึ่งพาช่องว่างเพียงอย่างเดียว ตัวอย่างเช่น: stackoverflow.com/questions/21205836/… ความแตกต่างเพียงอย่างเดียวระหว่างรหัสของ OP และคำตอบคือพื้นที่พิเศษ มี a} เพื่อกำหนดเขตที่โค้ดอยู่ใน for for loop และไม่ชัดเจนมาก
AncientElevator9

คำตอบ:


15

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

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


6

นอกจากนี้สิ่งที่เป็นมืออาชีพสำหรับบางคนอาจเป็นการต่อต้านผู้อื่น
Larry Coleman

จุดที่ดีเยี่ยม โดยส่วนตัวฉันคิดว่าพวกเขาทำงานร่วมกันและตราบใดที่ sope ชัดเจนฉันจะไม่บ่น (มาก)
Michael K

8
ฉันไม่เห็นด้วยกับการเปรียบเทียบของคุณ มีเหตุผลที่ค่อนข้างน่าเชื่อที่จะเชื่อว่าซินแทกซ์ที่ขึ้นอยู่กับช่องว่างนั้นเป็นอุปสรรคต่อการเพิ่มผลผลิตของโปรแกรมเมอร์แม้ในโปรแกรมเมอร์ที่รักมัน มันเหมือนกับการพูดว่าผู้คนไม่ชอบรสชาติของไซยาไนด์ - ทุกคนก็แค่“ คิดเชิงตรรกะ” เมื่อพวกเขาพูดว่ามันมีพิษ ไม่มันไม่สำคัญว่าคุณจะรักมันมากเพียงใดมันยังคงฆ่าคุณ
Timwi

4
PS คำว่าคุณจริงมองหาเหตุผลเข้าข้างตนเอง นอกจากนี้ทุกคนมีแนวโน้มที่จะหาเหตุผลเข้าข้างตนเองไม่เพียง แต่โปรแกรมเมอร์
Timwi

11

ด้วยความเสี่ยงที่จะเกิดเสียงเหมือนแฟนตัวยงที่สุดฉันคิดว่าทุกคนที่อ้างว่าช่องว่าง "ช่วยลดการเยื้องในรหัสที่ไม่สอดคล้องกัน" ไม่เคยใช้ Visual Studio ด้วยคำสั่งเดียว (ฉันคิดว่าทางลัดเริ่มต้นคือ Ctrl + K, D) การเยื้องทั้งหมดนั้นสอดคล้องกันทันที นอกจากนี้เมื่อวางโค้ดการเยื้องจะได้รับการแก้ไขทันทีโดยไม่ต้องทำอะไรเลยและสิ่งเดียวกันก็เป็นจริงเมื่อเขียนโค้ดใหม่หรือเมื่อห่อบางสิ่งในifบล็อกอื่นหรือบล็อกอื่น (ฟอร์แมตเกิดขึ้นเมื่อ}พิมพ์) นอกจากนี้การกด Enter หลังจากคำสั่งที่เสร็จสมบูรณ์แล้วจะวางเคอร์เซอร์ที่ระดับการเยื้องที่ถูกต้องสำหรับคำสั่งถัดไปแม้ว่าคำสั่งก่อนหน้านี้จะถูกเยื้องต่อไปเนื่องจากการifหรือคล้ายกันทำให้ยากมากที่จะคิดว่าคำสั่งยังอยู่ภายใต้ifเมื่อไม่ได้ตั้งใจ

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


¹ (ฉันรู้ว่ามีกรณีพิเศษที่ VS ปฏิเสธที่จะจัดรูปแบบใหม่คือตัวอักษรแถวลำดับที่ขยายหลายบรรทัด แต่นั่นอยู่ด้านข้างจุด)


8
การเยื้องของ Python ไม่จำเป็นต้องแก้ไขเพราะมันจะไม่เสียหาย (โดยไม่มีใครสังเกตเห็น!) มันเป็นไปไม่ได้ที่จะเขียน Purify (โปรแกรมที่ช่วยตรวจจับการรั่วไหลของหน่วยความจำ) สำหรับ C # ไม่ได้หมายความว่าการจัดการหน่วยความจำ C ++ นั้นเหนือกว่า
dbkk

2
@Dean: ทำไมคนจำนวนมากคิดว่าพวกเขาต้องการ Resharper สำหรับทุกสิ่ง? สิ่งที่คุณอธิบายมีอยู่แล้วใน Visual Studio ที่ไม่มี Resharper
Timwi

2
@dbkk: การเยื้องของคุณจะหักทันทีที่คุณเพิ่มifบรรทัดที่ใดก็ได้ จากนั้นคุณต้องดำเนินการแก้ไขการเยื้องด้วยตนเอง
Timwi

2
คุณอาจไม่ได้ทำงานกับทีมที่เยื้องขี้เกียจไม่ลงรอยกัน ฯลฯ และแก้ไขมันให้หมดเพราะมันทำให้โค้ดแตกต่างไปไม่ได้
Kevin

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

3

โดยส่วนตัวฉันพบว่าฉันต้องการบรรทัดว่างที่แนะนำโดยมีโทเค็นในบรรทัดของตัวเองเพื่อให้ใจของฉันรู้ว่ารหัสอยู่ในขอบเขตอื่น

ฉันเกลียดเมื่ออยู่ในหลามที่ผู้คนไป:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

ขณะที่อยู่ในดินแดนโทเค็นฉันเกลียดเมื่อมีคนคัดลอกและวางและไม่ทำความสะอาดเยื้อง ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

หรือไม่ได้ใช้เส้นที่แยกต่างหากสำหรับโทเค็น

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

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


3

Pro: ไม่มีสงครามศักดิ์สิทธิ์ / การเยื้องย่างในโลก Python เท่าที่ฉันรู้ การตัดสินใจนี้ในนามของนักพัฒนาอาจช่วยได้บ้าง

คอนดิชั่น: ฟังก์ชั่นที่ไม่ระบุชื่อถูก จำกัด ไว้ที่หนึ่งบรรทัด ฟังดูดี แต่ฉันมักพบว่าตัวเองเขียนหลายบรรทัดlambdaใน Scheme (ส่วนใหญ่ใช้ป้อนmapหรือapplyในที่เดียวดังนั้นจึงไม่มีเหตุผลที่จะประกาศแยกต่างหาก)



รองรับการแสดงผลหลายบรรทัดใน Python เพียงแค่ใส่ \ ที่ท้ายบรรทัด
dbkk

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

@ ทราบ - ตกลงใช่ยุติธรรม Python เป็นเพียงภาษาที่มีการคั่นช่องว่างเท่านั้นที่ฉันมีประสบการณ์ด้วย @dbkk ดังนั้นคุณกำลังบอกว่าlambda n: a = n \\na.sort() \\na[0:3] จะไม่ส่งคืนข้อผิดพลาดทางไวยากรณ์หรือไม่ เคล็ดลับ `\ 'ให้คุณกระจายแลมบ์ดาบรรทัดเดียวในหลาย ๆ บรรทัดได้ แต่คุณยังไม่ได้รับมากกว่าหนึ่งบรรทัดจริง
Inaimathi

Haskell, CoffeeScript ใช้ช่องว่าง แต่ไม่มีข้อ จำกัด แลมบ์ดาบรรทัดเดียว
aoeu256

3

{} เพิ่มความซ้ำซ้อน ความซ้ำซ้อนมากเกินไปไม่ดีและน้อยเกินไป และการป้อนข้อมูลด้วยตนเองก็ไม่ดีโดยเฉพาะ ถ้ามันยากที่จะใช้

ดังนั้นในเวลาที่ไม่ดี / ไม่มี IDE รูปแบบช่องว่างอาจดีกว่าเล็กน้อย แต่ด้วย IDE ที่มีประสิทธิภาพการจัดฟันดีกว่า


1
คุณทำประเด็นที่ดีเกี่ยวกับความซ้ำซ้อนที่ฉันคิดว่า ฉันคร่ำครวญเรื่อง parser-recovery สำหรับคอมไพเลอร์มาระยะหนึ่งแล้ว (ตามความพยายามที่น่าสนใจของ Clang ในการออก Fix-It สำหรับโค้ด) และสิ่งที่ช่วยได้จริงๆที่นี่คือมีความซ้ำซ้อน ดังนั้นฉันคิดว่าไม่มีความซ้ำซ้อนในขณะที่ยอดเยี่ยมในโลกที่สมบูรณ์แบบจริงๆแล้วเป็นอันตรายสำหรับการเขียนโปรแกรมในโลกแห่งความเป็นจริง เมื่อแหล่งข้อมูลที่ซ้ำซ้อนไม่เห็นด้วยก็อาจเป็นไปได้ว่ามีการพิมพ์ผิด / ผิดพลาด; ข้อผิดพลาดที่อาจเกิดขึ้นนี้จะไม่ถูกตรวจจับ! ที่ถูกกล่าวว่าฉันชอบที่ไม่มีวงเล็บ;)
Matthieu เมตร

"Noise" เป็นคำที่ Erik Meijer ใช้ในวิดีโอ Haskell ของเขา
user16764

ถ้าคุณลบบล็อกและคุณลืมที่จะลบ} หรือลบ {โดยไม่ตั้งใจเมื่อทำสิ่งตรงกันข้าม การสำรองซ้ำซ้อนกับ DRY IMO
aoeu256

2

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

IMHO "{{{{{" is more reliable than "     ".

9
หากคุณใช้นิพจน์แบบมีเงื่อนไขหลายหน้าแสดงว่าคุณมีปัญหาอื่น อย่าทำอย่างนั้น ในความเป็นจริงแม้จะมีเครื่องหมายปีกการหัสจะกลายเป็นระเบียบอ่านไม่ได้ นี่เป็นข้อดีอีกอย่างของการเว้นวรรคการเยื้อง: ช่วยป้องกันคุณจากการเขียนโค้ดที่น่ากลัว
Konrad Rudolph

1
อย่างจริงจังหลายหน้ามีเงื่อนไขยาวหรือไม่
Winston Ewert

2

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

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

ไพ ธ อนเนอร์จะยืนยันว่าการจัดฟันนั้นไร้ประโยชน์เมื่อการเยื้องเป็นส่วนหนึ่งของไวยากรณ์ แต่ไม่ใช่การจัดฟันจะช่วยให้อ่านง่ายขึ้น ฉันลองเขียนโปรแกรม Python และมันเป็นภาษาที่น่าสนใจมากสำหรับฉัน แต่คุณเคยลองใช้การif-elifเยื้องมากกว่า 2 หรือ 3 ระดับหรือไม่? พวกเขาดูไม่เรียบร้อยอีกต่อไป

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

if condition:
    statement
    other_statement()
end

PS2: 2019, 4 ปีหลังจากคำตอบนี้ ฉันเรียน Python และคุ้นเคยกับการเยื้องความหมายโดยสิ้นเชิงและไม่ยากที่จะอ่านเลย โดยเฉพาะอย่างยิ่งด้วยความช่วยเหลือของ IDE ที่ทันสมัยที่วาดแถบแนวตั้งเพื่อช่วยในการระบุบล็อกเยื้อง


ฉันชอบวากยสัมพันธ์นั้นเพราะมันเป็นการประนีประนอมที่ดีและหลีกเลี่ยงการจัดฟัน แต่มันมีค่าใช้จ่ายสูงสำหรับข้อความบรรทัดเดียวที่เช่นใน C เราสามารถละทิ้งวงเล็บปีกกาได้อย่างสมบูรณ์ :(
Jo So

แทนที่จะซ้อนกันถ้า ... elif คุณสามารถลองใช้พจนานุกรมและ / หรือ, ดำเนินการต่อ, ส่งกลับ, ฟังก์ชันซ้อนกัน ...
aoeu256

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