การเขียนโปรแกรม * เป็น * ภาษาเทียบกับการเขียนรหัส C ใน Ruby


10

รหัสรัฐที่สมบูรณ์แบบที่คุณควรรหัสสิ่งที่เข้ามาในภาษาที่ตรงข้ามกับรหัสในมัน โดยที่พวกเขาหมายถึง

อย่า จำกัด การคิดโปรแกรมของคุณเฉพาะกับแนวคิดที่ภาษาของคุณสนับสนุนโดยอัตโนมัติ โปรแกรมเมอร์ที่ดีที่สุดนึกถึงสิ่งที่พวกเขาต้องการทำแล้วพวกเขาประเมินวิธีบรรลุวัตถุประสงค์ด้วยเครื่องมือการเขียนโปรแกรมเมื่อถึงเวลา (ตอนที่ 34.4)

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

หรือเพื่อตั้งคำถามในรูปแบบที่ตอบได้มากขึ้น:

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


5
+1 คำถามที่ดี ฉันสามารถเขียนภาษา Perl ในภาษาต่าง ๆ มากกว่าครึ่งโหล ณ จุดนี้
Dan Ray

@Dan Ray - แปลก! ฉันมักจะเขียน C ใน Perl
James Anderson

คำตอบ:


7

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

วิธีการนี้เรียกว่าการเขียนโปรแกรมภาษาที่มุ่งเน้น มีเทคนิคมากมายในการใช้ภาษาเฉพาะโดเมนอย่างมีประสิทธิภาพและเป็นหัวข้อยอดนิยมสำหรับชุมชน Ruby


1
ชุมชน Haskell ยังรวบรวมภาษาเฉพาะโดเมนและภาษาการเขียนโปรแกรม Haskell เหมาะอย่างยิ่งสำหรับการนำไปใช้งาน
tdammers

การใช้ระบบสคริปต์ที่ปรับแต่งตามความต้องการของภาษาแบบฝังตัวเช่น Lua หรือ Tkl ถือว่าเป็นการเขียน DSL หรือไม่ ถ้าเป็นเช่นนั้นคุณจะจัดการกับข้อบกพร่องของ Lua เช่นอย่างไร
bastibe

@Paperflyer ในบางกรณีมันทำให้การใช้ภาษาบน Lua (โดยเฉพาะอย่างยิ่งถ้าเป็น Metalua) แต่มันง่ายกว่าที่จะเขียนคอมไพเลอร์ที่เหมาะสมสำหรับ DSL ส่วนใหญ่โดยทั่วไป
SK-logic

@ ผู้ส่งข่าวใช่ Haskell และ Scala ล้วนเกี่ยวกับ DSL แต่ฉันมาจากด้านมืดของกองทัพ: วิธีที่ฉันชอบคือการเขียนโปรแกรม ฉันเชื่อว่าล่ามเฉพาะกิจมักจะด้อยกว่าผู้แปล
SK-logic

2
@tdammers, DSL ที่ใช้งานบนฟังก์ชั่นการสั่งซื้อขั้นสูงคือในทางปฏิบัติแล้วล่ามแบบเฉพาะกิจ คุณไม่สามารถขยายไวยากรณ์ของ Haskell ได้เช่นเดียวกับที่คุณขยายออกพูดเสียงกระเพื่อม แม้กระทั่งกับเทมเพลต Haskell เป็นวิธีที่แตกต่างอย่างสิ้นเชิง (และฉันจะบอกว่าเป็นวิธีที่ จำกัด ) ในการติดตั้ง DSL มันใช้ได้ในหลาย ๆ กรณี แต่สำหรับสิ่งที่ซับซ้อนจริงๆมันนำไปสู่การใช้งานที่ไม่สามารถอ่านได้ทั้งหมดในขณะที่การใช้หลายขั้นตอนเป็นเพียงเล็กน้อยไม่สำคัญว่า DSL ของคุณจะใหญ่และแปลก
SK-logic

2

ฉันเชื่อว่าคำตอบที่ถูกต้องและสิ่งที่หนังสือตั้งใจไว้คือ:

เราควรพยายามเข้ารหัสปัญหาของตัวเองอย่างประณีตที่สุดเท่าที่จะทำได้ด้วยรายละเอียดของภาษา

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

ตัวอย่างเช่นการเรียนรู้ Haskell พัฒนาทักษะของฉันอย่างมากเมื่อใช้ฟังก์ชั่นการสั่งซื้อที่สูงขึ้น ตอนนี้เมื่อการเขียนโปรแกรมใน c # ฉันใช้IEnumerableวิธีการต่าง ๆเช่นSelectบ่อยขึ้นเนื่องจากการใช้วิธีการเหล่านี้ทำให้โค้ดสะอาดกว่าการเขียนลงในลูป ฉันมักจะใช้ Pass และฟังก์ชั่นการใช้งาน (เช่นFunc<int, int>) บ่อยขึ้นเนื่องจากประสบการณ์ Haskell ของฉัน การใช้การสืบทอดของฉันลดลงเนื่องจากสิ่งนี้และส่วนใหญ่เวลาผลลัพธ์คือรหัสที่ง่ายขึ้น

อย่างไรก็ตามฉันไม่ใช้แนวคิดเช่น monads หรือ algebraic data ใน c # เนื่องจากไม่ชัดเจนใน c # และนำไปสู่ผลประโยชน์เล็ก ๆ น้อย ๆ เพื่อแลกกับความสับสนมาก

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


0

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

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

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