การตั้งชื่อเชิงพรรณนาเทียบกับ 80 บรรทัดอักขระ [ปิด]


17

ฉันมักจะได้ยินวิธีการเขียนโปรแกรมที่มีค่าทั้งสองนี้: (1) บรรทัดของรหัสควรเป็น 80 ตัวอักษรหรือน้อยกว่าและ (2) ใช้ชื่อที่สื่อความหมายสำหรับตัวแปรวิธีการชั้นเรียน ฯลฯ ฉันเข้าใจเหตุผลของคำแนะนำทั้งสองนี้ พวกเขาดูเหมือนจะแลกเปลี่ยนกันบ่อยครั้ง หากฉันเก็บรหัสของฉันไว้ต่ำกว่า 80 ตัวอักษร / บรรทัดฉันจะใช้ชื่อที่มีความหมายน้อยกว่า (โดยเฉพาะใน Python ที่แต่ละการเยื้องนับเป็น 4 ตัวอักษร) แต่ถ้าฉันใช้ชื่อที่มีความหมายมากขึ้น

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


4
@BillyONeal ด้วยหน้าจอขนาดใหญ่ 120 :)
BЈовић

4
ฉันคิดว่าฉันต้องการอย่างน้อย 130
9

8
ฉันชอบ 80 เพราะฉันสามารถเปิด 2 ไฟล์ได้อย่างง่ายดายพร้อมกันบนโน้ตบุ๊คของฉัน
Honza Brabec

5
บรรทัดที่มีความยาวมากกว่า 80 อักขระมักไม่สามารถอ่านได้ ดังนั้น 80 จึงเป็นขีด จำกัด ที่ดี คำอธิบายไม่จำเป็นต้องละเอียดเกินไป และมันขึ้นอยู่กับขอบเขต: ชื่อตัวแปรสั้นขนาดเล็กขอบเขตขอบเขตชื่อขนาดใหญ่อีกต่อไป และโดยทั้งหมดหลีกเลี่ยงตัวแปรที่มีขอบเขตขนาดใหญ่ หากคุณอยู่ที่มันใช้ภาษาทำงานและทำลายรหัสของคุณในฟังก์ชั่นขนาดเล็กเมื่อมันเยื้องลึกเกินไป -> ขอบเขตขนาดเล็กมาก == varnames สั้น ชื่อฟังก์ชั่นจะคล้ายกัน แต่มักจะยาวกว่าเล็กน้อยเนื่องจากขอบเขตมีขนาดใหญ่กว่า
Peer Stritzinger

4
@ ott--: คุณเคยเห็นเครื่องมือแก้ไขที่สามารถแบ่งบรรทัดยาวจริง ๆ ตามไวยากรณ์ C ++ และนำเสนอความต่อเนื่องที่เยื้องไปหนึ่งระดับมากกว่าจุดเริ่มต้นหรือไม่ มิฉะนั้นข้อเสนอแนะดังกล่าวจะไร้ประโยชน์
Jan Hudec

คำตอบ:


34

รักษาย่อหน้าของคุณเล็กน้อยชื่อของคุณเป็นคำอธิบายและอย่ากลัวที่จะทำลายเส้น

ทำให้ย่อหน้าของคุณไม่กี่

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

ชื่อของคุณเป็นคำอธิบาย

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

อย่ากลัวที่จะทำลายเส้น

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


3
ควรสังเกตว่าชื่อที่สื่อความหมายนั้นไม่เหมือนกับชื่อที่มีความยาว หลีกเลี่ยงการทำซ้ำสิ่งที่สามารถมองเห็นได้ง่ายจากบริบทและหยิบอย่างระมัดระวังตัวย่อที่ได้รับการแต่งตั้ง (เฉพาะสำหรับมากแนวความคิดร่วมกัน) สามารถไปทางยาวต่อชื่อที่สื่อความหมายสั้น
Jan Hudec

18

ทำไมไม่ทั้งสอง

ประการแรก "คำอธิบาย" และ "verbose" ไม่เหมือนกัน ตัวอย่างเช่นหากคุณกำลังเขียนลูปแบบโลคัลพอสมควรiชื่อตัวแปรที่ดีมากสำหรับตัวแปรลูปคือ current_iteration_indexในขณะที่เนื้อหาที่อธิบายเพิ่มเติมและ verbose แน่นอนยิ่งแย่ลงกว่าเดิมและไม่เพิ่มข้อมูลใด ๆ เลยเพราะการใช้iตัวแปร loop เป็นที่ยอมรับในระดับสากลและไม่มีความหมายอื่นiใด

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

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

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

  • ฟังก์ชันที่มีรายการอาร์กิวเมนต์ที่ยาว นี่ไม่ใช่สิ่งที่ดีที่จะมีเพราะพวกเขาเป็นอุปสรรคต่อการอ่านและสามารถทำให้เกิดข้อบกพร่องที่บอบบางเช่นเมื่อผู้คนแลกเปลี่ยนคำสั่งโต้แย้งในลักษณะที่คอมไพเลอร์ไม่ได้จับ
  • การแสดงออกที่ซับซ้อนมักพบในเงื่อนไข (เช่นif ((user.isLoggedIn && user.hasPermission(page.getRequiredPermission()) && !user.isBanned) || page.getRequiredPermission() == null)); นี่ก็มักจะค่อนข้างยากที่จะถอดรหัสและรหัสควรจะเขียนใหม่ในสิ่งที่มีโครงสร้างมากขึ้น เป็นไปได้มากที่การแสดงออกจะมากเกินไปและควรแยกออกเป็นวิธีการหรือฟังก์ชัน
  • print(translate(LANG_EN, LANG_ES, "This is the home page. Feel welcome to click around and see what we have."));ตัวอักษรยาวใช้ในการเรียกฟังก์ชั่นหรือการแสดงออกเช่น ย้ายตัวอักษรลงในตัวแปรหรือค่าคงที่ มันอาจยังเกินความยาวบรรทัด แต่ถ้าคุณทำอย่างสม่ำเสมอผู้อ่านสามารถเพิกเฉยส่วนที่มองไม่เห็นอย่างปลอดภัยได้อย่างน้อยสมมติว่าเหลือเพียงส่วนที่เหลือของตัวอักษรดังต่อไปนี้ หรือดีกว่าให้ย้ายตัวอักษรออกจากรหัสและไปยังที่เก็บข้อมูลภายนอก (ไฟล์ฐานข้อมูลหรืออะไรก็ตาม)
  • ข้อความที่ซ้อนกันอย่างลึกซึ้งเช่นหกระดับ ifในวิธีการเรียน (นั่นคือ 32 คอลัมน์ของการเยื้องสำหรับการตั้งค่าทั่วไป) อีกครั้งการทำรังแบบลึกนั้นทำให้เกิดโค้ดที่ซับซ้อนและอ่านยากและควรหลีกเลี่ยงเช่นกาฬโรควางรังลึกลงในสมองของมนุษย์ในขณะอ่าน

สิ่งเหล่านี้ล้วนเป็นอาการของสิ่งต่าง ๆ ที่คุณไม่ควรมีในรหัสฐานของคุณในระยะยาวและการบังคับใช้ขีด จำกัด 80 อักขระเป็นวิธีที่ดีและเรียบง่ายที่ช่วยลดความซับซ้อนและอ่านง่ายขึ้น (นั่นไม่ได้หมายความว่าคุณไม่สามารถเขียนโค้ดที่อ่านไม่ได้อย่างสมบูรณ์ใน 80 คอลัมน์: การแข่งขัน obfuscated-something-code ต่าง ๆ เป็นตัวอย่างที่ชัดเจน


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

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

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

16

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


2
นี้. หยุดการขึ้นบรรทัดใหม่ด้วยอักขระ X ปล่อยให้ IDE จัดการกับมัน ไม่เช่นนั้นคุณจะรำคาญผู้ใช้คนอื่น ๆ (รวมถึงอนาคตของคุณด้วย!) ที่หน้าจอ / IDE สามารถจัดการอักขระ 2 * X พร้อมรหัสที่ไม่เหมาะกับหน้าเดียวอีกต่อไป
Konerak

4
คำถามนั้นเกี่ยวกับชื่อยาวๆ และผมไม่เห็นว่าชื่อควรจะยาว - เวลาส่วนใหญ่ของพวกเขาควรจะสั้น ชื่อที่สื่อความหมายชื่อยาวสามารถทำให้โค้ดอ่านยากกว่าชื่อที่สื่อความหมาย แต่สั้นกว่าเล็กน้อย! (โดยทั่วไปแล้วบรรทัดที่ยาวเกินไปมักอ่านยาก)
Konrad Rudolph

4
ฉันไม่เห็นด้วย. หากฉันไม่เห็นรหัสในครั้งเดียวมันเป็นการยากที่จะอ่านไม่ว่าจะอธิบายชื่ออย่างไร
ม.ค. Hudec

4

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

if ( a == b || c == d  || d == e
    || c == e || c == a || c == k
    || c == l)

นอกจากนี้คุณยังสามารถแบ่งฟังก์ชั่นการโทรออกเป็นหลายสายได้เช่นกัน

ดังนั้นกฎทั้งสองของการตั้งชื่อเชิงอธิบายและ 80 บรรทัดอักขระไม่มีความขัดแย้งพวกเขาสามารถอยู่ร่วมกันเพื่อปรับปรุงความสามารถในการอ่าน


2
80 ตัวอักษรปรับปรุงการอ่านได้จริงหรือไม่? หน้าจออะไรที่ไม่สามารถทำได้ 120 วันนี้อย่างง่ายดาย?
Billy ONeal

7
@BillyONeal ง่ายกว่าในการสแกนมากกว่า 80 ความกว้างมากกว่า 120 ความกว้าง
วงล้อประหลาด

2
กระดาษข่าวแบ่งออกเป็นคอลัมน์และคุณสามารถรับข้อมูลเพิ่มเติมได้จาก ux ux.stackexchange.com/questions/3618/…
ใหม่

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

1
@BillyONeal: หน้าจอส่วนใหญ่สามารถทำ 120 แต่แทบจะไม่สามารถทำได้ 240 หรือคุณไม่เคยเปรียบเทียบ diffs?
Hubert Kario

0

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

พระเจ้าเรามีหน้าจอและเทคโนโลยีการพิมพ์ที่แตกต่างกันในขณะนี้ เรามีภาษาการเขียนโปรแกรมที่แตกต่างกันมาก ไม่มีเหตุผลที่จะใช้อีก 80 ตัวอักษร เพิ่มเป็น 120 ตัวอักษรอย่างน้อย

ถึงอย่างนั้นมันก็ไม่ควรเกินขีด จำกัด คุณไปหนึ่งตัวละครเหนือเส้น? ไม่มีอะไรเกิดขึ้น!

แก้ไข:

คำตอบโดยละเอียดเกี่ยวกับประวัติของขีด จำกัด 80-char

ตัวอักษรต่อบรรทัดในวิกิพีเดีย

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


4
ไม่ไม่ควรเพิ่มขีด จำกัด อย่างแน่นอน เนื่องจากมันไม่มีอะไรเกี่ยวข้องกับเทคโนโลยีหน้าจอและการพิมพ์ แต่ด้วยความจริงที่ว่า 80 ตัวอักษรต่อบรรทัดนั้นเป็นเรื่องเกี่ยวกับสายตามนุษย์สูงสุดที่สามารถสแกนได้อย่างสบาย (66 ตัวอักษรถือว่าเป็นความกว้างของเส้นที่เหมาะสมที่สุด ซึ่งหมายความว่าหนังสือส่วนใหญ่มีตัวอย่างโค้ดน้อยกว่า 80 คอลัมน์
Jan Hudec

3
@JanHudec มันมีทุกอย่างที่มีกับหน้าจอ / เทคโนโลยีการพิมพ์ อ้างถึงprogrammers.stackexchange.com/questions/148677/... การตัดสินใจที่จะไปกับตัวละคร 80 ตัวนั้นเป็นเรื่องทางประวัติศาสตร์ล้วนๆไม่ใช่จากการศึกษา คุณช่วยเพิ่มลิงค์ไปยังการศึกษาเพื่อยืนยันความคิดเห็นของคุณได้ไหม?
Sulthan

อีกคำถามหนึ่งได้รับลิงค์ UX นี้ในความคิดเห็น; การอ้างอิงเพิ่มเติมมี ในขณะที่หมายเลข 80 นั้นเป็นเรื่องบังเอิญในประวัติศาสตร์มันได้มาจากการนัดหยุดงานต่อบรรทัดบนเครื่องพิมพ์ดีดซึ่งมาจากความกว้างทั่วไปของการพิมพ์คอลัมน์เดียวและโดยเฉลี่ยแล้ว 66 ตัวอักษรเป็นประเพณีที่สืบทอดกันมานาน
Jan Hudec
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.