เหตุใดภาษาการเขียนโปรแกรมแบบไดนามิกที่ใช้เป็ดจำนวนมากจึงใช้วิธีการแบบคลาสแทน OOP ต้นแบบ


23

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

คำถามที่ 1) ความต้องการห้องเรียนในภาษาแบบไดนามิกคืออะไร ทำไมภาษาจึงออกแบบวิธีการใช้คลาสเป็น“ เทมเพลต” บางชนิดแทนที่จะเป็นแบบต้นแบบและใช้แค่วัตถุ?

จาวาสคริปต์ยังเป็นรุ่นต้นแบบ แต่CoffeeScript (เวอร์ชันปรับปรุงของจาวาสคริปต์) จะเลือกวิธีที่อิงกับคลาส และมันก็เหมือนกันสำหรับLua (รุ่นต้นแบบ) และMoonScript (ตามคลาส) นอกจากนี้ยังมีคลาสใน ES 6 ดังนั้น ...

คำถามที่ 2) มีการแนะนำหรือไม่ว่าถ้าคุณพยายามปรับปรุงภาษาที่ใช้ต้นแบบเป็นต้นคุณควรเปลี่ยนเป็นแบบเรียนหรือไม่ ถ้าไม่ทำไมมันถูกออกแบบมาอย่างนั้น?


9
โปรแกรมเมอร์หลายคนไม่ต้องการรบกวนการเรียนรู้สิ่งใหม่ (มันแปลกเกินไปและ "ยาก") ดังนั้นไลบรารีและภาษาที่อ้างอิงคลาสเหล่านั้นทั้งหมดที่คอมไพล์พวกเขา
โทมัส Eding

1
ฉันเห็นด้วยกับโทมัส แต่สิ่งที่ตลกคือหลังจากที่คุณเรียนรู้วิธีการแบบไดนามิกมันง่ายกว่าจริง ๆ (ไม่ยาก) แนวคิดของวัตถุยังคงอยู่ที่นั่นเพียงแค่ว่าวัตถุที่สามารถเปลี่ยนแปลงได้โดยไม่ต้องคอมไพล์ "พิมพ์เขียว" โง่ ๆ ก่อน ถ้าฉันต้องการวางขาที่ 5 บนเก้าอี้ฉันไม่ต้องการเปลี่ยนพิมพ์เขียวก่อนฉันแค่แค่เพิ่มขา ภาษาแบบไดนามิกมีความเป็นจริงมากขึ้นในความคิดของฉัน
Lonnie Best

1
OOP ถูกประดิษฐ์ในบริบทที่พิมพ์แบบคงที่ซึ่งจะต้องประกาศชนิด มีชั้นเรียนเป็นขั้นตอนที่เหมาะสมไปข้างหน้าจากบันทึกและโมดูล OOP ที่ใช้ต้นแบบเป็นเพียงหัวข้อการวิจัยที่น่าสนใจสำหรับภาษาตัวเองและทำให้มันกลายเป็น JavaScript เป็นวิธีที่ง่ายที่สุดในการทำเครื่องหมายคำศัพท์“ OOP” สำหรับภาษาที่ใช้งานได้เป็นหลัก สิ่งที่ดีคือคุณสามารถใช้คลาสที่ด้านบนของต้นแบบ ในขณะที่ฉันชอบ metaobjects การแยกคลาสออกจากอินสแตนซ์ของพวกเขาทำให้การเขียนโค้ดที่มีรูปแบบเรียบง่ายคู่กันอย่างหลวม ๆ
amon

3
สิ่งแรกอันดับแรก: JavaScript สนับสนุนclassคำหลักในมาตรฐาน ECMAScript ถัดไป (ECMAScript 6) การสนับสนุนคลาสใน JavaScript ได้รับการวางแผนมาเป็นเวลานาน ตอนนี้สิ่งที่มันเป็น - คลาสเป็นเพียงน้ำตาล syntactic ง่ายต่อการเหตุผลเกี่ยวกับรูปแบบสำหรับวัตถุประเภทเดียวกัน นี่เป็นวิธีใน JS และเป็นวิธีนี้ใน Python และภาษาไดนามิกอื่น ๆ
Benjamin Gruenbaum

1
@BenjaminGruenbaum "... คลาสเป็นเพียงวากยสัมพันธ์น้ำตาล ... " ว้าวนี่เป็นความคิดที่แปลกใหม่สำหรับฉันจริงๆสำหรับภาษาอย่าง ruby ​​และ python ดูเหมือนว่าไม่สำคัญว่าจะใช้วัตถุหรือ ชั้นเรียนเป็นแม่แบบ —- ทั้งสองสามารถแก้ไขได้ทันที และมันก็ไม่สำคัญเลยว่าพวกเขาจะจัดการกับมรดกอย่างไร ดังนั้นอาจไม่มีความจำเป็นที่จะต้องแยกความแตกต่างระหว่างวิธีการเรียนแบบใช้คลาสและแบบอย่างต้นแบบสำหรับภาษาแบบไดนามิก :)
iceX

คำตอบ:


12

คำถามที่ 1) ความต้องการห้องเรียนในภาษาแบบไดนามิกคืออะไร? ทำไมภาษาจึงได้รับการออกแบบวิธีการใช้คลาสเป็น“ เทมเพลต” บางชนิดแทนที่จะเป็นแบบต้นแบบและใช้แค่วัตถุ?

ภาษา OO แรกสุด (แม้ว่าจะไม่ได้เรียกว่า "OO") Simula ไม่มีการสืบทอด มรดกถูกเพิ่มใน Simula-67 และมันขึ้นอยู่กับชั้นเรียน

ในเวลาเดียวกันอลันเคย์เริ่มทำงานในแนวความคิดเกี่ยวกับกระบวนทัศน์การเขียนโปรแกรมใหม่ซึ่งต่อมาเขาได้ชื่อว่า "การวางแนววัตถุ" เขาชอบมรดกและต้องการมีมันในภาษาของเขา แต่เขาก็ไม่ชอบชั้นเรียนด้วย อย่างไรก็ตามเขาไม่สามารถหาวิธีรับมรดกได้โดยไม่ต้องเรียนดังนั้นเขาจึงตัดสินใจว่าเขาไม่ชอบเรียนมากกว่าที่เขาชอบมรดกและออกแบบ Smalltalk รุ่นแรก, Smalltalk-72 โดยไม่ต้องเรียนดังนั้นจึงไม่มีการสืบทอด

อีกสองสามเดือนต่อมา Dan Ingalls ได้ออกแบบชั้นเรียนโดยที่ชั้นเรียนนั้นเป็นวัตถุ Alan Kay พบว่าการออกแบบนี้มีการต่อท้ายน้อยกว่ารุ่นเก่าเล็กน้อยดังนั้น Smalltalk-74 จึงถูกออกแบบด้วยคลาสและมีการสืบทอดตามคลาส

หลังจาก Smalltalk-74 Alan Kay รู้สึกว่า Smalltalk เคลื่อนไหวไปในทิศทางที่ผิดและไม่ได้เป็นตัวแทนของ OO และเขาเสนอว่าทีมละทิ้ง Smalltalk และเริ่มต้นใหม่ แต่เขา outvoted ดังนั้นตาม Smalltalk-76, Smalltalk-80 (เวอร์ชันแรกของ Smalltalk ที่จะปล่อยให้นักวิจัย) และในที่สุด Smalltalk-80 V2.0 (รุ่นแรกที่จะเปิดตัวในเชิงพาณิชย์และรุ่นที่กลายเป็นพื้นฐานสำหรับ ANSI Smalltalk) .

ตั้งแต่ Simula-67 และ Smalltalk-80 ถือว่าเป็นปู่ย่าตายายของทุกภาษา OO เกือบทุกภาษาที่ตามมาคัดลอกการออกแบบชั้นเรียนและการสืบทอดตามชั้นเรียนอย่างสุ่มสี่สุ่มห้า สองสามปีต่อมาเมื่อความคิดอื่น ๆ เช่นการสืบทอดบนพื้นฐานของ mixins แทนการเรียนและการมอบหมายจากวัตถุแทนการสืบทอดตามการเรียนที่โผล่ขึ้นมาการสืบทอดตามระดับได้กลายเป็นที่ยึดแน่นเกินไปแล้ว

น่าสนใจเพียงพอภาษาปัจจุบันของอลันเคย์นั้นขึ้นอยู่กับการมอบหมายต้นแบบ


"... ภาษาปัจจุบันของอลันเคย์ ... " ซึ่งคือ ... ?
Javier

@ จาเวียร์: ฉันไม่คิดว่ามันมีชื่อและชื่อของระบบที่เปลี่ยนแปลงอยู่ตลอดเวลา
Jörg W Mittag

นี้ควรจะเป็นคำตอบที่ดีที่จะชี้ไปที่คนในครั้งต่อไปรายชื่อมรดกตามความต้องการสำหรับ OO :)
เฮ้

1
@iceX: Alan Kay ก่อตั้งสถาบันวิจัยจุดชมวิวเพื่อทำงานตามความคิดของเขา น่าเสียดายที่ข้อมูลกระจัดกระจายบนเว็บไซต์จริงๆ
Jörg W Mittag

3
Alan Kay อ้างถึง OO: "OOP สำหรับฉันหมายถึงเฉพาะการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่งมันสามารถทำได้ใน Smalltalk และ LISP อาจมีระบบอื่น ๆ ใน สิ่งนี้เป็นไปได้ แต่ฉันไม่รู้
Joeri Sebrechts

23

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

โปรดทราบว่าแม้ใน JavaScript โค้ดจำนวนมากก็ใช้สิ่งอำนวยความสะดวกต้นแบบเพื่อเลียนแบบคลาส นี่เป็นเพราะผู้เขียนโปรแกรมจำนวนมากชอบคิดแบบนั้น

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


4
ย่อหน้าสุดท้ายของคุณรองรับสิ่งที่คุณพูดอย่างตรงไปตรงมา: V8 พิสูจน์ให้เห็นว่าคุณไม่จำเป็นต้องมีคลาสในภาษาเพื่อคอมไพล์รหัสที่มีประสิทธิภาพในคลาส
Jörg W Mittag

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

11
แน่นอนและความจริงที่ว่า V8 สร้างGOTOs และ register ได้อย่างมีประสิทธิภาพหมายความว่าการเลิกใช้ abstractions ทั้งหมดและการเขียนโดยตรงในการประกอบนั้นเป็นเรื่องง่ายกว่าแน่นอนและอาจจะจบลงด้วย JIT ที่ต้องใช้เวลาน้อยลงในการรวบรวมรหัส มันเป็นหน้าที่ของคอมไพเลอร์เพื่อสนับสนุน abstractions ระดับที่สูงขึ้น
Jörg W Mittag

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

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

3

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

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

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

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


1

OOP สำหรับฉันหมายถึงเฉพาะการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่ง - Alan Kay

ดังนั้นสิ่งที่เขาพูดที่นี่คือ OO คือทั้งหมดที่เกี่ยวกับการสร้างกล่องดำที่ตอบสนองต่อข้อความ REST เป็นระบบ OO ที่ดีที่สุดโดยใช้คำกริยา (เช่นข้อความ) และทรัพยากร (เช่นกล่องทึบแสงที่มีข้อมูลบางส่วน)

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

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