การจัดฟันแบบหยิกควรปรากฏบนเส้นของตัวเองหรือไม่? [ปิด]


273

การจัดฟันแบบหยิกควรอยู่ในแนวของตนเองหรือไม่? คุณคิดยังไงกับเรื่องนี้?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

หรือมันควรจะเป็น

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

หรือแม้กระทั่ง

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

โปรดสร้างสรรค์! อธิบายว่าทำไมแบ่งปันประสบการณ์สำรองข้อมูลด้วยข้อเท็จจริงและการอ้างอิง


104
ฉันพบว่า "== จริง" เสียสมาธิมากกว่าการเลือกตำแหน่งรั้ง
Dan Dyer

11
@ ด่าน: ฉันคิดว่าการอธิบายการแสดงออกตามเงื่อนไขช่วยอย่างชัดเจนเป็นอย่างมาก
Wizard79

4
เหตุผลเดียวที่เรื่องนี้จะเกิดขึ้นก็คือถ้า IDE / ตัวแก้ไขของคุณไม่รองรับการรู้จำแบบวงเล็บปีกกาที่ตรงกัน
leeand00

4
@ leeand00: พวกเราบางคนยังพิมพ์รหัสที่ซับซ้อน / ไม่คุ้นเคยเพื่อศึกษา / ใส่คำอธิบายประกอบ เครื่องพิมพ์สวยดีช่วยลดปัญหาส่วนใหญ่ได้
Shog9

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

คำตอบ:


88

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

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

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


6
ในทางกลับกันรั้งในบรรทัดใหม่คือ ANSI STANDARD ไม่ใช่ K&R แต่ความงามเกี่ยวกับมาตรฐานคือมีสิ่งต่าง ๆ มากมาย (ดูuncyclopedia.wikia.com/wiki/AAAAAAAAA ! บน uncyclopedia)
Quandary

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

1
@ 12431234123412341234123: ฉันคิดว่าเขาหมายถึงเพราะบางคนพิมพ์รหัสเพื่อตรวจสอบรหัส และขึ้นบรรทัดใหม่ที่ไม่จำเป็นอย่างยิ่งแต่ละอย่างคือกระดาษเสียหรือฟอเรสต์²กิโลเมตรเสียขนาด อย่างไรก็ตามหากคุณไม่พิมพ์ออกมา (ฉันไม่แน่ใจ) ANSI นั้นดีกว่า K&R มาก นอกจากนี้ใครก็ตามที่ต้องการพิมพ์ควรใช้ฟอร์แมตโค้ดอัตโนมัติ - ดังนั้นนี่ควรเป็นคำถามของการใช้เครื่องมือไม่ใช่รูปแบบการเข้ารหัส
แน่ใจ

247

คุณไม่ควรทำวิธีที่ 3

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

เขียนรหัสของคุณเพื่อคนอื่น


113
ฉันหวังว่าฉันจะรู้ว่าภูมิปัญญาเล็ก ๆ น้อย ๆ เกิดขึ้นที่ไหน เพราะการเขียนโค้ดของคุณสำหรับคนที่ไม่สนใจที่จะอ่านมันเป็นเรื่องไร้สาระอย่างที่คุณจะได้รับ ...
Shog9

69
โปรแกรมเมอร์ที่สองสามารถเพิ่มเครื่องมือจัดฟันของเขาเองเมื่อเขาเพิ่มบางอย่าง เขาไม่ได้โง่และในการเขียนโปรแกรมที่ส่งเสริมให้ละเว้นการจัดฟันสำหรับสิ่งที่ง่ายเช่นนี้เขาจะรู้ว่าจะมอง
Ken Bloom

25
เครื่องมือจัดฟันไม่จำเป็น มีการตัดสินใจในการออกแบบที่แย่กว่าเล็กน้อยที่ทำใน C และส่งต่อไปยังลูกหลานของมัน มันมีชีวิตอยู่ในภาษาเมื่อเร็ว ๆ นี้เมื่อ C # ทำให้ฉันโกรธ
Adam Crossland

28
ไม่สำคัญว่าคุณเป็นคนฉลาดแค่ไหนหรือมีวิธีการฝังมาตรฐานการเข้ารหัสในบรรทัดเดียวที่ละไว้ แต่ถ้าคุณกำลังมองหาวิธีแก้ปัญหาหรือข้อบกพร่อง และสำหรับงานที่ยิ่งใหญ่ทั้งหมด 2 วินาทีมันเลวร้ายจริงๆหรือที่จะชัดเจน?
Jordan

11
มีข้อได้เปรียบอย่างหนึ่งในการจัดอันดับ # 3 ที่คุณหายไป: คุณได้รับโค้ดเพิ่มเติมบนหน้าจอของคุณในครั้งเดียว
Loren Pechtel

203

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

เป็นที่สอดคล้องกันเป็นสิ่งที่สำคัญแม้ว่า ฉันเลยบอกว่าให้เราพลิกเหรียญแล้วเขียนโค้ด

ฉันเคยเห็นโปรแกรมเมอร์ต่อต้านการเปลี่ยนแปลงเช่นนี้มาก่อน ได้รับมากกว่านั้น! ฉันเปลี่ยนอาชีพของฉันหลายครั้ง ฉันใช้สไตล์ที่แตกต่างใน C # ของฉันมากกว่า PowerShell ของฉัน

ไม่กี่ปีที่ผ่านมาฉันทำงานกับทีม (นักพัฒนา ~ 20 คน) ที่ตัดสินใจขอข้อมูลจากนั้นทำการตัดสินใจจากนั้นจึงบังคับใช้สิ่งนั้นในทุกรหัสฐาน เรามีเวลา 1 สัปดาห์ในการตัดสินใจ

คร่ำครวญและน่าเกรงขามมากมาย "ฉันชอบวิธีของฉันเพราะมันดีกว่า" มากมาย แต่ไม่มีเนื้อหา

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

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

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

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

เราได้อ่านเกี่ยวกับวิธีที่ผู้คนทั่วโลกจัดการกับปัญหานี้และพบรูปแบบของการเพิ่มบรรทัดว่างหลังจากวงเล็บปีกกาเปิด:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

หากคุณกำลังจะหยุดพักสายตาคุณก็สามารถทำได้ด้วยการทำรั้ง จากนั้นทัศนวิสัยของคุณก็จะสม่ำเสมอเช่นกัน

แก้ไข : สองทางเลือกในโซลูชัน 'บรรทัดว่างพิเศษ' เมื่อใช้ K&R:

1 / เยื้องข้อโต้แย้งการทำงานแตกต่างจากร่างกายฟังก์ชั่น

2 / ใส่อาร์กิวเมนต์แรกในบรรทัดเดียวกันกับชื่อฟังก์ชั่นและจัดเรียงอาร์กิวเมนต์เพิ่มเติมในบรรทัดใหม่กับอาร์กิวเมนต์แรก

ตัวอย่าง:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/ แก้ไข

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


33
FYI ฉันอาจฟังดูเป็นคนที่สมเหตุสมผล แต่จริงๆแล้วฉันเป็นคนบ้า สำหรับบล็อกแบบบรรทัดเดียวที่เรียบง่ายฉันจะไม่ใช้การจัดฟันหรือการขึ้นบรรทัดใหม่โดยสร้าง 'if (foo) bar ()' ทั้งหมดหนึ่งบรรทัด ฉันพยายามทำให้โค้ดของฉันง่ายพอที่จะไม่เป็นปัญหา
Jay Bazuzi

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

27
ฉันไม่เห็นบรรทัดว่าง - ฉันคุ้นเคยกับการเยื้องของพารามิเตอร์สำหรับ MyFunction () มากขึ้นเมื่อพวกเขาหลงทางไปยังอีกบรรทัดหนึ่ง
อาร์มันด์

34
การแบ่งพารามิเตอร์ออกเป็นหลายบรรทัดเช่นที่ทำให้คลั่ง
Fosco

10
อาร์กิวเมนต์ "function parameter" เป็นปลาเฮอริ่งแดง เห็นได้ชัดว่าข้อโต้แย้งควรจะเป็นสองเท่า ไม่มีปัญหาใด ๆ ที่จะแยกความแตกต่างจากรหัสต่อไปนี้
David Ongaro

99

กฎสำคัญคือ:

  1. ปฏิบัติตามมาตรฐานการเข้ารหัสที่มีอยู่ของโครงการ
  2. หากไม่มีมาตรฐานการเข้ารหัสและคุณกำลังแก้ไขฐานรหัสที่มีอยู่ของบุคคลอื่น - ให้สอดคล้องกับสไตล์ของรหัสที่มีอยู่ไม่ว่าคุณจะชอบ / ไม่ชอบก็ตาม
  3. หากคุณกำลังทำงานในโครงการกรีนฟิลด์ - พูดคุยกับสมาชิกในทีมอื่นและมาที่ฉันทามติเกี่ยวกับมาตรฐานการเข้ารหัสที่เป็นทางการหรือไม่เป็นทางการ
  4. หากคุณกำลังทำงานในโครงการกรีนฟิลด์ในฐานะผู้พัฒนาเพียงผู้เดียวจงตัดสินใจด้วยตนเองและจากนั้นก็จะสอดคล้องกันอย่างโหดเหี้ยม

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

ในที่สุดสไตล์ที่นำไปใช้ / นำไปใช้งานโดยใช้ตัวตรวจสอบลักษณะที่มีอยู่และตัวจัดรูปแบบโค้ดจะดีกว่ารูปแบบที่ต้อง "บังคับใช้" ด้วยตนเอง


10
คำตอบนี้สมควรได้รับการโหวตมากขึ้น
AShelly

1
ความสอดคล้องคือกุญแจสำคัญ
MediaVince

70

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

ฉันไม่เห็นเหตุผลที่จะต้องเสียทั้งบรรทัดสำหรับวงเล็บเมื่อคำสั่ง for / while / if ก่อนหน้านี้แสดงให้เห็นถึงจุดเริ่มต้นของบล็อกแล้ว

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


12
ไม่ ... ฉันกำลังบอกว่าทำไมลดจำนวนรหัสที่พอดีกับหน้าจอของคุณด้วยการทำสิ่งที่ไม่เพิ่มความชัดเจนของรหัส
EpsilonVector

6
เมื่อฉันเริ่มเขียนโค้ดฉันชอบวงเล็บปีกกาแต่ละอันในสายของตัวเองตอนนี้ฉันชอบวิธีแรก
NimChimpsky

57
มีงานวิจัยจำนวนมากกลับไปสู่ยุค Steam ยุคแรก (Weinberg, "จิตวิทยาการเขียนโปรแกรมคอมพิวเตอร์") ซึ่งแสดงให้เห็นว่าความเข้าใจของโปรแกรมเมอร์นั้นลดลงอย่างมากเมื่อจำนวนรหัสที่ต้องดูนั้นมากกว่า สามารถเห็นได้ในครั้งเดียว (เช่นหน้าจอหนึ่งหน้าเครื่องพิมพ์หนึ่งหน้า) ปรากฏการณ์นี้ให้เหตุผลอย่างมากสำหรับการดูพื้นที่แนวตั้งว่าเป็นทรัพยากรที่มีค่าไม่ต้องเสียเปล่าและเป็นวิธีแรกที่ต้องการ
John R. Strohm

10
LOL @ "การสิ้นเปลืองสายทั้งหมด" พระเจ้าช่วย! ไม่ว่า!! = P
Nick Spreitzer

6
@Julio ในวิทยาลัยฉันชอบวิธีที่ 1 อย่างยิ่งและไม่สามารถยืนอ่านวิธีที่ 2 ได้หลังจากทำงานที่ บริษัท ที่ใช้ C # ซึ่งมาตรฐานคือวิธีที่ 2 ฉันก็ชอบแบบนั้นเช่นกัน ตอนนี้ฉันสามารถอ่านหรือใช้อย่างใดอย่างหนึ่ง; ไม่มีใครมารบกวนฉัน คนที่มีปฏิกิริยารุนแรงเกลียดชังอย่างใดอย่างหนึ่งโดยทั่วไปมักจะทำปฏิกิริยากับสิ่งที่พวกเขาไม่คุ้นเคย
KChaloux

46

ฉันชอบ

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

เกิน

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

เพราะบรรทัดyou.postAnswer();นั้นง่ายต่อการอ่านและค้นหาได้อย่างรวดเร็วก่อน ในวิธีที่สองมันได้รับการผสมกับบรรทัดด้านบน ( you.hasAnswer()) ทำให้ตาของฉันต้องโฟกัสมากขึ้นเพื่ออ่าน


7
สิ่งนี้เป็นจริงจนกว่าโปรแกรมของคุณจะสูงเกินความสูงของหน้าจอ ;)
weberc2

13
@ weberc2 ฉันคิดว่าเมื่อโปรแกรมของคุณเกินความสูงของหน้าจอสองบรรทัดที่น้อยกว่าจะไม่เปลี่ยนแปลงมากนัก
กีค

13
10 ปีที่แล้วฉันจะได้ตกลงเกี่ยวกับพื้นที่หน้าจอ วันนี้ฉันใช้หน้าจอ 1920 * 1200 มันพอดีกับรหัสมากมายมากกว่าสมองของฉันสามารถประมวลผลได้ในครั้งเดียว วิธีแรกให้ฉันดึงกลับและดูขอบเขตการเปิด / ปิดขอบเขตที่แตกต่างกันโดยไม่ต้องอ่าน
LightStriker

3
ฉันไม่เคยเข้าใจเลยว่าทำไมฉันถึงชอบวิธีนี้ แต่มันก็เป็นแบบนี้
Declan McKenna

2
@Mageek นี่คือล่าช้า แต่มันไม่ได้ 2 บรรทัดมันเป็น 2 สายสำหรับทุกขอบเขต นั่นคือ O (N) ไม่ใช่ O (1) ฉันไม่ได้รู้สึกอย่างนั้นจริงๆ มันสำคัญกว่าที่คุณจะเลือกสไตล์ที่ทำให้รายการพารามิเตอร์แบบยาวสามารถอ่านได้
weberc2

38

ฉันชอบวิธีแรก เครื่องมือจัดฟันนั้นไม่คุ้มค่ากับการแยกกัน

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

มีภาษา (Python, Haskell, Ruby) ซึ่งใช้ได้โดยไม่ต้องใส่เครื่องหมายวงเล็บเลย สิ่งนี้เป็นการยืนยันว่าเครื่องหมายวงเล็บเป็นถังขยะเท่านั้นและไม่ควรได้รับเส้นตรงเมื่อเป็นไปได้:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
ฉันไม่รู้เกี่ยวกับ Haskell หรือ Ruby แต่ Python เป็นช่องว่างที่ไวต่อความรู้สึกซึ่งเป็นเหตุผลว่าทำไมมันไม่จำเป็นต้องใช้เครื่องมือจัดฟันหรือตัวคั่นอื่น ๆ เพื่อแสดงถึงบล็อก เครื่องมือจัดฟันไม่เพียง แต่สร้างเสียงรบกวนเท่านั้น พวกเขาตอบสนองวัตถุประสงค์ที่แท้จริง
Robert Harvey

14
@ Robert ใน C คุณต้องทำทั้งช่องว่างและวงเล็บปีกกา ใน Python คุณควรทำแค่ช่องว่างเท่านั้น ไหนดีกว่ากัน
P Shved

5
@Pavel ใน C 'คุณไม่จำเป็นต้องทำ whitepace
Ken Bloom

7
@KenBloom โปรแกรม C ที่ไม่มีช่องว่างเป็นไปไม่ได้ที่จะอ่าน ดังนั้นคุณต้องทำมันต่อไป
P Shved

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

37

ใช้ Python และก้าวเท้าเลี่ยงการโต้เถียงอย่างสมบูรณ์


17
+1SyntaxError: not a chance
เซท

6
นี่ไม่ใช่ตัวเลือกสำหรับโครงการส่วนใหญ่ที่กว้างใหญ่ นอกจากนี้การเยื้องสำหรับการจัดกลุ่มก็มีปัญหาร่วมกัน
Bryan Oakley

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

ใช้ไปและก้าวเท้าเลี่ยงอาร์กิวเมนต์อย่างสมบูรณ์ (รวมถึงการพิมพ์แบบคงที่ความเร็วและคอมไพเลอร์!) :)
weberc2

4
จากนั้นกดแป้นเว้นวรรคหนึ่งครั้งเกินไปและดูผู้แปล / ล่ามหัวเราะเยาะคุณ สิ่งนั้นจะไม่เกิดขึ้นในภาษาที่มีการโยงมากที่สุด
Pharap

27

ตำแหน่งของเครื่องมือจัดฟันแบบหยิกควรเป็น

ข้อมูลเมตา

สามารถกำหนดค่าได้ใน IDE โดยโปรแกรมเมอร์ ด้วยวิธีนี้วงเล็บปีกกาที่น่ารำคาญในรหัสทั้งหมดโดยไม่คำนึงถึงผู้แต่งดูเหมือนกัน


7
เห็นด้วยอย่างสิ้นเชิง. มันเป็นการนำเสนอและไม่ใช่ข้อมูล
Petruza

ปัญหาคือถ้าคุณปล่อยให้ทุกคนตั้งค่าของตัวเองสิ่งต่าง ๆ จะยุ่งเหยิงอย่างรวดเร็วเมื่อทำเสร็จแล้ว
Andy

1
@Andy: นั่นคือจุดที่ IDE จะเปลี่ยนวิธีการที่พวกเขามอง แต่เฉพาะใน IDE! แหล่งที่มาจริงจะไม่ถูกสัมผัส สำหรับการควบคุมเวอร์ชันคุณสามารถเพิ่ม hooks ที่แปลสิ่งที่การตั้งค่าสำหรับวงเล็บปีกกาเป็นสถานการณ์ทั่วไปเพื่อให้ทุกคนตรวจสอบรหัสในลักษณะเดียวกัน
klaar

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

@Andy: ไม่มีความเป็นไปได้ที่จะใช้ hooks ที่แปลงความคลาดเคลื่อนเหล่านั้นเกี่ยวกับช่องว่างและเครื่องหมายปีกกาให้เป็นรูปแบบมาตรฐานที่ใช้ในการหลีกเลี่ยงปัญหาเสียงรบกวนที่คุณอธิบายไว้หรือไม่ ทั้งสองวิธีระบบเวอร์ชันที่เหมาะสมควรอยู่เหนือสิ่งต่าง ๆ เช่นช่องว่างหรือสิ่งไร้สาระอื่น ๆ
klaar

19

มันขึ้นอยู่กับ.

ถ้าฉันกำลังเข้ารหัสใน Javascript หรือ jQuery ฉันจะใช้แบบฟอร์มแรก:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

แต่ถ้าฉันเข้ารหัสใน C # ฉันจะใช้แบบฟอร์มที่สองเพราะนั่นเป็นวิธีที่บัญญัติในการทำใน C #

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

โปรดทราบว่าตัวอย่างของคุณสามารถเขียนได้

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

ใน C #


1
มันสามารถเขียนในหลายภาษาเช่นนั้นเพราะคำสั่งบล็อกเป็นคำสั่ง เพิ่ม! :-)
Tamara Wijsman

2
ตามที่ "แนวทางการออกแบบกรอบ" "วิธีบัญญัติ" คือการวางวงเล็บเปิดในบรรทัดเดียวกัน (เช่นรูปแบบแรก) เพียงแค่พูดใน ...
Uwe Honekamp

3
@ เรา: บางที แต่ไมโครซอฟท์นำมาใช้วิธีการ "จัดฟันชิด" สำหรับทุก MSDN C # ตัวอย่างของมันและมันอบเป็น Visual Studio ดังนั้น ...
โรเบิร์ตฮาร์วีย์

@Uwe: นั่นคือหนังสือของ Cwalina และมันมีชื่ออย่างมากเพราะมันมากกว่านั้น FDG บน MSDN ไม่มีอะไรจะพูดเกี่ยวกับเรื่องนี้ นอกจากนี้ผมสงสัยว่าทำไมจะกรอบ การออกแบบแนวทางการพูดอะไรเกี่ยวกับC # การเขียนโปรแกรมการปฏิบัติ?
R. Martinho Fernandes

3
ในความเป็นจริงคุณควรใส่เครื่องหมายปีกกาบนบรรทัดเดียวกันใน Javascript คุณสามารถทำให้เกิดข้อผิดพลาดหากวงเล็บปีกกาอยู่บนเส้นของตัวเอง ตัวอย่างเช่นดูencosia.com/…
Joseph Hansen

18

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

if (value > maximum);
{
    dosomething();
}

กว่าที่เป็นในตัวอย่างนี้

if (value > maximum); {
    dosomething();
}

การที่ฉัน; {ดูผิดไปกว่าการเขียนบรรทัดที่ลงท้ายด้วย;ดังนั้นฉันจึงมีแนวโน้มที่จะสังเกตเห็น


11
คุณทำให้การโต้เถียงที่ดี แต่โดยส่วนตัวสิ่งนี้เกิดขึ้นกับฉันเพียงครั้งเดียวในการเขียนโปรแกรม 5 ปีของฉัน ฉันคิดไม่ออกว่าทำไมมันถึงไม่ดำเนินการโพสต์ไว้บน SO และมีใครบางคนชี้ให้ฉันเห็นลำไส้ใหญ่ อย่างไรก็ตามทุกครั้งที่มีการย่อให้ใช้ 1 บรรทัดที่น้อยกว่าฉันพบว่าอ่านยากขึ้น
JD Isaacks

6
The "; {" ดูเหมือนจะเป็นใบหน้าที่ไม่พอใจหรืออาจเป็นคนที่มีหนวด
glenatron

+1 ตัวอย่างที่ดีในการตอบ: ความผิดพลาดเล็กน้อยมองข้ามได้ง่าย คิดว่าเป็นการยั่วยุบนเค้าโครงที่แสดงสิ่งนี้
therobyouknow

10
แน่นอนว่า IDE ที่เหมาะสมจะทำเครื่องหมายคำสั่งควบคุมที่ว่างเปล่าและคอมไพเลอร์ที่เหมาะสมจะออกคำเตือน
Dunk

@Dunk ข้อบกพร่องเพียงอย่างเดียวในข้อโต้แย้งของคุณ (ซึ่งฉันเห็นด้วยอย่างแรง) คือผู้คนจำนวนมากกำลังใช้ภาษาที่ถูกตีความวันนี้ (JavaScript, PHP, และอื่น ๆ ) ที่ "โปรแกรมเมอร์" จำนวนมากไม่รู้จักคอมไพเลอร์จากคู่ ลาเต้.
Craig

15

ฉันชอบความแตกต่างเล็กน้อยจาก 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

ทำไม?

  • ผมคิดเสมอ วางวงเล็บในบรรทัดของตัวเองลดลงการอ่าน ฉันสามารถใส่ซอร์สโค้ดจำนวนหนึ่งลงบนหน้าจอของฉันได้เท่านั้น ลักษณะ Bracket 2) ทำให้อัลกอริธึมมีลูปซ้อนกันและมีเงื่อนไขที่ยาวมาก

  • อย่างไรก็ตามฉันต้องการelseเริ่มต้นในบรรทัดใหม่เพราะifและelseอยู่ด้วยกันด้วยสายตา หากมีวงเล็บอยู่ด้านหน้าelseมันจะยากมากที่จะตรวจสอบสิ่งที่เป็นของ

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


1
ฉันเห็นสิ่งนี้รอบ ๆ ที่ที่ฉันทำงานอยู่ มันน่าสนใจ
Almo

1
ฉันชอบสไตล์นี้ดีกว่าเพราะช่วยให้ฉันใส่ความคิดเห็นไว้เหนือelseบรรทัดเมื่อต้องการและ / หรือใส่บรรทัดว่างระหว่าง if-block และบล็อกอื่นเพื่อทำให้สิ่งต่าง ๆ ดูหนาตาลง Bracket style # 2 ไม่ได้เป็นการทำสิ่งใดนอกจากการบิดเบือนการกระทำ ด้วยที่กล่าวว่ารายการโปรดของฉันคืองูเหลือมแบบไม่มีวงเล็บแน่นอน :)
sayap

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

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

10

ฉันได้อ่านที่ไหนสักแห่งที่ผู้แต่งหนังสือบางเล่มต้องการโค้ดของพวกเขาในรูปแบบนี้:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

แต่ข้อ จำกัด ด้านพื้นที่จากผู้เผยแพร่หมายความว่าพวกเขาต้องใช้สิ่งนี้:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

ตอนนี้ฉันไม่รู้ว่ามันเป็นเรื่องจริง (เพราะฉันหามันไม่ได้อีกแล้ว) แต่สไตล์หลังนี้แพร่หลายมากในหนังสือ

ในระดับส่วนบุคคลฉันชอบวงเล็บในบรรทัดแยกเป็น:

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


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

10

ah, หนึ่งทรูสไตล์รั้ง

มันมีทุกสิ่งที่จำเป็นสำหรับทางศักดิ์สิทธิ์ - แม้กระทั่งผู้เผยพระวจนะ (ริชาร์ด "ทางของฉันหรือทางหลวง" สตอลแมน)

ชายคนนี้ผิดเกี่ยวกับหลายสิ่งหลายอย่างมาก แต่ GNU เป็นจุดเมื่อพูดถึงการจัดฟัน


[อัพเดท] ฉันได้เห็นแสงสว่างและตอนนี้ก็เคารพบูชาAllman


9
ฉันไม่เห็นจุดของรูปแบบ GNU นอกเหนือจากที่กล่าวไว้ในแบบ lisp code ดูเหมือนว่าจะทำงานมากมายเพื่อผลประโยชน์เพียงเล็กน้อย
Robert Harvey

ฉันรู้ว่าไม่มีใครใช้รูปแบบของ GNU 1TBS ตลอดทาง
Jé Queue

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

4
+1 สำหรับลิงก์ในสไตล์รั้ง มันแสดงให้เห็นว่าไม่ว่าสไตล์ของคุณจะเป็นอย่างไร
Florian F

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

9

ตัวอย่างที่สองฉันใหญ่มากในการอ่าน ฉันทนไม่ไหวที่จะดูว่าบล็อกอื่น ๆ =


1
การวิจัยระบุว่าการอ่านรหัสขนาดกะทัดรัดง่ายกว่าเมื่อฐานรหัสเกินความสูงของหน้าจอ
weberc2

5
@ weberc2 คุณสามารถให้ DOIs กับรายงานการวิจัยเหล่านั้นได้หรือไม่?
Grzegorz Adam Kowalski

9

คำตอบง่ายๆ: การดีบักง่ายกว่าอะไร?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

คุณวินิจฉัยปัญหานี้ในกรณีใดก่อน

ฉันไม่สนใจความชอบส่วนบุคคลมากนัก (มีหลายสไตล์รวมถึง whitesmith และ al.) และฉันไม่สนใจมาก ... ตราบใดที่มันไม่ได้ขัดขวางความสามารถในการอ่านรหัสและดีบักมัน

ตามอาร์กิวเมนต์ "เปลืองพื้นที่" ฉันไม่ซื้อ: ฉันมักจะเพิ่มบรรทัดว่างระหว่างกลุ่มตรรกะต่อไปเพื่อให้โปรแกรมชัดเจนขึ้น ...


1
พวกเขาทั้งคู่เป็นเรื่องง่ายที่จะดีบั๊กส่วนใหญ่เป็นเพราะมันเป็นบล็อกสั้น ๆ การเยื้องสอดคล้องกันทำให้ง่ายต่อการมองเห็นบล็อกรหัสจริง
Htbaa

@Htbaa: แน่นอน :) ทำไมต้องรำคาญ?
Matthieu M.

@MatthieuM บล็อกแรกมีเหตุผลสำหรับฉันมากขึ้นเนื่องจากบรรทัดใหม่ (ในบล็อกที่สอง) ระหว่างลายเซ็นของฟังก์ชัน for-statement และ if-statement ทำให้ฉันเชื่อว่ามันไม่เกี่ยวข้อง แต่ชัดเจนว่าไม่ใช่ บรรทัดว่างเป็นการแยกบิตของโค้ดที่ไม่เกี่ยวข้อง รหัสที่อยู่ใกล้กับบรรทัดอื่น ๆ ของรหัสหมายความว่าพวกเขามีความเกี่ยวข้องในความเป็นจริง ทั้งหมดนี้เป็น 'imo' แน่นอน แต่ฉันสงสัยว่าประเด็นของคุณคืออะไร แก้ไข: นอกจากนี้ IDE ใด ๆ ที่เหมาะสมจะสังเกตเห็นวงเล็บปีกกาที่ขาดหายไปและให้คุณรู้แค่หางอึ่งข้อผิดพลาดเมื่อตีความรหัสของคุณ
klaar

7

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

ใน C นี่คือโครงสร้างที่ถูกต้อง:

ในขณะที่ (จริง);
{
    ถ่านค;
    getchar (); // รอการป้อนข้อมูล
}

ด่วน! รหัสนี้ทำอะไร? หากคุณตอบว่า "วงวนไม่สิ้นสุดขอให้ป้อนข้อมูล" คุณผิด! มันไม่ได้ไปที่อินพุต while(true)จะได้รับการติดที่ สังเกตุว่าอัฒภาคท้าย รูปแบบนี้เป็นเรื่องธรรมดามากที่ดูเหมือนว่าควรจะเป็น; C กำหนดให้คุณต้องประกาศตัวแปรของคุณที่จุดเริ่มต้นของบล็อกซึ่งเป็นสาเหตุที่เริ่มใหม่

บรรทัดของรหัสคือความคิด เครื่องมือจัดฟันเป็นส่วนหนึ่งของความคิดที่มีเงื่อนไขหรือห่วง ดังนั้นจึงอยู่ในบรรทัดเดียวกัน


นี่เป็นข้อโต้แย้งที่ดีที่สุดสำหรับสไตล์ K&R ที่ฉันเคยเห็นส่วนที่เหลือน่าหัวเราะกับระบบ IDE ในปัจจุบันที่รองรับการพับโค้ด สิ่งนี้ใช้เฉพาะกับภาษาสไตล์ C ที่รองรับการ;บล็อกสิ้นสุด นี่คือเหตุผลที่ฉันดูถูกระบบการสิ้นสุดการบล็อกนี้ซึ่ง IMHO ล้าสมัยและภาษา Go พิสูจน์ได้ ฉันเคยเห็นปัญหานี้หลายครั้งแม้ว่าจะไม่ได้อยู่ในสถานการณ์นี้ มันมักจะเกิดขึ้นที่พวกเขาตั้งใจจะเพิ่มบางสิ่งบางอย่างในคำสั่งและลืม
Jeremy

5

ฉันชอบวิธีแรก ดูเหมือนว่าจะเป็น IMO ที่สั้นกว่าและกะทัดรัดกว่าที่ฉันชอบ

แก้ไข: อ่าหนึ่งในสาม ฉันชอบที่ดีที่สุดเมื่อเป็นไปได้เพราะมันมีขนาดเล็กลง / neater


5

คุณสามารถเขียนมัน:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

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


ที่จะใช้เช่นนั้นpostAnswer()และdoSomething()ควรส่งกลับค่าสำหรับผู้ประกอบการที่สามซึ่งมักจะไม่กรณี: พวกเขาสามารถคืนโมฆะ (ไม่มีค่า) เป็นอย่างดี และ (อย่างน้อยใน c #) ผลลัพธ์ของ?:ควรถูกกำหนดให้กับตัวแปรบางตัว
ASh

4

คำตอบเกือบทั้งหมดในที่นี้พูดถึงการเปลี่ยนแปลงบางอย่างเกี่ยวกับ "ไม่ว่าคุณจะทำอะไร

ดังนั้นฉันจึงคิดอยู่ครู่หนึ่งและต้องยอมรับว่าฉันไม่เห็นว่ามันสำคัญ ใครสามารถบอกฉันได้อย่างสุจริตว่าสิ่งต่อไปนี้ยากที่จะติดตาม

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

ฉันไม่แน่ใจเกี่ยวกับคนอื่น ... แต่ฉันมีปัญหาอย่างไม่มีศูนย์ทางจิตใจสลับไปมาระหว่างสไตล์ ฉันใช้เวลาสักครู่เพื่อค้นหาว่าโค้ดทำอะไร แต่นั่นเป็นผลมาจากฉันที่เพิ่งพิมพ์ไวยากรณ์ C-like แบบสุ่ม :)

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

FWIW สไตล์การเขียนโค้ดของเราในที่ทำงานใช้รูปแบบที่มีโครงสร้างมากขึ้นเล็กน้อย 1 และแบบฟอร์มที่แก้ไข 3 (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

ฉันอยากรู้ว่าผู้ที่ชอบแบบฟอร์ม 2 มากจะพบว่าแบบฟอร์ม 1 นี้ดีกว่าหรือเปล่าเพียงเพราะบรรทัดว่างให้ภาพแยกที่ชัดเจนขึ้น


4
ดังตัวอย่างของคุณที่แสดงการเยื้องนั้นสำคัญกว่าการจัดฟันสำหรับรหัสที่อ่านได้ อันที่จริงบางภาษาทำให้การเยื้องเป็นวิธีเดียวที่จะซ้อนคำสั่ง!

1
โอเคฉันจริง ๆ แล้วคุณพบว่าตัวอย่างที่ไม่สอดคล้องกันอ่านยาก ไม่ยากจริงๆ แต่ยากกว่าถ้ามันสอดคล้องกัน
Almo

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

@Dunk: ฉันไม่สามารถเข้าใจรหัสที่จะได้รับการปรับปรุงให้ดีขึ้นอย่างเห็นได้ชัดโดยการแลกเปลี่ยนรายละเอียดที่ไม่เกี่ยวข้องเช่นนั้น
jkerian

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

4

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

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

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


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

2

ฉันชอบวิธีที่สองเป็นการส่วนตัว

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

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
ไม่ดีแย่ฉันหมายถึงตัวอย่างที่แย่มาก ปัญหาไม่ใช่การจัดฟัน! มันเป็นการเยื้องที่บ้าคลั่ง!
R. Martinho Fernandes

@Martinho Fernandes ฉันคิดว่าการจัดฟันและการเยื้องไปด้วยกัน ...
AndrejaKo

2
ไม่จำเป็นต้อง ... ทำการเยื้องที่เหมาะสมด้านบนแล้วสุ่มเปลี่ยนรูปแบบการรั้งคุณจะพบว่ามันเข้าใจได้
jkerian

ที่จริงแล้วการคิดเกี่ยวกับสิ่งนี้ทำให้ฉันมีคำตอบสำหรับคำถามนี้
jkerian

"95% ของข้อบกพร่องในโปรแกรมที่เขาทำมาจากวงเล็บปีกกาไม่ตรงกัน" - เฉพาะในภาษาที่ตีความไม่ได้รวบรวม
Mawg

2

ความชอบส่วนตัวของฉันสำหรับวิธีแรกอาจเป็นเพราะนั่นคือวิธีที่ฉันเรียนรู้ PHP ครั้งแรก

สำหรับifคำสั่งบรรทัดเดียวฉันจะใช้

if (you.hasAnswer()) you.postAnswer();

หากไม่ใช่you.postAnswer();แต่มีบางสิ่งที่ยาวกว่ามากเช่นyou.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);ฉันอาจเปลี่ยนกลับไปใช้ประเภทแรก:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

ฉันจะไม่ใช้ตัวแบ่งบรรทัดและฉันจะไม่ใช้วิธีนี้หากมีelseคำสั่งด้วย

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

เป็นไปได้ทางทฤษฎี แต่ไม่ใช่สิ่งที่ฉันเคยใช้ สิ่งนี้จะต้องกลายเป็น

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

พวกเขาไม่ควร; วิธีแรกสำหรับฉัน

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

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

บวกตามที่ระบุไว้แล้วจะช่วยให้พอดีกับรหัสเพิ่มเติมในหน้าจอซึ่งมิฉะนั้นจะต่อต้านเล็กน้อย


2

ขึ้นอยู่กับแพลตฟอร์ม / ภาษา / การประชุม

ใน Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

ใน C #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

ใน C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

ฉันเกลียดเมื่อ Java ใช้สไตล์ของพวกเขาในรหัส C # และในทางกลับกัน


3
สไตล์ C ทำให้ฉันรำคาญอยู่เสมอ คงเส้นคงวา!
Christian Mann

1

ทั้งหมดที่ฉันสามารถพูดได้คือถ้าคุณเป็นแฟนของวิธี # 3 คุณจะถูกข่มเหงโดยทุกฟอร์แมตโค้ด IDE บนโลก


1

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

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

แต่; สิ่งที่สำคัญที่สุดคือความมั่นคง ใช้อย่างใดอย่างหนึ่ง - ไม่เคยทั้งคู่!


0

เมื่อฉันเรียนรู้การเขียนโปรแกรมครั้งแรกเมื่ออายุ 12 ปีฉันใส่วงเล็บปีกกาในบรรทัดถัดไปเนื่องจากบทช่วยสอนการเข้ารหัสของ Microsoft เป็นเช่นนั้น ฉันก็เยื้องกับแท็บ 4 พื้นที่ในเวลานั้น

หลังจากไม่กี่ปีที่ฉันเรียนรู้ Java และ JavaScript และเห็นรหัสวงเล็บปีกกา -on-line เดียวกันดังนั้นฉันจึงเปลี่ยน ฉันก็เริ่มที่จะเยื้องกับช่องว่าง 2 พื้นที่


5
+1, -1 ทำไมคุณไม่เยื้องกับแท็บเนื่องจากเครื่องมือแก้ไขใด ๆ สามารถปรับความยาวแท็บให้เป็นความยาวตามอำเภอใจของคุณได้? มิฉะนั้นคุณจะนำพวกเราจำนวนมากที่ชอบเยื้องแท้ ๆ ออกมาที่ 8 เพื่อสาปแช่งรหัสของคุณ
Jé Queue

0

มีตัวเลือกที่ 4 ที่ทำให้การจัดฟันอยู่ในแนวเดียวกัน แต่ไม่เปลืองเนื้อที่:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

ปัญหาเดียวก็คือว่าตัวจัดรูปแบบอัตโนมัติของ IDE ส่วนใหญ่ทำให้หายใจไม่ออก


9
... เช่นเดียวกับโปรแกรมเมอร์ส่วนใหญ่ที่จะหายใจไม่ออก
Jé Queue

4
ดูเหมือนว่าน่ากลัว ลองนึกถึงความพยายามพิเศษที่คุณต้องทำหากคุณต้องการแทรกบรรทัดที่ด้านบนหรือลบบรรทัดด้านบน คุณไม่สามารถลบเส้นและเดินหน้าต่อไปได้คุณต้องจำไว้ว่าให้ใส่วงเล็บปีกกาอีกครั้ง
Bryan Oakley

ฮ่า ๆ นี่มันยอดเยี่ยมมาก! :) ดีกว่าสไตล์แรก!
nawfal

เห็นได้ชัดว่ามันมีชื่อ Horstman Syyleถูกกล่าวถึงในวิกิพีเดีย ฉันเคยทำงานกับ codebase เช่นนี้มันไม่เลวเลยที่จะใช้
AShelly

-1

ทุกอย่างขึ้นอยู่กับคุณตราบใดที่คุณไม่ได้ทำงานในโปรเจ็กต์ที่มีข้อ จำกัด ในการเข้ารหัสหรือมาตรฐานบางอย่างที่ผู้จัดการโครงการกำหนดไว้

ฉันเองชอบวิธีที่ 1

นอกจากนี้ฉันไม่ได้รับสิ่งที่คุณต้องการแสดงด้วยวิธีที่ 3?

นั่นเป็นวิธีที่ผิดหรือเปล่า? ตัวอย่างเช่นพิจารณาสถานการณ์เช่น ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

ตอนนี้จะเกิดอะไรขึ้นถ้ามีคนต้องการเพิ่มคำสั่งเพิ่มเติมในบล็อกif ?

ในกรณีนั้นถ้าคุณใช้วิธีที่ 3 คอมไพเลอร์จะโยนข้อผิดพลาดทางไวยากรณ์

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
ที่แย่ยิ่งกว่านั้นก็คือถ้ามีคนเข้ามาและทำ: ถ้า (you.hasAnswer ()) you.postAnswer (); อื่น ๆ you.doSomething (); you.doSomethingElse (); - เป็นสูตรสำหรับข้อบกพร่องที่ละเอียดอ่อนที่ดวงตาสามารถลื่นไหลได้อย่างง่ายดายและคอมไพเลอร์ก็ไม่ได้ช่วยอะไรเช่นกัน
FinnNk

@FinnNk: แน่นอน!
Chankey Pathak

2
หากมีคนต้องการเพิ่มคำสั่งอื่นพวกเขาสามารถใส่วงเล็บปีกกาเอง โปรแกรมเมอร์คนใดที่ควรค่ากับเกลือของเขาจริงๆควรจะสามารถเข้าใจได้
Robert Harvey

ฉันอยากจะบอกว่าวิธีที่ 3 ของเขาผิด
Chankey Pathak

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