คำสั่งเดียวถ้าบล็อก - วงเล็บหรือไม่? [ปิด]


59

ข้อไหนดีกว่า / ยอมรับโดยทั่วไปมากกว่า

นี้:

if(condition)
{
  statement;
}

หรือ:

if(condition)
  statement;

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


2
แต่คุณมีรั้งเปิดในตำแหน่งที่ไม่ถูกต้อง แน่นอนมาก
Christian Mann

ในหลาย ๆ ภาษาบล็อกเป็นคำสั่งดังนั้น syntactically มันก็มักจะหาก (expresion) คำสั่ง
Ingo

2
เนื่องจากคุณไม่ได้ระบุภาษา ... เกี่ยวกับstatement if condition;อะไร
Dave Sherohman

@ คริสเตียน - ดี นั่นจะเป็นอีกคำถามหนึ่งที่แยกจากนี้ใช่ไหม
Zannjaminderson

@Ingo - จุดดี
Zannjaminderson

คำตอบ:


131

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

if(condition) 
//      statement;
otherStatement;

หรือเพิ่มรหัสอย่างรวดเร็ว:

if(condition) 
    statement;
    otherStatement;

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

if(condition) statement;

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


35
จุดดีเกี่ยวกับการวางทุกอย่างในบรรทัดเดียว
Neil Aitken

7
@artjomka: ถ้าคำสั่งยาวและต้องขึ้นบรรทัดเองแล้วฉันจะใช้เครื่องมือจัดฟันเพื่อความสะดวกในการอ่าน ประเด็นก็คือคุณต้องการโครงสร้างที่สั้นที่สุดและมีเสียงรบกวนน้อยที่สุดที่ไม่สร้างความสงสัยให้กับมนุษย์ที่อ่านมันอย่างรวดเร็วแทนที่จะอ่านอย่างละเอียด
dsimcha

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

10
@TMN whitespace ไม่มีค่าใช้จ่ายจอภาพมีขนาดใหญ่และสมองของคุณเรียนรู้ที่จะจดจำรูปร่างซึ่งช่วยให้คุณแยกรหัสได้
Murph

5
@Murph: ช่องว่างฟรีหรือไม่ ฉันต้องพลาดมันไป บนหน้าจอของฉันมันใช้พื้นที่มากจริงๆ มากกว่า 50% จริง ๆ แล้ว ซึ่งในหนังสือของฉันดูเหมือนว่าเป็นขยะขนาดใหญ่ ส่วนตัวผมชอบที่จะเพิ่มเนื้อหาต่อตารางเซนติเมตรในรหัส
Konrad Rudolph

44

ฉันมักจะใช้วงเล็บเพื่อความปลอดภัย

ไม่เป็นไรเมื่อคุณเขียนมัน แต่คุณรู้ว่าจะมีใครบางคนเข้ามาในอนาคตและใส่คำสั่งอื่นโดยไม่ใส่วงเล็บไว้รอบ ๆ


20
มีคนเห็นสิ่งนี้เกิดขึ้นจริงหรือ ฉันไม่คิดว่าฉันเคยเห็นสิ่งนี้ในช่วง 10 ปีของการเขียนโปรแกรม บางทีฉันเพิ่งถูกกำบังเกินไป :)
เดวิด

9
ฉันชอบที่จะปฏิเสธไม่ได้ แต่น่าเสียดายที่ฉันได้เห็นมัน
Neil Aitken

13
คุณมักจะใช้วงเล็บเพื่อไม่ให้คุณลืมที่จะใช้วงเล็บ - มันง่ายเหมือนที่เคย
Murph

12
+1 ถึง @Murph เหตุผลเดียวกับที่ฉันใช้สัญญาณเลี้ยวเมื่อไม่มีใครอยู่ - และที่จอดรถ!
Dan Ray

7
นี่เป็นวิธีปฏิบัติที่ดีที่จะช่วยป้องกันข้อผิดพลาดเมื่อทำการผสานจากสาขาหนึ่งไปยังลำตัวหรือข้ามสาขา
JBRWilkinson

27

ฉันชอบเวอร์ชันที่ไม่มีเครื่องหมายปีกกามากที่สุด

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

(ใกล้ -) บรรทัดว่างเปล่าเป็นของเสีย

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

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

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

นี่เป็นปัญหาพื้นฐาน : เมื่อคุณไม่เห็นบล็อกทั้งหมดบนหน้าจออีกต่อไปมันจะซับซ้อนเกินกว่าที่จะเข้าใจ

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

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

การละเว้นการจัดฟันอาจไม่เป็นอันตราย

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

นี่จะเป็นเรื่องใหญ่แน่ ๆ

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

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

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

ดังนั้นจนกว่าจะมีใครสามารถแสดงข้อมูลที่ฉันเก็บรวบรวมจากการทดลองทางวิทยาศาสตร์แสดงให้เห็นว่านี่เป็นปัญหาในทางปฏิบัติจริง ๆ แล้วทฤษฎีนี้ยังคงเป็น " เรื่องราวที่ดีมาก": สมมติฐานที่น่าสนใจอย่างมากที่ไม่เคยถูกทดสอบ ต้องไม่ใช้เป็นอาร์กิวเมนต์


1บางครั้งปัญหานี้ได้รับการแก้ไขโดยการใส่ทุกอย่าง - รวมทั้งเครื่องหมายปีกกา - ในบรรทัดเดียวกัน:

if (condition)
{ do_something(); }

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


6
การละเว้นการจัดฟันเป็นอันตรายต่อความสามารถในการอ่านและสามารถทำให้เกิดปัญหาเมื่อแก้ไขรหัส
Josh K

15
@ Josh: การอ้างสิทธิ์ครั้งแรกนั้นไร้สาระเช่นภาษาต่างๆเช่น Python show (สำรองข้อมูลด้วยหลักฐานหากคุณคิดเป็นอย่างอื่น) คำตอบที่สองได้ตอบโต้แล้ว คุณมีหลักฐานสำรองหรือไม่ มิฉะนั้นความคิดเห็นของคุณเป็นตัวบ่งชี้ว่าคุณไม่ได้อ่านข้อความของฉัน โปรดทำก่อนที่จะวิจารณ์
Konrad Rudolph

8
+1 สำหรับความคิดของคุณ แต่ฉันคิดว่าตำแหน่งของคุณคือการเอาชนะตนเอง คุณพูดว่า "แสดงข้อมูลที่ยากรวบรวมจากการทดลองทางวิทยาศาสตร์แสดงให้เห็นว่านี่เป็นปัญหาในทางปฏิบัติจริง ๆ " และยังย้อนกลับไปที่ประสบการณ์เกี่ยวกับประวัติ (ของคุณเอง) เพื่อปกป้องตำแหน่งของคุณ คุณพูดว่า "จากประสบการณ์ของฉัน ... ในทศวรรษของประสบการณ์ ... ฉันคิดว่ามันไม่น่าเป็นไปได้ ... " และอื่น ๆ คุณสามารถแสดงข้อมูลที่แข็งรวบรวมจากการทดลองทางวิทยาศาสตร์สนับสนุนการเรียกร้องของคุณได้หรือไม่ ประสบการณ์ส่วนตัวนั้นดีเมื่อสนับสนุนความคิดเห็น แต่อย่าขอ "หลักฐาน" มากกว่าที่คุณเต็มใจให้
bedwyr

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

4
@ Konrad - python ไม่แสดงเป็นอย่างอื่นเพราะการเยื้องมีความสำคัญและดังนั้นการจัดฟันจึงเป็นนัย โปรแกรมเมอร์ที่สดใสดีคนที่อยู่ที่นี่คงไม่ทำผิดพลาดบ่อยนัก (ในหลาย ๆ ปีที่ผ่านมาฉันเคยเห็นปัญหาเกี่ยวกับแค่สองสามครั้ง) แต่มีจำนวนมากค่อนข้างน้อย โปรแกรมเมอร์ที่นั่นทำสิ่งที่โง่ซึ่งเป็นหนึ่งในเหตุผลที่มาตรฐานการเข้ารหัสเป็นสิ่งจำเป็นในตอนแรก (. และเนื่องจากกำหนดเวลาและความเครียดสามารถทำให้ดีที่สุดของเราที่ดีน้อยกว่า)
Murph

19

ฉันไปกับที่สอง มันกระชับและ verbose น้อยกว่า

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


11
แน่นอน! ท้ายที่สุดถ้ารหัสยากที่จะเขียนมันก็ยากที่จะรักษาด้วย! ;-)
Steven A. Lowe

3
@Steven ถ้าคุณลืมวงเล็บปีกกาฉันคิดว่ามีปัญหาอื่น ๆ ที่นี่
TheLQ

succint มากขึ้น == verbose น้อยกว่า
UncleZeiv

5
@SnOrfus: ค่อนข้างประชดประชันเนื่องจากอักขระพิเศษ 2 ตัวเป็นค่าใช้จ่ายเล็กน้อยและป้องกันข้อผิดพลาดในการบำรุงรักษาทั่วไป การสะสมไมล์ของคุณอาจแตกต่างกันไป ;-)
Steven A. Lowe

1
สำหรับฉันการเยื้องทำให้ชัดเจนว่าเกิดอะไรขึ้น รูปแบบแรกเบิร์นพื้นที่หน้าจอพิเศษและดังนั้นจึงเป็นผลลบต่อฉัน
Loren Pechtel

16

ฉันจะใช้ต่อไปนี้ (ฉันทามติที่นี่):

if (condition) {
    any_number_of_statements;
}

เป็นไปได้:

if(condition) single_compact_statement;

ไม่ค่อยดีนักโดยเฉพาะใน C / C ++ - เช่นภาษา:

if(condition) 
    single_compact_statement;

(ไม่มีตัวเลือกที่นี่ในPython ;-)


ในPerlคุณจะใช้:

$C = $A**3 if $A != $B;

หรือ

$C = $A**3 unless $A == $B;

(นี่ไม่ใช่ pseudocode ;-)


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

9
ฉันไม่เคยเห็นใครสับสน perl กับ pseudocode มาก่อน อักขระสุ่มใช่ pseudocode - ไม่
Joe D

3
ฉันสงสัยว่ามีใครสร้างโปรแกรม Perl เพียงแค่เชื่อมต่อ / dev / สุ่มไปยังล่าม Perl ...
Christian Mann

ฉันชอบวิธีการของรูบี้ที่นี่ มันมีรูปแบบ perl แบบบรรทัดเดียว<statement> if <condition>หรือแบบหลายบล็อก block if <condition>/ <do something>/ end(ruby หลีกเลี่ยงการจัดฟันดังนั้นที่นี่เปิดวงเล็บปีกกาโดยนัยifและวงเล็บสิ้นสุดจะถูกแทนที่ด้วยตัวอักษรend) มันไม่ได้เสนอคำสั่งที่แปลก ๆ หลายบรรทัด แต่จริงๆเพียงแค่บรรทัดเดียว
Ben Lee

หนึ่งซับไม่ทำงานกับ debuggers ส่วนใหญ่ (มันเป็นไปไม่ได้ที่จะทำให้เกิดการแตกเมื่อเนื้อหาของประโยค 'ถ้า' กำลังจะถูกดำเนินการ)
Peter Mortensen

11

ฉันใช้วิธีการจัดฟัน - ด้วยเหตุผลทั้งหมดข้างต้นบวกอีกหนึ่งข้อ

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

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


10

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


3
แน่นอน! มันไม่ใช่ความผิดของเราเขา / เธอไม่รู้ไวยากรณ์
kirk.burleson

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

มันเป็นความผิดของคุณถ้าคุณให้รถของคุณรู้ว่าพวกเขาอาจเมา ในทำนองเดียวกันเราควรพยายามคิดให้น้อยที่สุดเกี่ยวกับผู้พัฒนาในอนาคตเพื่อช่วยในการบำรุงรักษา
Aram Kocharyan

8

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

หากคุณต้องการเพิ่มรหัสในifบล็อกคุณไม่จำเป็นต้องจำ / ค้นหาการจัดฟัน เมื่อโปรแกรมเมอร์ในอนาคตอ่านโค้ดเครื่องมือจัดฟันจะไม่คลุมเครือเสมอ

ในด้านบวกReSharperจะเพิ่มวงเล็บปีกกาสำหรับโปรแกรมเมอร์ที่ขี้เกียจใน Visual Studio และฉันคิดว่ามี addons สำหรับIDEอื่น ๆที่จะทำเช่นนั้น


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

เนื่องจาก Python ใช้การเยื้องแทนตัวคั่นพวกมันจึงไม่ได้เป็นการเปรียบเทียบที่ถูกต้อง
Murph

@ Konrad - หลักฐานเชิงประจักษ์: เมื่อฉันเป็นโปรแกรมเมอร์ใหม่ฉันเพิ่มรหัสส่วนตัวลงใน un-braced ถ้าบล็อกโดยไม่ทราบว่าโปรแกรมเมอร์ก่อนหน้านี้ไม่ได้ใส่ใจกับเครื่องมือจัดฟัน ฉันเห็นคนอื่นทำอย่างนี้ด้วยตาของฉันเอง ได้รับเพียงครั้งเดียวที่ฉันเห็นใครบางคนต้องการความช่วยเหลือในการค้นหาปัญหาหลังจากเรียกใช้รหัสของพวกเขา แต่นั่นก็มีมากขึ้นเกี่ยวกับทักษะการทดสอบที่ไม่ดี
shimonyk

@ shimonyk: โดยพื้นฐานแล้วการสังเกตของคุณสนับสนุนการยืนยันของฉันว่าปัญหานี้ไม่สำคัญหรือไม่? โดยวิธีการสังเกตส่วนบุคคลเป็นเรื่องเล็ก ๆ น้อย ๆ พวกเขาจะไม่นับเป็นหลักฐานเชิงประจักษ์
Konrad Rudolph

@ Konrad ดีมากโปรดอ้างอิงแหล่งที่มาของคุณด้วย ฉันคิดว่าคุณมีการศึกษาแบบ double-blind ที่คุณอ้างอิงอยู่หรือไม่ ถ้าไม่เพียงแค่เป็นการเกร็ดเล็กเกร็ดน้อยของคุณในความพยายามที่จะพิสูจน์คนอื่นผิดในขณะที่เรียกร้องโปสเตอร์อื่น ๆ ที่อ้างถึง 'หลักฐาน' เป็นเสแสร้งที่ดีที่สุด ในขณะที่บางคนลงไปในหัวข้อนี้มากเขียนว่า "ความรับผิดชอบที่นี่อยู่ในการต่อต้านเพื่อพิสูจน์ข้อเรียกร้องของพวกเขา
shimonyk

7

ฉันใช้ไวยากรณ์แรกเกือบจะไม่มีข้อยกเว้น เพราะมันไม่สามารถถูกตีความผิด

"อย่าทำให้ฉันคิดว่า" ไม่ได้ใช้กับส่วนต่อประสานกับผู้ใช้เท่านั้น y'all ;-)


4
ฉันเคยทำสิ่งนี้ แต่ฉันได้รับชัยชนะจากการโต้เถียงว่าโปรแกรมเมอร์จำเป็นต้องรู้ภาษาและพวกเขาควรจะคิด
kirk.burleson

2
ฉันคิดว่ามันเป็นเรื่องธรรมดา ... กับตัวฉันในอนาคต
Steven A. Lowe

5

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

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

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

if (condition) {
    statement;
} // stupid extra brace looks ugly

แล้วก็

if (condition) // the brackets have now just become noise
{ statement; } // also can't see the indentation, harder to read

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


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

4

ฉันใช้เวอร์ชันสองบรรทัดโดยไม่มีเครื่องหมายปีกกา (แบบฟอร์ม 2) แต่ไม่ประหยัดพื้นที่

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

ถ้าฉันใช้แบบฟอร์มนี้ฉันต้องแน่ใจว่ามีบรรทัดว่าง (หรือบรรทัดที่มีวงเล็บปีกกาเท่านั้น) ก่อนและหลังifคำสั่ง (หรือเหนือความคิดเห็นหากมี) แม้ว่านี่จะไม่ใช่กฎที่ฉันทำตามอย่างมีสติ แต่ฉันก็สังเกตเห็นได้ทันทีหลังจากอ่านคำถามนี้

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

ด้านล่างนี้เป็นตัวอย่างบางส่วนที่แสดงให้เห็นว่าฉันใช้รูปแบบของifคำชี้แจงนี้ได้อย่างไร

    string GuardConditions(Plan planForWorldDomination)
    {
        if (planForWorldDomination == null)
            throw new ArgumentNullException("planForWorldDomination");

        if (!planForWorldDomination.IsComplete())
            return "Doh!";

        planForWorldDomination.Execute();
    }

    void ProcessingLogic()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
        OneBlankLineAbove();

        // optional comment on the line above an if statement
        if (simpleCondition)
            simpleStatement();

        OneBlankLineBelow();
    }

    void Assignment(string drive)
    {
        OneBlankLineAbove();

        string prompt;
        if (simpleCondition)
            prompt = "simple assignment";
        else
            prompt = null;

        OneBlankLineBelow();
    }

    string Return()
    {
        OneBlankLineAbove();

        if (simpleCondition)
            return "simple return";
        else
            return null;

        OneBlankLineBelow();
    }

3

วงเล็บปีกกา เสมอ. ฉันเป็นแฟนของพวกเขาเพราะมันให้รหัสที่แน่นอน และเช่นเดียวกับ @dsimcha wrote - โอกาสน้อยสำหรับข้อผิดพลาดในการเพิ่มบรรทัดของรหัสเพิ่มเติม

"Uginess" ของการจัดฟันรอบรหัสบรรทัดเดียวมีอันตรายน้อยกว่างานเพิ่มเติมซึ่งเป็นไปได้ในกรณีเหล่านั้นด้วยการดีบักและ / หรือการเพิ่มรหัส


1
ฉันไม่เคยเห็นใครทำผิดที่คุณพูดถึง
kirk.burleson

1
ฉันเพิ่งทำมันเมื่อวานนี้กับคนอื่น ๆ ชิ้นส่วนของรหัส :-) ฉันแค่สงสัยว่าต้นน้ำจะดูอย่างไรในส่วนเพิ่มเติมอื่น ๆ ของรหัสเพิ่มการจัดฟันใน if ทั้งหมดของเขาเพราะเขาดูเหมือนว่าจะมาจากด้านที่แตกต่างกว่าฉันในเรื่องนี้ :-) (ใจเย็นฉันพูดเล่นแก้ไขสิ่งที่ฉันต้อง ... )
Vedran Krivokuća

2

ส่วนตัวฉันไปกับวงเล็บ

ทำไม?

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

มันเก็บรูปแบบของifข้อความที่สอดคล้องกันไม่ว่าจะมีกี่ประโยคในบล็อก

อย่างไรก็ตามถ้าสไตล์ของโครงการเป็นไปโดยไม่ติดไปที่


1

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

if (x==5) Console.WriteLine("It's a five!");

เดาว่าบางคนไม่ใช่แฟนพันธุ์แท้
JohnFx

2
ความกะทัดรัดเพื่อประโยชน์ในการอ่าน? ไม่ได้อย่างแน่นอน. มันเป็นรหัสไม่ใช่การแข่งขันกอล์ฟ
Josh K

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

ปัญหาอย่างหนึ่งของเรื่องนี้คือมันทำให้ตัวเองถูกทำร้าย
Conrad Frix

2
จากนั้นอย่าละเมิด ฉันไม่ได้บอกว่าใช้มันเป็นมาตรฐานการเข้ารหัส มีหลายครั้งที่คุณมีเงื่อนไขแบบสั้น ๆ ตามมาด้วยคำแถลงเดียวสั้น ๆ และสิ่งนี้ใช้ได้ดี ตัวอย่างเช่น if (assert) log.write ("assert failed");
JohnFx

1

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

If (cond) { statement; }

น่าสนใจฉันไม่เห็นโค้ดเช่นนี้ แต่ฉันชอบมันมาก
Thomas Eding

0

ฉันมักจะใช้เครื่องมือจัดฟัน แต่มีบางกรณีที่ฉันไม่ได้

object GetObject() {
    // calculate obj1
    if(obj1 != null)
        return obj1;

    // calculate obj2
    if(obj2 != null)
        return obj2;

    // calculate obj3
    if(obj3 != null)
        return obj3;

    return defaultObj;
}

สำหรับฉันมันแค่โง่ ๆ ที่จะเพิ่มเข้าไปในนั้น หากมีคนเพิ่มคำสั่งหลังจากreturnนั้นเรามีปัญหาที่ใหญ่กว่าปัญหาการกำหนดขอบเขต


คุณสามารถใช้งานได้ง่ายเหมือนกันreturn (obj != null) ? obj : "Error";
Josh K


Object returnObj = defaultObj; /* Three else-if's to change it to obj1/2/3 */ return returnObj;ในกรณีที่ว่าฉันจะใช้สิ่งที่ต้องการ
Josh K

@Josh, อ่านผ่านstackoverflow.com/questions/36707/… . ความคิดเห็นแรกในคำตอบแรก "แม้ว่าจะมีจุดทางออกหลายจุด แต่ฉันคิดว่ามันดีกว่าการใส่ฟังก์ชั่นทั้งหมดของคุณไว้ในบล็อก IF "
หมายเหตุถึงตัวเอง - คิดชื่อ

0

หาก IDE มีการจัดรูปแบบโค้ดที่มีอยู่ฉันไม่ได้ใช้เครื่องมือจัดฟัน

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

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