ประโยคเดียวและแนวปฏิบัติที่ดี


11

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

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

ตรงข้ามกับ

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

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


5
นี่อาจเป็นคำถามที่ดีสำหรับcodereview.stackexchange.com

1
ฉันจะมีปัญหาถ้าฉันต้องรักษา สิ่งแรกที่ฉันจะทำคือทำ CTRL + F สำหรับ ";" และวางเส้นแบ่ง แต่นั่นเป็นเพียงฉัน :-) ฉันชอบหนึ่งบรรทัดต่อเมื่อฉันมี reasson ถึงตัวอย่างเช่นเริ่มต้นคุณสมบัติที่เปิดใช้งานของกล่องข้อความสองสามตัวที่มีค่าเริ่มต้นเป็น false: textBox1.Enabled = textBox2.Enabled = false;
อรุณ

2
หากคุณกำลังถามคำถามสไตล์การเข้ารหัสมันจะช่วยได้หากคุณระบุภาษา
คาเลบ

3
แม้ว่ามันจะไม่เกิดขึ้นในตัวอย่างที่กำหนดคุณจะวางเบรกพอยต์ในคำสั่งที่สองหรือสามหรือ ... ถ้าคุณใส่ทั้งหมดในบรรทัดเดียว?
Marjan Venema

1
และฉันก็เคยชินกับการจัดรูปแบบอัตโนมัติ (Java) ซึ่งโค้ดจะมีรูปลักษณ์ที่เหมือนกันอยู่แล้ว
Kwebble

คำตอบ:


22

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

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

นอกจากนี้หากปัญหาของคุณคือการป้อนรหัสซ้ำ ... อย่าลืม Ctrl-C จากโค้ดตัวอย่างของคุณมันอาจจะมีประสิทธิภาพมากกว่าในการพิมพ์สิ่งนั้นออกมาด้วยตนเอง แต่ถ้าคุณต้องคัดลอกมัดหลาย ๆ ครั้งมันดูเหมือนว่ามันจะมีประสิทธิภาพพอที่จะคัดลอกบรรทัดที่หนึ่งบวกกับบรรทัดใหม่ x ครั้งและทำการเปลี่ยนแปลงมีโอกาสน้อยที่จะพิมพ์ผิด

โอ้และพิมพ์ผิด! การทำร้ายความสามารถในการอ่านโค้ดของคุณเช่นนั้นอาจทำให้ฝันร้ายเพื่อค้นหาการประกาศตัวแปร 50 รายการที่คุณตั้งค่าผิด คอมไพเลอร์ส่วนใหญ่ให้ข้อผิดพลาดที่หมายเลขแถวและคอลัมน์ในขณะนี้ แต่การค้นหาข้อผิดพลาดในแถวนั้นง่ายกว่าการหาคอลัมน์


2
a) การอ่าน / การสแกนรหัส - คนส่วนใหญ่เมื่อสแกนโค้ดอ่านอักขระสองสามตัวแรกของบรรทัดจากนั้นเลื่อนไปข้างหน้าเว้นแต่จะเป็น "น่าสนใจ" จากนั้นพวกเขาอ่านอีกสองสามครั้ง ข้อผิดพลาดของคอมไพเลอร์: ส่วนใหญ่ฉันตีความข้อผิดพลาดของคอมไพเลอร์ว่า "ปัญหาเกี่ยวกับบรรทัด <x>" เฉพาะในกรณีที่ฉันไม่สามารถทำงานได้ทันที (หายาก) ดังนั้นฉันจึงอ่านข้อผิดพลาดจริง
mattnz

19

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


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

@ anon จุดที่ดีเกี่ยวกับการรวมเครื่องมือเช่นกัน หนึ่งคำสั่งต่อบรรทัดหมายถึงการรวมความขัดแย้งน้อยลงเพื่อล้างข้อมูล
Hugo

10

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

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

(สิ่งเดียวกันเกิดขึ้นกับคำแถลงใด ๆ ที่ยาวเกินไป)


2
แนวคิดเดียวกันนี้ใช้กับการดีบักซึ่งโดยทั่วไปแล้วความละเอียดจะเป็นหมายเลขบรรทัดอีกครั้ง
David Hammen

2
โอ้ใช่แล้วนี่อาจเป็นปัญหา “ รายการโปรด” คือเมื่อคุณได้รับพอยน์เตอร์พอยน์เตอร์หลวมในสิ่งที่ต้องการfoo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(Java / C # ไวยากรณ์) การเรียงลำดับของความยุ่งเหยิงนั้นดีกว่าเสมอด้วยบรรทัดเพิ่มเติม (และตัวแปรชั่วคราว ... และ 2D6 Brick Of Clue สำหรับนักพัฒนาดั้งเดิม)
Donal Fellows

7

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

ด้วยเหตุนี้ฉันแนะนำให้มันยกเว้นในสถานการณ์ที่หายาก


4

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

ตอนนี้ฉันนึกถึงเรื่องสะดุ้ง (แม้ว่ามันจะถูกสร้างขึ้นมาเพื่อเหตุผลที่ดี)

น่าเสียดายที่รหัสดังกล่าวอ่านได้ยากและยากต่อการบำรุงรักษา


1
ดังนั้นคุณจึงเขียนมันอย่างถูกต้องแล้วตัดช่องว่างและเตรียมอื่น ๆ สำหรับ "คัดลอกเครื่อง" ของคุณ เช่นเดียวกับการลดขนาดจาวาสคริปต์ในทุกวันนี้
CaffGeek

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

1

วากยสัมพันธ์ไม่มีอะไรผิดปกติกับมัน มันขึ้นอยู่กับรูปแบบการเข้ารหัสของทีมของคุณ

ในขณะที่โค้ดส่วนใหญ่ที่ฉันได้เห็น (รวมถึงรหัสที่อยู่ภายในส่วนหัว c ++ มาตรฐาน) ถูกทำเช่นนี้ฉันจะใช้วิธีการแรกของคุณ

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

0

นี่เป็นสไตล์การเขียนโปรแกรมที่ผิดปกติจริงๆ

ฉันอยากจะแนะนำให้คุณใช้บรรทัดว่างเพื่อกำหนดส่วนตรรกะของรหัสแทน


0

การออกไปทางขวามากเกินไปอาจทำให้เกิดปัญหาได้หลาย ๆ เส้น

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

ฉันเสียใจที่กลับมาใช้รหัสนี้ การมีแถวพิเศษดูเหมือนจะไม่สร้างปัญหามากนักดังนั้นฉันมักจะล้างมัน


0

นอกจากนี้คุณคิดว่าทุกคนที่จะต้องรักษารหัสของฉันมีปัญหากับวิธีนี้หรือไม่?

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

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

มันง่ายกว่ามากที่จะติดตามการไหลของหน้าในแนวตั้งโดยไม่ต้องละสายตาจากแนวนอนตลอดไป

ดูตัวอย่างของคุณ: คุณรู้ทันทีว่าโค้ดเกี่ยวกับTextคุณสมบัติของอtextBoxอบเจ็กต์ที่แตกต่างกันและมีสตริงเป็นค่า ค่อนข้างตรงไปตรงมา


0

ฉันจะไม่ใช้สไตล์ดังกล่าวเป็นการส่วนตัว เพื่อสรุป

ข้อดี

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

จุดด้อย

  • อ่านยากโดยทั่วไปการอ่านโค้ดในแนวนอนจะทำได้ง่ายกว่า (อ่านไม่ออกไม่มีการเคลื่อนไหวของตา ... )
  • diff กลายเป็นฝันร้ายได้อย่างง่ายดายรวมถึงการรวม
  • เปลี่ยนได้ยากกว่า (คัดลอก & วางแสดงความคิดเห็น ... )
  • การดีบักอาจเป็นปัญหาใน IDEs จำนวนมากเนื่องจากทำงานบนบรรทัดแทนนิพจน์ส่วนบุคคล

บางครั้ง "ข้อเสีย" บางครั้งอาจเป็นข้อดี if (x > maxX) {x=maxX; peggedAny = true;}ตัวอย่างเช่นสมมติว่าชิ้นส่วนของรหัสมีแปดการดำเนินงานต่อเนื่องของแบบฟอร์ม หากการดำเนินการแต่ละอย่างจะพอดีกับบรรทัดเดียวได้ง่ายฉันก็อยากจะมีแปดบรรทัดเช่นนั้นมากกว่าสิบบรรทัดที่แยกคำสั่งออก หากมีการใช้การเปรียบเทียบดังกล่าวในสถานที่เพียงพองบสี่แบบpeggedAny |= pegValueMinMax(ref x, minX, maxX);อาจดีกว่า แต่มีคนอ่านที่ต้องอ่านpegValueMinMaxเพื่อดูว่ามันทำอะไร
supercat

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