รหัสที่อยู่เบื้องหลังรหัสคือ 'สำนวน' เพื่อลดค่าใช้จ่ายทางปัญญาหรือไม่?


22

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

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

วิธีที่ฉันอธิบายความคิดนี้ในแบบที่กระตุ้นให้ผู้คนเปลี่ยนรหัสคือ:

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

(นอกเหนือจากนี้ฉันทราบว่าหนังสือ The Joy of Clojure ก่อนการตีพิมพ์ครั้งแรกมีร่างชื่อ Idiomatic Clojure ดังนั้นจึงดูเหมือนว่าเหตุผลในการสร้างรหัส 'สำนวน' เพื่อ 'นำความสุข' มาให้ผู้อ่าน )

คำถามของฉันคือ: จุดประสงค์เบื้องหลังรหัสคือ 'สำนวน' เพื่อลดค่าใช้จ่ายทางปัญญาหรือไม่?


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

คำตอบ:


19

ครั้งแรกฉันไม่แน่ใจว่ามี "ความถูกต้องทางศีลธรรม" ในคำว่า "สำนวน" ความหมายในพจนานุกรมธรรมดาเป็นเพียง

เฉพาะหรือลักษณะเฉพาะของภาษาหรือภาษาถิ่น: สำนวนภาษาฝรั่งเศส

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

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

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


1
คำตอบของคุณค่อนข้างสมเหตุสมผลเป็นแรงบันดาลใจให้กับปฏิกิริยานี้: Idiomatic French จาก Paris, Montreal, Cote d'Ivoire? รหัสไม่แตกต่างกัน ไม่มีสำนวนที่ไม่มีชุมชน หากคุณฟังดูเหมือนจากมอนทรีออลคุณสามารถคาดหวังให้เกิด 'การรับรู้เกินพิกัด' เล็กน้อยในปารีส อาจโลกจะถูกแบ่งระหว่างผู้ที่คิดว่ามีวิธีที่ถูกต้อง (Python?) และผู้ที่พูดว่า Vive la différence! (Javascript?) ตอนนี้ถ้าเราต้องการเขียนสำนวนจาวาสคริปต์ที่คอมไพเลอร์พบว่ามีประสิทธิภาพมากขึ้นทุกคนเขียนเหมือน minifier / uglifier!
joshp

โชคดีที่เมื่อ V8 ออกมานักออกแบบตัดสินใจว่าพวกเขาจะไม่เล่นเกม microbenchmarks เทียมอีกต่อไปและสร้างเกณฑ์มาตรฐานที่จำลองโลกแห่งความจริงรหัสที่ออกแบบมาอย่างดีและได้รับการออกแบบมาเป็นอย่างดีและผู้ขายรายอื่น ๆ สิ่งนี้ส่งผลให้เกิดการพลิกกลับบทบาทในเกมการแสดงก่อนที่จะเป็นหน้าที่ของโปรแกรมเมอร์ที่จะเขียนโค้ดเพื่อการทำงานเพื่อให้ผู้เขียนคอมไพเลอร์มีงานง่ายตอนนี้มันเป็นหน้าที่ของนักเขียนคอมไพเลอร์ในการออกแบบคอมไพเลอร์ เพื่อให้โปรแกรมเมอร์มีงานง่าย - ซึ่งเป็นวิธีที่ควรเป็น
Jörg W Mittag

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

10

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

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

ภาษาคอมพิวเตอร์ไม่แตกต่างกัน

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


5

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

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

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

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

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


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