ปัญหาใดที่อาจเกิดขึ้นจากการเลียนแบบแนวคิดจากภาษาอื่น


12

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

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


3
ผู้คนจะทำให้คุณสนุกสำหรับสิ่งหนึ่ง :-)
Karl Bielefeldt

ผมเคยแปล parser ฟังก์ชั่นที่ซ้อนกันจาก D ลงในจาวาครั้งเดียว แต่ฉันจะยอมรับมันไม่ได้เป็นชิ้นสะอาดของรหัสที่ผมเคยเขียน (หนึ่งฟังก์ชั่นขนาดใหญ่ที่มีอินเตอร์เฟซและอีกหลายคลาสการใช้มันกำหนดไว้ภายในนั้น)
วงล้อประหลาด

คำตอบ:


23

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

ตัวอย่างเช่นในคำตอบของ Stack Overflowฉันได้อธิบายว่าสัญญาโค้ดแนวคิดที่ใช้ใน. NET Framework นั้นสามารถถูกจำลองเป็นบางส่วนใน PHP ซึ่งไม่รองรับ ฉันลงเอยด้วยการเขียนโค้ดจำนวนมากโดยไม่ทำอะไรเลยเพราะในสิ่งเดียวกันก็สามารถทำได้ด้วยอาร์เรย์ที่เรียบง่าย

โดยทั่วไปแต่ละภาษามีวัฒนธรรมของตัวเองแนวปฏิบัติที่ดีที่สุดสไตล์ของตัวเอง

  • ถ้าฉันเริ่มเขียนรหัส C # เหมือนว่าเป็น C มันจะน่าเกลียด

  • หากฉันเข้าใจ Haskell ในฐานะผู้พัฒนา Java ที่ถูกบังคับให้ใช้ Haskell แต่ไม่ต้องการที่จะเข้าใจจุดแข็งของมันและเพียงต้องการโคลนแนวคิดของ Java โค้ดที่ฉันจะเขียนจะต้องทนทุกข์ทรมาน

  • เป็นต้น

ไม่มีอะไรผิดพลาดในการพยายามปรับปรุงภาษา (เช่นปรับปรุง C # โดยแนะนำหน่วยวัดเช่นใน F #) แต่ถ้าคุณทำมันมากเกินไปคุณควรเลือกภาษาอื่นที่เหมาะกับความต้องการของคุณ


+1 คำตอบที่ดีและขอบคุณสำหรับคำค้นหาเพิ่มเติมด้วยการเพิ่มหน่วยการวัดใน C # เช่นใน F #

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

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

@kojiro: หรืองานอื่น ฉันมีปัญหาเดียวกันกับตัวเองเมื่อฉันถูกบังคับให้ใช้ PHP และฉันพยายามแก้ไขภาษาอย่างต่อเนื่องรวมถึงการเขียนคอมไพเลอร์ของฉันเอง ทางออกที่น้อยกว่าก็คือการเปลี่ยนงานของฉันและเริ่มทำงานในโครงการที่ไม่ได้ใช้ PHP เท่านั้น
Arseni Mourzenko

1
@Cetin Sert: เห็นด้วย Haskell เป็นภาษาที่ยอดเยี่ยม แต่ถ้าใครบางคนไม่ต้องการเรียนรู้และไม่เข้าใจการเขียนโปรแกรมที่ใช้งานได้มันคงยากที่จะชื่นชม Haskell
Arseni Mourzenko

10

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

นอกจากนี้

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

2
ฉันเคยต้องเลียนแบบการกระจาย C ++ แบบไดนามิก (ตารางเสมือนจริง ฯลฯ ) ในวานิลลา C และพบปัญหานี้อย่างแน่นอน: โปรแกรมเมอร์ C ที่ไม่เข้าใจการจัดส่งแบบไดนามิกไม่สามารถมีส่วนร่วมหรือดูแลโครงการได้
comingstorm

4

มันไม่ใช่ความคิดที่ดีอย่างที่ปรากฏบนกระดาษ

ตัวอย่างที่ 1: ถ้าคุณอายุมากพอคุณอาจจำวันที่ C เป็นเด็กใหม่ในเมือง โปรแกรมเมอร์ Pascal และ Ada ไม่ชอบวงเล็บปีกกาเปิดและปิดของ C พวกเขา #defined beginและendเพื่อเปิดรั้งและปิดวงเล็บปีกกาและ voila! Cada! ผลลัพธ์ที่โชคร้ายนั้นน่าเกลียดจากมุมมองของ Ada หรือ C

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


2

ปัญหาใดที่อาจเกิดขึ้นจากการเลียนแบบแนวคิดจากภาษาอื่น

abstractions ที่รั่วไหล


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

1

มันอาจเป็นเรื่องยากที่จะห้าม ลองนึกภาพการพยายามใช้งาน LINQ จาก C # ในแอปพลิเคชัน Java ของคุณ หรือวิธีการเพียงแค่เพิ่มการปิดคำศัพท์ในภาษา? คุณจะต้องเขียนคอมไพเลอร์ใหม่ซึ่งค่อนข้างจะให้ภาษาใหม่แก่คุณ

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

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