ทำไมนักพัฒนา C # ขึ้นบรรทัดใหม่การเปิดวงเล็บ [ปิด]


44

ฉันใช้เวลาส่วนใหญ่ในช่วงหลายปีที่ผ่านมาทำงานเป็นหลักกับ C # และ SQL โปรแกรมเมอร์ทุกคนที่ฉันทำงานด้วยในช่วงเวลานั้นอยู่ในนิสัยของการวางวงเล็บเปิดของคำสั่งฟังก์ชั่นหรือการควบคุมการไหลของบรรทัดใหม่ ดังนั้น ...

public void MyFunction(string myArgument)
{
     //do stuff
}

if(myBoolean == true)
{
    //do something
}
else
{
    //do something else
}

ฉันได้รับการหลงโดยพื้นที่ที่สิ้นเปลืองนี้โดยเฉพาะในงบ / อื่น ๆ และฉันรู้ว่ามีตัวเลือกอื่นใน C # รุ่นที่ใหม่กว่าเช่น:

if(myBoolean == true)
    //do something on one line of code

แต่ไม่ค่อยมีใครใช้พวกเขา ทุกคนทำสิ่งที่หยิก - รั้ง - on - newline

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

function MyJavaScriptFunction() {
    //do something
}

คุณสามารถมองเห็นความรู้สึกนี้ได้เนื่องจากเนื่องจากการใช้งานการปิดและตัวชี้ฟังก์ชั่นได้รับความนิยมใน JavaScript จึงช่วยประหยัดพื้นที่ได้มากและทำให้อ่านง่ายขึ้น ดังนั้นฉันจึงสงสัยว่าทำไมมันไม่เห็นเป็นสิ่งที่ทำใน C # ในความเป็นจริงถ้าคุณลองสร้างข้างต้นใน Visual Studio 2013 มันจริงฟอร์แมตใหม่สำหรับคุณวางวงเล็บเปิดในบรรทัดใหม่!

ตอนนี้ฉันเพิ่งเห็นคำถามนี้ในการตรวจสอบรหัส SE: https://codereview.stackexchange.com/questions/48035/questions-responses-let-me-tell-you-about-you ซึ่งฉันได้เรียนรู้ว่าใน Java ภาษาฉันไม่คุ้นเคยกับมันมากเกินไปมันถือว่าไม่รัดกุมในการเปิดวงเล็บปีกกาของคุณทันทีหลังจากการประกาศในรูปแบบจาวาสคริปต์สมัยใหม่

ฉันเข้าใจอยู่เสมอว่า C # นั้นเป็นแบบอย่างจาก Java และยังคงมาตรฐานการเข้ารหัสพื้นฐานเดิมไว้มากมาย แต่ในกรณีนี้ดูเหมือนจะไม่ ดังนั้นฉันคิดว่าจะต้องมีเหตุผลที่ดี: อะไรคือเหตุผล? ทำไมนักพัฒนา C # (และ Visual Studio) บังคับใช้การเปิดวงเล็บปีกกาในบรรทัดใหม่


30
การประชุมเป็นเพียงแค่ว่า
Oded

19
Visual Studio ไม่มีอะไรบังคับสไตล์ของรหัสสามารถกำหนดค่าได้ บางสิ่งจำเป็นต้องเป็นค่าเริ่มต้น สิ่งที่เริ่มต้นคือ "ดีกว่า" คือ bikeshedding ของลำดับสูงสุด
Phoshi

23
รั้งที่ท้ายบรรทัดเป็นมาตรฐาน K&R C โบราณ Kernighan และ Ritchie คิดค้นภาษา C เมื่อคอมพิวเตอร์แสดงผลได้ 25 บรรทัดเท่านั้น (23 ถ้าคุณเพิ่มหัวข้อและสถานะ) มันไม่ได้เป็นอย่างนั้นอีกต่อไปใช่ไหม? สิ่งสำคัญคือความสอดคล้องตลอดทั้งโครงการ นอกจากนี้ยังมีการศึกษาทางวิทยาศาสตร์แสดงให้เห็นว่าการรั้งในบรรทัดของตัวเอง (เยื้องไปที่ระดับเดียวกับรหัสในความเป็นจริง) ปรับปรุงการเข้าใจรหัสแม้จะมีคนคิดว่าพวกเขาคิดเกี่ยวกับความสวยงาม
Craig

10
C # รองรับการประเมินโค้ดบรรทัดเดียวเสมอหลังจากเงื่อนไขตามวิธีการ ในความเป็นจริงมันเป็นสิ่งเดียวที่ทำแม้กระทั่งตอนนี้ การใส่โค้ดในวงเล็บปีกกาหลังจากนิพจน์การแบรนช์ทำให้คำสั่งนั้นเป็น goto (คอมไพเลอร์สร้างขอบเขตโดยใช้คำสั่ง jmp) C ++, Java, C # และ JavaScript ทั้งหมดขึ้นอยู่กับ C ซึ่งมีกฎการแยกวิเคราะห์พื้นฐานเหมือนกันส่วนใหญ่ ดังนั้นในแง่นั้น C # จึงไม่ใช่ "อิงจาก Java"
Craig

10
ในฐานะที่เป็นบันทึกด้านข้างif(myBoolean == true)ทำให้ฉันมีความรู้สึกเล็กน้อย ในขณะที่เราอยู่ที่มันในขณะที่ไม่if ((myBoolean == true) == true)? แค่นี้if (myBoolean)ก็พอแล้ว ขออภัยสัตว์เลี้ยงของฉัน
Konrad Morawski

คำตอบ:


67

เส้นรอบวงในตอนท้ายของบรรทัดคือมาตรฐาน K&R C โบราณจากหนังสือของ Brian Kernighan และหนังสือของเดนนิสริตชี่The C Programming Languageซึ่งพวกเขาตีพิมพ์ในปี 1978 หลังจากคิดค้นระบบปฏิบัติการยูนิกซ์และภาษาซี (ฉันคิดว่า C คือ ส่วนใหญ่ออกแบบโดย Ritchie) ที่ AT&T

เคยมีสงครามไฟเกี่ยวกับ "สไตล์รั้งที่แท้จริง"

Ritchie คิดค้นภาษา C และ Kernighan เขียนบทช่วยสอนแรกเมื่อคอมพิวเตอร์แสดงข้อความเพียงไม่กี่บรรทัด ในความเป็นจริงการพัฒนา UNICS (ภายหลัง UNIX) เริ่มต้นในวันที่ DEC PDP-7 ซึ่งใช้เครื่องพิมพ์ดีดเครื่องพิมพ์และเทปกระดาษสำหรับส่วนต่อประสานผู้ใช้ UNIX และ C เสร็จสิ้นใน PDP-11 พร้อมเทอร์มินัลข้อความ 24 บรรทัด ดังนั้นพื้นที่แนวตั้งจึงสูงอย่างแน่นอน เราทุกคนมีจอแสดงผลที่ดีขึ้นเล็กน้อยและเครื่องพิมพ์ความละเอียดสูงกว่าในวันนี้ใช่ไหม? ฉันหมายถึงฉันไม่รู้เกี่ยวกับคุณ แต่ฉันมีสาม (3) 24 "1080p แสดงต่อหน้าฉันตอนนี้ :-)

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

สิ่งที่สำคัญอย่างแท้จริงคือความสอดคล้องตลอดทั้งโครงการหรืออย่างน้อยภายในไฟล์ซอร์สโค้ดที่กำหนด

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

if( true )
    {
    // do some stuff
    }

C # สนับสนุนการประเมินคำสั่งเดียวเสมอหลังจากนิพจน์การแยกสาขาโดยวิธีการ ในความเป็นจริงนั่นเป็นสิ่งเดียวที่ทำแม้กระทั่งตอนนี้ การใส่โค้ดในวงเล็บปีกกาหลังจากนิพจน์การแบรนช์ทำให้คำสั่งเดียวเป็น goto (คอมไพเลอร์สร้างขอบเขตโดยใช้คำสั่ง jmp) C ++, Java, C # และ JavaScript ทั้งหมดขึ้นอยู่กับ C ซึ่งมีกฎการแยกวิเคราะห์พื้นฐานเหมือนกันส่วนใหญ่ ดังนั้นในแง่นั้น C # จึงไม่ใช่ "อิงจาก Java"

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

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

if( true )
    doSomething();

กลายเป็น...

if( true )
    doSomething();
    doSomethingElse();

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

ยังฉันจะยอมรับว่า JavaScript ปิดไวยากรณ์ดูเหมือนโง่เล็กน้อยกับวงเล็บปีกกาในบรรทัดของตัวเอง ... aesthetically :-)


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

3
@ Craig โปรดจำไว้ว่านี่คือที่ Bell Labs ย้อนกลับไปเมื่อ Bell Labs ได้รับอนุญาตให้ "ทำสิ่งที่น่าสนใจ" ซึ่งไม่จำเป็นต้องเป็นประโยชน์สำหรับอะไร ทำให้คนฉลาดอยู่ในอาคารบอกให้พวกเขาทำวิจัยที่น่าสนใจย้ายพวกเขาออกจากสิ่งที่พวกเขาทำไม่ใช่ "น่าสนใจ" และเรื่องตลกสิ่งที่น่าสนใจ (เช่นทรานซิสเตอร์และ Unix) มีแนวโน้มที่จะโผล่ออกมา DARPA มีจุดเน้นที่เหมือนกันกลับมาในตอนเริ่มต้นและพวกเขาได้รับเงินจำนวนมากจากงานวิจัยพื้นฐาน
John R. Strohm

3
@Craig: ในวันเก่า Pascal / Delphi ฉันมักจะหลีกเลี่ยงมันสำหรับบล็อกบรรทัดเดียวเป็น Pascal ใช้beginและendแทนที่วงเล็บปีกกาซึ่งทำให้ข้อผิดพลาดดังกล่าวยากที่จะพลาดจริง ๆ และยังเข้มงวดเกี่ยวกับการวางตำแหน่งอัฒภาค - แต่มีการใช้จ่าย 4 วันที่แล้วในปีที่แล้วมีการดีบักปัญหาใน C ที่ฝังตัวซึ่งจบลงด้วยการขาดการจัดตำแหน่งของใครบางคน ..... ฉันคิดว่าควรมีตัวเลือกคอมไพเลอร์ซึ่งทำให้วงเล็บปีกกาบังคับใช้สำหรับคำสั่งควบคุม!
Mark K Cowan

12
กรุณาให้การอ้างอิงสำหรับ "... การศึกษาทางวิทยาศาสตร์แสดงให้เห็นว่ารั้งในสายของตัวเอง ... " หากไม่มีการอ้างอิงอย่างน้อยสองรายการ (มิฉะนั้นจะเป็นการศึกษาไม่ใช่การศึกษา ) มันเป็นการยิงแบบสุ่มขึ้นสู่อากาศ
ErikE

2
@ Craig คุณสามารถให้เบาะแสบางอย่างเกี่ยวกับวิธีการค้นหางานวิจัยที่คุณกล่าวถึงได้อย่างไร
Grzegorz Adam Kowalski

30

สาเหตุที่นักพัฒนา C # ทำเพราะเป็นค่าเริ่มต้นของตัวจัดรูปแบบอัตโนมัติของ Visual Studio ในขณะที่การตั้งค่านี้สามารถเปลี่ยนแปลงได้คนส่วนใหญ่ไม่ทำเช่นนั้นและนักพัฒนาทั้งหมดในทีมต้องไปกับคนส่วนใหญ่

สำหรับสาเหตุนี้เป็นค่าเริ่มต้นใน Visual Studio ฉันไม่รู้


15
มันเป็นค่าเริ่มต้นใน Visual Studio เพราะเป็นสไตล์การเขียนโค้ดที่เป็นที่ยอมรับโดยทั่วไปของ Microsoft ทางกลับและอันที่จริงแล้วอย่างน้อยบางทีมใน Microsoft สไตล์นั้นไม่ได้เป็นเพียงเครื่องมือจัดฟันในสายงานของตัวเอง และเยื้อง ดังนั้นนี่คือตัวเลือกใน Visual Studio เช่นกัน (โดยส่วนตัวแล้วผมชอบ)
Craig


5
@PreferenceBean อืม โดยส่วนตัวแล้วฉันไม่ชอบสไตล์ K&R เพราะวงเล็บหายไปในเสียงที่ปลายของบรรทัดและข้อความดูเหมือนเป็นก้อนกับฉันซึ่งไม่ได้เป็นเพียงความชอบด้านสุนทรียภาพ แต่มีผลกระทบต่อการอ่าน / ความเข้าใจที่แท้จริง ฉันชอบช่องว่างในแนวตั้ง มันแตกต่างกันเล็กน้อยในจอภาพ 12 "ที่มีข้อความ 24 บรรทัดย้อนกลับไปในสมัยก่อนเมื่อพื้นที่แนวตั้งมีค่า
Craig

10
@ Craig: นั่นเป็นข้อแก้ตัวสำหรับการเยื้องวงเล็บ: P
Lightness Races กับโมนิก้า

2
@Craig เพื่อให้พนักงาน Microsoft มีความสุข?
Mateen Ulhaq

18

ดังที่ฉันตั้งสมมติฐานไว้ในคำตอบนี้ที่นี่ - https://softwareengineering.stackexchange.com/a/159081/29029 - ฉันคิดว่าการตัดสินใจที่จะไปกับการค้ำยันของ Allman อาจเป็นสัญญาณของมรดก Pascal เนื่องจาก Hejlsberg สร้าง Delphi ก่อนที่เขาจะออกแบบ C # . เหมือนกับกรณี Pascal สำหรับชื่อเมธอด

ส่วนตัวผมเชื่อในการติดตามสุภาษิต "ในโรมทำตามที่ชาวโรมันทำ" ฉันใช้ Allman ใน C # แต่ K&R ใน Java ฉันเคยชินกับมันว่าการเปลี่ยนการประชุมเป็นวิธีที่สั่นสะเทือนฉัน

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


7
+1 สำหรับบรรทัด "นักพัฒนาหลายภาษา" จริง ๆ แล้ว ฉันชอบจัดฟันอย่างจริงจังในบรรทัดของตัวเองและเยื้อง อย่างไรก็ตามในการทำงานตัวอย่างเช่นโครงการ ASP.NET (MVC) ฉันพบว่าฉันชอบ C # ที่มีสไตล์ "ถูกต้อง" และ JavaScript ที่มีสไตล์ "JavaScript" นั่นเป็นแก้มเล็กน้อย แต่ส่วนที่ตรงไปตรงมาก็คือไวยากรณ์การปิด JavaScript นั้นน่าสนใจยิ่งขึ้นเมื่อใช้วงเล็บปีกกาที่ส่วนท้ายของบรรทัด ดังนั้นฉันมากที่สุดเท่าที่เป็นทาสเพื่อความสวยงามเป็นคนอื่น ...
เครก

PascalCase สำหรับชื่อเมธอดเป็นมาตรฐานที่ Microsoft มาเป็นเวลานานก่อนที่ Anders Hejlsberg จะออกจาก Borland ให้เป็นวิศวกรซอฟต์แวร์ที่มีชื่อเสียงของ Microsoft
Craig

2
ที่น่าสนใจคือฉันใช้ Allman สำหรับภาษาที่ถูกบล็อก อย่างไรก็ตามฉันเริ่มให้ความสนใจมากขึ้นในเรื่องการแปลงการเยื้องก่อนการแปลงเป็นบล็อกที่มีลักษณะโค้งเว้าใน Java รหัส "java" อาจดูสะอาดตาที่สุดเมื่อฉันห่อใจการจดจำรูปแบบของฉันไว้รอบ ๆ ฉันคิดว่าหลามอาจทำให้ถูกต้องจริง ๆ : ไม่มีเหตุผลที่ดีมากสำหรับการจัดฟันในภาษา
tgm1024

การใช้ช่องว่างเพื่อควบคุมโฟลว์ของโปรแกรมนั้นเป็นสิ่งที่ไม่ดี Python ได้รับความนิยมในทุกวันนี้ แต่ในแง่มุมของ Python นี้ค่อนข้างคลั่งไคล้ตั้งแต่ครั้งแรกที่ปรากฏ
Craig

@Craig Python fan ที่นี่พยายามทำสิ่งที่เป็นจาวาสคริปต์ ดูคำตอบอื่น ๆ ของคุณและแก้ไขเกี่ยวกับการgoto failใช้การเยื้องเพื่อควบคุมโฟลว์โปรแกรมเป็นสิ่งที่มนุษย์ต้องการทำตามธรรมชาติดังนั้นสิ่งที่คุณเห็นคือสิ่งที่เรียกใช้งาน หากมีการเยื้องที่ผิดมันธรรมดาไม่ทำงาน ต้องถอดรหัสความหมายของเครื่องหมายวงเล็บไม่ว่าพวกเขาจะสะท้อนการเยื้องจริงหรือไม่นั่นคือการทำงานเพิ่มเติมซ้ำแล้วซ้ำอีกในการทำความเข้าใจโปรแกรม การเยื้องนั้นซ้ำซ้อนกับเครื่องมือจัดฟันดังนั้นโปรแกรมเมอร์จะใช้งานอย่างไรหากเครื่องมือจัดฟันมีประโยชน์ การทำรังแบบลึกนั้นไม่สามารถเข้าใจได้ในทุกภาษา Jus 'sayin'
Neil_UK

14

แบบแผนที่คุณเชื่อมโยงกับ Java เป็นสไตล์ K&R หรือ "รูปแบบวงเล็บปีกกาหนึ่งอันที่จริง" และเริ่มแรกมาจาก C. หน้านี้เยื้องสไตล์จากไฟล์ Jargon ที่น่าเคารพนับถือแสดงให้เห็นถึงความแตกต่างที่เก่าแก่

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


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