รหัสที่สวยงามคืออะไร? [ปิด]


30

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

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



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


คำตอบ:


55

"ความงามถูกซื้อโดยการตัดสินของตา"

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

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

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

  • ประสิทธิภาพ : หลีกเลี่ยงการใช้ทรัพยากรโดยไม่จำเป็น (เช่นเวลา CPU, หน่วยความจำและ I / O)

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


11
คำอธิบายที่สวยงาม +1
koenmetsu

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

@Jubbat แน่นอน - บางครั้งทางออกที่มีประสิทธิภาพจริง ๆ แล้วนำไปสู่รหัสที่น่าเกลียดมาก (เช่นฟังก์ชันรูตสแควร์รูทแบบคลาสสิกอย่างรวดเร็ว)
Darrel Hoffman

@DollHoffman ถูกต้องแม้ว่าการประนีประนอมนั้นก็เป็นจริงเช่นกันโดยตัวแปรเพิ่มเติมที่กำหนดรหัสที่ดีไม่เพียง แต่มีประสิทธิภาพและส่วนที่เหลือ (มีคำอธิบายที่ยาวมากเกี่ยวกับเรื่องนี้ใน "Code Complete" - น่าเสียดายที่ฉันจำไม่ได้ว่า หนังสือใกล้จุดเริ่มต้นอาจ
DPM

@Jubbat: ฉันยอมรับว่าประสิทธิภาพมักเป็นเรื่องรอง แต่ฉันก็ยังคิดว่ามันเป็นปัจจัยในสมการความงาม
Igby Largeman

20

อย่าปล่อยให้คนอื่นหลอกคุณโดยคิดว่าโค้ดที่สวยงามมีดังต่อไปนี้:

  • อัลกอริทึมที่ฉลาด
  • คุณสมบัติภาษาส่อเสียด
  • การแก้ปัญหาด้วยการกดปุ่มน้อยที่สุด

เพราะมันไม่ใช่ รหัสเช่นนี้น่ารักและแน่นอนว่ามันควรค่าแก่การเหลียวมอง แต่ไม่ใช่รหัสที่คุณต้องการปักหลัก

และคุณรู้หรือไม่ว่า meta templated static polymorphism แบบเรียกซ้ำที่เกิดจากการสืบทอด lambdas - หรืออะไรก็ตามที่คุณอ่านเกี่ยวกับออนไลน์ คุณอาจกระตือรือร้นที่จะกระโดดเข้าหาเทคนิคที่แปลกใหม่และดีโดยไม่มีเหตุผลที่ชัดเจนในการใช้ แต่รหัสที่ผลักดันขอบเขตของภาษาก็ไม่ได้สวยงามเช่นกัน

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


ดังนั้นรหัสที่สวยงามคืออะไร?

รหัสที่สวยงาม = รหัสที่บำรุงรักษาได้ แค่นั้นแหละ!
นั่นคือสูตร!

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

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


4
เพื่อต่อสู้กับปัญหาที่คุณยกขึ้นนอกจากนี้ยังมีคำแนะนำสำหรับc2.com/cgi/wiki?KillYourDarlings
jk

4

สิ่งที่ฉันใช้ในเรื่องนี้คือ "Beautiful Code" ไม่ใช่คำที่มีวัตถุประสงค์หรือมีประโยชน์โดยเฉพาะ และเราไม่ควรพยายามกำหนดมัน


คำนิยามในพจนานุกรมทั่วไปของคำว่า "beauty" ในภาษาอังกฤษจะเป็นดังนี้:

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

(ที่มาhttp://dictionary.com )

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


เราสามารถใช้คำว่า "ความงาม" กับโค้ดและความหมายที่ชัดเจนคือรหัสนั้นคือ

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

หรือจะพูดอีกอย่างหนึ่งก็มีบางสิ่งที่น่ารังเกียจเกี่ยวกับคนที่บอกฉันว่าฉันควรคิดว่ามันสวยงามไม่ว่าจะเป็นในคนงานศิลปะหรือ ... รหัส

เท่าที่ฉันกังวลรหัสที่สวยงามคือรหัสที่ฉันคิดว่าสวยงามและนั่นก็คือ มันเป็นเรื่องส่วนตัวและเป็นส่วนตัวและปล่อยให้มันเป็นอย่างนั้น


2

นี่คือคำแนะนำของฉัน

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

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


1

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

สำหรับฉันรหัสที่สวยงามคือ:

  • ที่แสดงออก
  • กระชับ

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

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


0

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

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

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

โค้ดที่สวยงามในทำนองเดียวกันนั้นยอดเยี่ยม หากคุณมีรหัสที่ดีเยี่ยมไปยังสิ่งอื่น อย่าเครียดมากเกินไป คุณจะไม่มีวันได้รับเครื่องหมาย 100% และถ้าคุณทำคุณจะพบว่าคุณให้ความสำคัญกับสิ่งที่มันอ่านมากเกินไปหรือสิ่งที่มันดูเหมือนและไม่พอกับสิ่งที่มันทำ . ดังนั้นไปที่เครื่องหมายที่เหมาะสมแล้วหยุด

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

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

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


0

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

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

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

รหัสที่สวยงามมีคุณสมบัติในทางปฏิบัติตามที่ระบุไว้เป็นอย่างอื่นฉันเห็นด้วยอย่างยิ่ง


0

ฉันมีเกณฑ์สามข้อ:

  • เรียบง่าย:อย่างน้อยมันต้องเป็นมนุษย์ที่อ่านได้ ตัวอย่างเช่นคุณสามารถเขียนโค้ดที่ทำงานที่ O (1) สำหรับวิธีแก้ปัญหาที่มีเส้นจำนวนมาก แต่ฉันชอบโค้ดที่ใช้กับ 0 (n) แก้ปัญหาด้วยไม่กี่บรรทัด สิ่งนี้อาจเปลี่ยนแปลงไปสำหรับสถานการณ์ที่รุนแรง แต่สำหรับความเรียบง่ายในการเริ่มต้นเป็นสิ่งสำคัญ
  • นำกลับมาใช้ใหม่:รหัสจะต้องนำมาใช้ซ้ำได้ แต่ไม่สามารถเขียนทับได้ หากคุณต้องการการดำเนินการคุณควรกำหนดวิธีการที่คุณสามารถใช้งานได้หลายปีต่อมา
  • การเยื้อง:บางทีนี่อาจไม่ใช่ปัญหาสำหรับคุณ แต่สำหรับระดับเริ่มต้นสิ่งนี้จะต้องแก้ไขก่อน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.