ยิ่งฉันเรียนรู้เกี่ยวกับกระบวนทัศน์การเขียนโปรแกรมที่แตกต่างกันเช่นการเขียนโปรแกรมการทำงานยิ่งฉันเริ่มตั้งคำถามเกี่ยวกับภูมิปัญญาของแนวคิด OOP เช่นการสืบทอดและ polymorphism ครั้งแรกที่ฉันได้เรียนรู้เกี่ยวกับการสืบทอดและ polymorphism ในโรงเรียนและในเวลานั้น polymorphism ดูเหมือนจะเป็นวิธีที่ยอดเยี่ยมในการเขียนรหัสทั่วไปที่อนุญาตให้ขยายได้ง่าย
แต่ในการเผชิญกับการพิมพ์เป็ด (ทั้งแบบไดนามิกและแบบคงที่) และฟังก์ชั่นการใช้งานเช่นฟังก์ชั่นการสั่งซื้อที่สูงขึ้นฉันได้เริ่มดูการสืบทอดและความหลากหลายในรูปแบบเพื่อกำหนดข้อ จำกัด ที่ไม่จำเป็น แนวคิดทั่วไปที่อยู่เบื้องหลัง polymorphism คือคุณเขียนฟังก์ชันหนึ่งครั้งและหลังจากนั้นคุณสามารถเพิ่มฟังก์ชันการทำงานใหม่ให้กับโปรแกรมของคุณโดยไม่ต้องเปลี่ยนฟังก์ชั่นดั้งเดิม - สิ่งที่คุณต้องทำคือสร้างคลาสอื่นที่ได้มาซึ่งใช้วิธีการที่จำเป็น
แต่วิธีนี้ง่ายกว่ามากในการพิมพ์เป็ดไม่ว่าจะเป็นภาษาแบบไดนามิกเช่น Python หรือภาษาแบบคงที่เช่น C ++
ลองพิจารณาฟังก์ชั่น Python ต่อไปนี้ตามด้วย C ++ แบบคงที่:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
การเทียบเท่า OOP จะเหมือนกับโค้ด Java ต่อไปนี้:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
แน่นอนว่าข้อแตกต่างที่สำคัญคือเวอร์ชัน Java ต้องการการสร้างอินเตอร์เฟสหรือลำดับชั้นการสืบทอดก่อนที่จะทำงาน เวอร์ชั่น Java จึงเกี่ยวข้องกับการทำงานมากขึ้นและมีความยืดหยุ่นน้อยลง นอกจากนี้ฉันพบว่าลำดับชั้นการสืบทอดในโลกความเป็นจริงส่วนใหญ่ค่อนข้างไม่เสถียร เราทุกคนได้เห็นตัวอย่างของรูปร่างและสัตว์ที่ประดิษฐ์ขึ้นแล้ว แต่ในโลกแห่งความจริงเมื่อความต้องการทางธุรกิจเปลี่ยนไปและมีการเพิ่มฟีเจอร์ใหม่ ๆ มันเป็นการยากที่จะทำงานให้เสร็จก่อนที่คุณจะต้องยืดความสัมพันธ์ "is-a" ระหว่าง คลาสย่อยหรืออื่น ๆ สร้างใหม่ / refactor ลำดับชั้นของคุณเพื่อรวมคลาสพื้นฐานหรืออินเทอร์เฟซเพิ่มเติมเพื่อรองรับความต้องการใหม่ ด้วยการพิมพ์เป็ดคุณไม่จำเป็นต้องกังวลเกี่ยวกับการสร้างแบบจำลองอะไรเลยคุณเพียงแค่กังวลเกี่ยวกับฟังก์ชั่นที่คุณต้องการ
กระนั้นมรดกและความหลากหลายก็เป็นที่นิยมกันมากจนฉันสงสัยว่ามันจะเป็นการพูดเกินจริงมากที่จะเรียกพวกเขาว่ากลยุทธ์ที่โดดเด่นสำหรับการขยายและการนำโค้ดกลับมาใช้ใหม่ เหตุใดจึงมีการถ่ายทอดทางพันธุกรรมและความหลากหลายดังนั้นประสบความสำเร็จอย่างดุเดือด? ฉันมองข้ามข้อได้เปรียบที่ร้ายแรงบางประการที่การสืบทอด / ความหลากหลายมีมากกว่าการพิมพ์เป็ดหรือไม่?
obj
ไม่มีdoSomething
วิธีการ มีข้อยกเว้นเกิดขึ้นหรือไม่ ไม่มีอะไรเกิดขึ้น?