อลันเคย์หมายถึงอะไรโดย * คำว่า "เชิงวัตถุ" จริงๆ?


95

มีรายงานว่า Alan Kay เป็นผู้ประดิษฐ์คำว่า "เชิงวัตถุ" และเขาก็มักจะอ้างว่ามีการกล่าวว่าสิ่งที่เราเรียก OO วันนี้ไม่ใช่สิ่งที่เขาหมายถึง

ตัวอย่างเช่นฉันเพิ่งพบสิ่งนี้บน Google:

ฉันสร้างคำว่า 'เชิงวัตถุ' และฉันสามารถบอกคุณได้ว่าฉันไม่มี C ++ ในใจ

- Alan Kay, OOPSLA '97

ผมคลับคล้ายคลับคลาได้ยินบางสิ่งบางอย่างที่ชาญฉลาดสวยเกี่ยวกับสิ่งที่เขาไม่ได้หมายความว่า บางสิ่งบางอย่างตามสายของ "การส่งข้อความ"

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

ขอบคุณ


คุณอาจพบว่าการโพสต์บล็อกของฉันน่าสนใจในเรื่องนี้มาก: yegor256.com/tag/oop.html
yegor256

ตรวจสอบส่วนความเห็นของโพสต์บล็อกนี้ที่ Alan Kay ตอบคำถามด้วยตัวเอง: Alan Kay รู้สึกผิดเกี่ยวกับการเป็นคนผิด
yegor256

คำตอบ:


82

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


วันที่: Wed, 23 Jul 2003 09:33:31 -0800 ถึง: Stefan Ram [ลบเพื่อความเป็นส่วนตัว] จาก: Alan Kay [ลบเพื่อความเป็นส่วนตัว] เรื่อง: Re: การชี้แจงของ "object-oriented"

สวัสดีสเตฟาน -

ขออภัยสำหรับความล่าช้า แต่ฉันอยู่ในช่วงวันหยุด

เมื่อ 18:27 +0200 7/17/03 Stefan Ram เขียนว่า:

เรียนดร. เคย์

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

ฉันค่อนข้างแน่ใจว่าฉันทำ

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

สำหรับบันทึกหน้าบทช่วยสอนของฉันและการเผยแพร่และการเผยแพร่เพิ่มเติมโปรดอธิบาย:

คำว่า "เชิงวัตถุ" ใช้เมื่อใดและที่ไหน

ที่ยูทาห์ในช่วงหลัง พ.ย. 66 เมื่อได้รับอิทธิพลจาก Sketchpad, Simula, การออกแบบสำหรับ ARPAnet, Burroughs B5000 และพื้นหลังของฉันในชีววิทยาและคณิตศาสตร์ฉันคิดว่าสถาปัตยกรรมสำหรับการเขียนโปรแกรม อาจเป็นในปี 1967 เมื่อมีคนถามฉันว่าฉันกำลังทำอะไรอยู่และฉันก็พูดว่า: "เป็นโปรแกรมเชิงวัตถุ"

แนวคิดดั้งเดิมของมันมีส่วนต่าง ๆ ดังต่อไปนี้

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

  • ฉันต้องการกำจัดข้อมูล B5000 เกือบทำสิ่งนี้ผ่านสถาปัตยกรรม HW ที่แทบไม่น่าเชื่อ ฉันรู้ว่าคำเปรียบเทียบเซลล์ / คอมพิวเตอร์ทั้งเครื่องจะกำจัดข้อมูลและ "<-" จะเป็นเพียงข้อความอีกโทเค็น (ฉันใช้เวลาสักครู่ในการคิดสิ่งนี้เพราะฉันคิดว่าสัญลักษณ์เหล่านี้เป็นชื่อสำหรับ ฟังก์ชั่นและขั้นตอน

  • ภูมิหลังทางคณิตศาสตร์ของฉันทำให้ฉันรู้ว่าแต่ละวัตถุอาจมีจีบราส์หลายอันที่เกี่ยวข้องกับมันและอาจมีครอบครัวของสิ่งเหล่านี้และสิ่งเหล่านี้จะมีประโยชน์มาก คำว่า "polymorphism" ถูกกำหนดไว้มากในภายหลัง (ฉันคิดว่า Peter Wegner) และมันก็ไม่ถูกต้องนักเพราะมันมาจากชื่อของฟังก์ชั่นและฉันต้องการฟังก์ชั่นมากกว่าเล็กน้อย ฉันสร้างคำว่า "genericity" เพื่อจัดการกับพฤติกรรมทั่วไปในรูปแบบเสมือนพีชคณิต

  • ฉันไม่ชอบวิธีที่ Simula ฉันหรือ Simula 67 ได้รับมรดก (แม้ว่าฉันคิดว่า Nygaard และ Dahl เป็นเพียงนักคิดและนักออกแบบที่ยิ่งใหญ่) ดังนั้นฉันจึงตัดสินใจที่จะละทิ้งมรดกเป็นคุณลักษณะในตัวจนกว่าฉันจะเข้าใจได้ดีขึ้น

การทดลองดั้งเดิมของฉันกับสถาปัตยกรรมนี้ทำโดยใช้แบบจำลองที่ดัดแปลงมาจาก Van Wijngaarten's และ Wirth's "Generalization of Algol" และ Wuler's Euler ทั้งสองนี้ค่อนข้างเหมือน LISP แต่มีไวยากรณ์ที่อ่านได้มากกว่า ฉันไม่เข้าใจแนวคิด LISP ของสัตว์ประหลาดที่จับต้องได้จากโลหะภาษา แต่ได้ใกล้ชิดกับแนวคิดเกี่ยวกับภาษาที่ขยายได้ซึ่งดึงมาจากแหล่งต่าง ๆ รวมถึง IMP ของ Irons

ขั้นตอนที่สองของเรื่องนี้คือการเข้าใจ LISP ในที่สุดและจากนั้นใช้ความเข้าใจนี้เพื่อทำให้ดีขึ้นและมีขนาดเล็กลงและมีประสิทธิภาพมากขึ้นและโครงสร้างที่ล่าช้ามากขึ้น วิทยานิพนธ์ของ Dave Fisher ทำในรูปแบบ "McCarthy" และความคิดของเขาเกี่ยวกับโครงสร้างการควบคุมแบบขยายได้มีประโยชน์มาก อิทธิพลใหญ่อีกอย่างในเวลานี้คือ PLANNER ของคาร์ลเฮวิตต์ (ซึ่งไม่เคยได้รับการยอมรับว่าสมควรได้รับเท่าไรและดีแค่ไหนก่อนหน้านี้ที่สามารถคาดการณ์อารัมภบทได้)

Smalltalk ดั้งเดิมที่ Xerox PARC ออกมาจากด้านบน Smalltalk ต่อมาถูกร้องเรียนเกี่ยวกับในตอนท้ายของบทประวัติศาสตร์: พวกเขา backslid สู่ Simula และไม่ได้แทนที่กลไกการขยายด้วยคนที่ปลอดภัยกว่าซึ่งอยู่ใกล้กับที่เป็นประโยชน์

"การเขียนโปรแกรมเชิงวัตถุ" หมายถึงอะไร? (ไม่จำเป็นต้องมีการแนะนำแบบกวดวิชาเพียงคำอธิบายสั้น ๆ [เช่น "การเขียนโปรแกรมที่มีการสืบทอดความหลากหลายและการห่อหุ้ม"] ในแง่ของแนวคิดอื่น ๆ สำหรับผู้อ่านที่คุ้นเคยกับพวกเขาหากเป็นไปได้นอกจากนี้ยังไม่จำเป็นต้องอธิบาย "วัตถุ "เพราะฉันมีแหล่งที่มาพร้อมกับคำอธิบายของคุณของ" วัตถุ "จาก" Early History of Smalltalk ")

(ฉันไม่ได้เทียบกับประเภท แต่ฉันไม่รู้ระบบชนิดใดที่ไม่เจ็บปวดอย่างสมบูรณ์ดังนั้นฉันยังชอบการพิมพ์แบบไดนามิก)

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

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

ถ้าเราดูประวัติทั้งหมดเราจะเห็นว่าสิ่งที่โปรโต - โอพเริ่มต้นด้วย ADT มีทางแยกเล็ก ๆ น้อย ๆ ต่อสิ่งที่ฉันเรียกว่า "วัตถุ" - ที่นำไปสู่สมอลล์ทอล์ค ฯลฯ - แต่หลังจากทางแยกเล็ก ๆ การก่อตั้ง CS นั้นค่อนข้าง ADT และต้องการที่จะยึดติดกับกระบวนทัศน์กระบวนงานข้อมูล ในอดีตมันน่าดู USAF Burroughs ระบบไฟล์ 220 (ที่ฉันอธิบายไว้ในประวัติ Smalltalk) งานแรกของ Doug Ross ที่ MIT (AED และก่อนหน้านี้) ซึ่งเขาสนับสนุนการฝังตัวชี้ขั้นตอนในโครงสร้างข้อมูล Sketchpad (ซึ่งมี polymorphism แบบเต็ม - เช่นที่อ็อฟเซ็ตเดียวกันในโครงสร้างข้อมูลของมันหมายถึง "display" และจะมีตัวชี้ไปยังรูทีนที่เหมาะสมสำหรับประเภทของวัตถุที่เป็นตัวแทนโครงสร้างและอื่น ๆ และ Burroughs B5000 ซึ่งตารางอ้างอิงของโปรแกรมนั้นเป็น "วัตถุขนาดใหญ่" จริงและมีตัวชี้ไปยัง "ข้อมูล" และ "ขั้นตอน" แต่มักจะทำสิ่งที่ถูกต้องได้หากพยายามไปตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน แต่บ่อยครั้งสามารถทำสิ่งที่ถูกต้องได้หากพยายามติดตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน แต่บ่อยครั้งสามารถทำสิ่งที่ถูกต้องได้หากพยายามติดตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน

คนที่ชอบวัตถุที่ไม่ใช่ข้อมูลนั้นมีจำนวนน้อยและรวมตัวเอง Carl Hewitt, Dave Reed และคนอื่น ๆ อีกสองสามคน - กลุ่มคนส่วนใหญ่มาจากชุมชน ARPA และมีส่วนร่วมไม่ทางใดก็ทางหนึ่ง การออกแบบ ARPAnet → Internet ที่หน่วยการคำนวณพื้นฐานเป็นคอมพิวเตอร์ทั้งเครื่อง แต่เพียงเพื่อแสดงให้เห็นว่าความคิดหัวชนฝาสามารถแขวนบนตลอดอายุเจ็ดสิบแปดมีหลายคนที่พยายามที่จะได้รับด้วย "การเรียกกระบวนการระยะไกล" แทนที่จะคิดเกี่ยวกับวัตถุและข้อความ Sic Transit Gloria mundi

ไชโย

อลันเคย์


1
HTTP / 1.1 403 Access Denied
งาน

1
ฉันสามารถเข้าถึงได้ดังนั้นจึงต้องมีปัญหาชั่วคราว ขอบคุณสำหรับลิงค์นั้น Manoj
David Conrad

2
@Job Wednesday (วันที่ 16 มีนาคมวันที่คุณเห็นว่ามีข้อผิดพลาด 403) เป็นวันบริการรายเดือนของผู้ดูแลโดเมนที่ userpage.fu-berlin.de พวกเขาใช้เวลาส่วนหนึ่งของเครือข่ายออฟไลน์เป็นประจำทุกเดือน เอ่อใช่อย่าถาม ...
คอนราดรูดอล์ฟ

คุณ / ใครสามารถอธิบายว่า "ฉันต้องการกำจัดข้อมูล" มีความหมายอย่างไร ข้อมูลเป็นส่วนสำคัญของ OO (เช่นมันมักจะถูกห่อหุ้มในชั้นเรียนหรือส่งไปยัง / จากชั้นเรียน) และไม่ว่าจะใช้กระบวนทัศน์ใดเราไม่สามารถทำได้โดยไม่มีข้อมูลในการคำนวณดังนั้นการกำจัดข้อมูลจึงไม่สมเหตุสมผลสำหรับฉัน .
Dennis

1
<- เป็นผู้ดำเนินการที่ได้รับมอบหมาย smalltalk ดั้งเดิม
DangerMouse

22

ส่วนใหญ่หากไม่ใช่ทุกสิ่งที่ Alan Kay มีความหมายโดยการวางแนวของวัตถุนั้นจะรวมอยู่ในภาษา Smalltalk

นอกจากนี้จากhttp://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models :

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

18
หนึ่งในนั้นก็สงสัยว่าทำไมเขาถึงเรียกมันว่า "Object-Oriented" แทนที่จะเป็น "Message-Oriented"
David Thornley

@David Thornley: ถ้าอย่างนั้นจะทำให้วิธีการเชิง C ++?
back2dos

60
ฉัน blythe เกินไปเกี่ยวกับคำที่ย้อนกลับไปในยุค 60 และควรเลือกบางอย่างเช่น "message oriented"
Alan Kay

1
แต่ "มุ่งเน้นข้อความ" คืออะไร? (ฉันคิดว่าการโทรแบบ async (อาจเป็นไปได้) แต่จริงๆแล้วไม่รู้ว่าภาษาใด ๆ ที่ไม่ได้ใช้วิธีการ "ปกติ" มากขึ้นหรือน้อยลงมีบางสิ่งเกี่ยวกับค่าส่งคืนเช่นกัน แต่สิ่งนี้สามารถหลอกได้ด้วย ref '/' out 'พารามิเตอร์หรืออะไรทำนองนั้น)
mlvljr

1
"การวางแนวข้อความ" นั้นเป็นการโยงช้า / การพิมพ์แบบไดนามิก - ข้อความที่ส่งไปยังวัตถุนั้นจะถูกวิเคราะห์ (โดยวัตถุนั้น) ที่รันไทม์
Mark Cidade

6

ส่วนใหญ่หากไม่ใช่ทุกสิ่งที่ Alan Kay มีความหมายโดยการวางแนวของวัตถุนั้นจะรวมอยู่ในภาษา Smalltalk

"เราไม่ได้ทำทุกความคิดที่ PARC ความคิดของนักแสดงของ Carl Hewitt หลายคนที่ได้รับแรงบันดาลใจจาก Smalltalk ดั้งเดิมนั้นมีจิตวิญญาณของ OOP มากกว่า Smalltalk ต่อไปส่วนสำคัญของ Erlang นั้นเหมือนภาษา OOP จริง Smalltalk ปัจจุบันและแน่นอนภาษา C ที่ได้รับการทาสีด้วย "OOP paint"

นำมาจากความคิดเห็นของ Alan Kay ที่:

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/


คุณต้องเลื่อนความคิดเห็นลงไปนี่เป็นลิงค์โดยตรงไปยังความคิดเห็นของ Alan Kay: computinged.wordpress.com/2010/09/11/…
icc97

ความคิดเห็นทั้งหมดนั้นมีประโยชน์มากมันเริ่มต้นด้วยคำตอบที่เป็นไปได้สำหรับคำถามนี้: "ตัวอย่างที่ดีของระบบขนาดใหญ่ที่ฉันคิดว่า" object-oriented "คืออินเทอร์เน็ตมันมีวัตถุที่ห่อหุ้มอย่างสมบูรณ์หลายพันล้านรายการ ระบบการส่งข้อความบริสุทธิ์ของ“ คำขอไม่สั่ง” และอื่น ๆ ”
icc97

5

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

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

นี่คือโพสต์เกี่ยวกับแผนการของฉันที่จะลองใช้บางรุ่นใน JavaScript เพื่อเป็นหลักฐานของแนวคิด: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

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


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