Vì vậy, những gì * đã làm * Alan Kay thực sự có nghĩa là gì bởi thuật ngữ trực tiếp hướng đối tượng


95

Được biết, Alan Kay là người phát minh ra thuật ngữ "hướng đối tượng". Và anh ấy thường được trích dẫn khi nói rằng những gì chúng ta gọi là OO ngày hôm nay không phải là ý anh ấy.

Ví dụ: tôi vừa tìm thấy cái này trên Google:

Tôi đã tạo ra thuật ngữ 'hướng đối tượng' và tôi có thể nói với bạn rằng tôi không có C ++ trong tâm trí

- Alan Kay, OOPSLA '97

Tôi mơ hồ nhớ được nghe một cái gì đó khá sâu sắc về những gì anh ấy đã làm . Một cái gì đó dọc theo dòng "thông điệp đi qua".

Bạn có biết anh ấy có ý gì không? Bạn có thể điền thêm chi tiết về ý nghĩa của anh ấy và nó khác với OO phổ biến ngày nay như thế nào không? Hãy chia sẻ một số tài liệu tham khảo nếu bạn có bất kỳ.

Cảm ơn.


Bạn có thể thấy các bài đăng trên blog của tôi thú vị về chính chủ đề này: yegor256.com/tag/oop.html
yegor256 16/07/2016

Kiểm tra phần bình luận của bài đăng trên blog này, nơi Alan Kay tự trả lời các câu hỏi: Alan Kay đã sai về anh ấy là sai
yegor256

Câu trả lời:


82

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


Ngày: Thứ Tư, ngày 23 tháng 7 năm 2003 09:33:31 -0800 Tới: Stefan Ram [bị xóa vì quyền riêng tư] Từ: Alan Kay [bị xóa vì quyền riêng tư] Chủ đề: Re: Làm rõ về "hướng đối tượng"

Xin chào Stefan -

Xin lỗi vì sự chậm trễ nhưng tôi đã đi nghỉ.

Vào 6:27 PM +0200 7/17/03, Stefan Ram đã viết:

Kính gửi bác sĩ Kay

Tôi muốn có một số từ có thẩm quyền về thuật ngữ "lập trình hướng đối tượng" cho trang hướng dẫn của tôi về chủ đề này. Hai nguồn duy nhất tôi coi là "có thẩm quyền" là Tổ chức Tiêu chuẩn Quốc tế, định nghĩa "hướng đối tượng" trong "ISO / IEC 2382-15", và, như họ nói, bạn đã đặt ra thuật ngữ đó.

Tôi khá chắc chắn rằng tôi đã làm.

Thật không may, thật khó để tìm thấy một trang web hoặc nguồn với định nghĩa hoặc mô tả của bạn về thuật ngữ đó. Có một số báo cáo về những gì bạn có thể đã nói về vấn đề này (như "kế thừa, đa hình và đóng gói"), nhưng đây không phải là nguồn đầu tay. Tôi cũng nhận thức được rằng sau này bạn chú trọng hơn vào "nhắn tin" - nhưng tôi vẫn muốn biết về "hướng đối tượng".

Đối với các hồ sơ, trang hướng dẫn của tôi, và phân phối và xuất bản thêm có thể bạn vui lòng giải thích:

Khi nào và ở đâu thuật ngữ "hướng đối tượng" được sử dụng đầu tiên?

Tại Utah, sau khoảng 66 tháng 11, khi chịu ảnh hưởng của Sketchpad, Simula, thiết kế cho ARPAnet, Burroughs B5000 và nền tảng của tôi về Sinh học và Toán học, tôi đã nghĩ đến một kiến ​​trúc để lập trình. Có lẽ là vào năm 1967 khi ai đó hỏi tôi đang làm gì và tôi nói: "Đó là lập trình hướng đối tượng".

Các quan niệm ban đầu của nó có các phần sau đây.

  • Tôi nghĩ rằng các đối tượng giống như các tế bào sinh học và / hoặc các máy tính cá nhân trên mạng, chỉ có thể giao tiếp với các tin nhắn (vì vậy việc nhắn tin xuất hiện ngay từ đầu - phải mất một thời gian để xem cách nhắn tin bằng ngôn ngữ lập trình đủ hiệu quả để có ích).

  • Tôi muốn thoát khỏi dữ liệu. B5000 gần như đã làm điều này thông qua kiến ​​trúc CTNH gần như không thể tin được của nó. Tôi nhận ra rằng phép ẩn dụ của tế bào / toàn máy tính sẽ loại bỏ dữ liệu và "<-" sẽ chỉ là một mã thông báo khác (tôi mất khá nhiều thời gian để nghĩ ra điều này bởi vì tôi thực sự nghĩ tất cả các biểu tượng này là tên cho chức năng và thủ tục.

  • Nền tảng toán học của tôi khiến tôi nhận ra rằng mỗi đối tượng có thể có một vài đại số liên quan đến nó, và có thể có những gia đình trong số đó, và những điều này sẽ rất hữu ích. Thuật ngữ "đa hình" được áp đặt muộn hơn nhiều (tôi nghĩ bởi Peter Wegner) và nó không hoàn toàn hợp lệ, vì nó thực sự xuất phát từ danh pháp của các hàm và tôi muốn nhiều hơn một chút so với các hàm. Tôi đã tạo ra một thuật ngữ "tính tổng quát" để xử lý các hành vi chung dưới dạng đại số.

  • Tôi không thích cách Simula I hay Simula 67 thực hiện kế thừa (mặc dù tôi nghĩ Nygaard và Dahl chỉ là những nhà tư tưởng và nhà thiết kế vĩ đại). Vì vậy, tôi quyết định loại bỏ tính kế thừa như một tính năng tích hợp cho đến khi tôi hiểu rõ hơn về nó.

Các thí nghiệm ban đầu của tôi với kiến ​​trúc này đã được thực hiện bằng mô hình tôi chuyển thể từ "Generalization of Algol" của W Wi và Wirth's Euler. Cả hai đều khá giống LISP nhưng với cú pháp dễ đọc hơn. Lúc đó tôi không hiểu ý tưởng LISP quái vật về ngôn ngữ kim loại hữu hình, nhưng đã gần gũi với những ý tưởng về các ngôn ngữ có thể mở rộng được rút ra từ nhiều nguồn khác nhau, bao gồm cả Irons 'IMP.

Giai đoạn thứ hai của điều này cuối cùng là hiểu LISP và sau đó sử dụng sự hiểu biết này để làm cho đẹp hơn và nhỏ hơn, mạnh mẽ hơn và các cấu trúc ràng buộc muộn hơn. Luận án của Dave Fisher được thực hiện theo phong cách "McCarthy" và ý tưởng của ông về các cấu trúc điều khiển mở rộng rất hữu ích. Một ảnh hưởng lớn khác tại thời điểm này là PLANNER của Carl Hewitt (người chưa bao giờ nhận được sự công nhận xứng đáng, được đưa ra như thế nào và sớm như thế nào nó có thể dự đoán Prolog).

Smalltalk ban đầu tại Xerox PARC ra đời ở trên. Các Smalltalk tiếp theo bị phàn nàn về phần cuối của chương Lịch sử: chúng quay ngược về phía Simula và không thay thế các cơ chế mở rộng bằng các cơ chế an toàn hơn ở bất kỳ đâu gần như hữu ích.

"Lập trình hướng đối tượng" có nghĩa gì với bạn? (Không cần giới thiệu giống như hướng dẫn, chỉ cần một lời giải thích ngắn gọn [như "lập trình với tính kế thừa, đa hình và đóng gói"] theo các khái niệm khác cho người đọc quen thuộc với chúng, nếu có thể. ", bởi vì tôi đã có nguồn với lời giải thích của bạn về" đối tượng "từ" Lịch sử ban đầu của Smalltalk ".)

(Tôi không chống lại các loại, nhưng tôi không biết bất kỳ hệ thống loại nào không phải là một nỗi đau hoàn toàn, vì vậy tôi vẫn thích gõ động.)

OOP với tôi có nghĩa là chỉ nhắn tin, duy trì và bảo vệ cục bộ và che giấu quá trình nhà nước, và cực kỳ ràng buộc tất cả mọi thứ. Nó có thể được thực hiện trong Smalltalk và trong LISP. Có thể có các hệ thống khác trong đó điều này là có thể, nhưng tôi không biết về chúng.

[Ngoài ra,] Một trong những điều tôi nên đề cập là có hai con đường chính được Simula xúc tác. Đầu tiên (chỉ là tình cờ) là tuyến thủ tục phi dữ liệu sinh học / mạng mà tôi đã thực hiện. Một cái khác, xuất hiện muộn hơn một chút vì một đối tượng nghiên cứu là các kiểu dữ liệu trừu tượng, và điều này đã được chơi nhiều hơn.

Nếu chúng ta nhìn vào toàn bộ lịch sử, chúng ta sẽ thấy rằng công cụ proto-OOP bắt đầu bằng ADT, có một ngã ba nhỏ hướng tới cái mà tôi gọi là "đối tượng" - dẫn đến Smalltalk, v.v. - nhưng sau cái nĩa nhỏ, Cơ sở CS đã thực hiện khá nhiều ADT và muốn gắn bó với mô hình thủ tục dữ liệu. Về mặt lịch sử, đáng để xem xét hệ thống tệp 220 của USAF (mà tôi đã mô tả trong lịch sử Smalltalk), công trình đầu tiên của Doug Ross tại MIT (AED và trước đó), trong đó ông ủng hộ việc nhúng các con trỏ thủ tục vào cấu trúc dữ liệu, Sketchpad (đã có tính đa hình đầy đủ - trong đó, ví dụ, phần bù tương tự trong cấu trúc dữ liệu của nó có nghĩa là "hiển thị" và sẽ có một con trỏ tới thói quen thích hợp cho loại đối tượng mà cấu trúc đại diện, v.v., và B5000 của Burroughs, có các bảng tham chiếu chương trình là "đối tượng lớn" thực sự và chứa các con trỏ tới cả "dữ liệu" và "thủ tục" nhưng thường có thể thực hiện đúng nếu nó đang cố gắng theo dõi dữ liệu và tìm thấy một con trỏ thủ tục. Và vấn đề đầu tiên tôi đã giải quyết với công cụ Utah đầu tiên của mình là "biến mất dữ liệu" chỉ sử dụng các phương thức và đối tượng. Vào cuối thập niên 60 (tôi nghĩ) Bob Balzer đã viết một bài báo khá hay gọi là "Lập trình dữ liệu", và ngay sau đó John Reynold đã viết một bài báo không kém phần "Gedanken" (vào năm 1970 tôi nghĩ) trong đó ông đã cho thấy rằng sử dụng lamda diễn đạt đúng cách sẽ cho phép dữ liệu được trừu tượng hóa bằng các thủ tục. nhưng thường có thể làm điều đúng nếu nó đang cố gắng theo dõi dữ liệu và tìm thấy một con trỏ thủ tục. Và vấn đề đầu tiên tôi đã giải quyết với công cụ Utah đầu tiên của mình là "biến mất dữ liệu" chỉ sử dụng các phương thức và đối tượng. Vào cuối thập niên 60 (tôi nghĩ) Bob Balzer đã viết một bài báo khá hay gọi là "Lập trình dữ liệu", và ngay sau đó John Reynold đã viết một bài báo không kém phần "Gedanken" (vào năm 1970 tôi nghĩ) trong đó ông đã cho thấy rằng sử dụng lamda diễn đạt đúng cách sẽ cho phép dữ liệu được trừu tượng hóa bằng các thủ tục. nhưng thường có thể làm điều đúng nếu nó đang cố gắng theo dõi dữ liệu và tìm thấy một con trỏ thủ tục. Và vấn đề đầu tiên tôi đã giải quyết với công cụ Utah đầu tiên của mình là "biến mất dữ liệu" chỉ sử dụng các phương thức và đối tượng. Vào cuối thập niên 60 (tôi nghĩ) Bob Balzer đã viết một bài báo khá hay gọi là "Lập trình dữ liệu", và ngay sau đó John Reynold đã viết một bài báo không kém phần "Gedanken" (vào năm 1970 tôi nghĩ) trong đó ông đã cho thấy rằng sử dụng lamda diễn đạt đúng cách sẽ cho phép dữ liệu được trừu tượng hóa bằng các thủ tục.

Những người thích các đối tượng không phải là dữ liệu có số lượng nhỏ hơn và bao gồm cả tôi, Carl Hewitt, Dave Reed và một vài người khác - gần như tất cả nhóm này đến từ cộng đồng ARPA và tham gia theo cách này hay cách khác với thiết kế ARPAnet → Internet trong đó đơn vị tính toán cơ bản là toàn bộ máy tính. Nhưng chỉ để cho thấy một ý tưởng có thể bướng bỉnh đến mức nào, suốt những năm bảy mươi và tám mươi, đã có nhiều người cố gắng thực hiện bằng "Cuộc gọi thủ tục từ xa" thay vì nghĩ về các đối tượng và tin nhắn. Sic quá cảnh gloria mundi.

Chúc mừng

Alan Kay


1
Truy cập HTTP / 1.1 403 bị từ chối.
Công việc

1
Tôi chỉ có thể truy cập nó, vì vậy nó phải là một vấn đề nhất thời. Cảm ơn vì liên kết đó, Manoj.
David Conrad

2
@Job Thứ Tư (ngày 16 tháng 3, ngày bạn dường như gặp lỗi 403) là ngày dịch vụ hàng tháng của quản trị viên tên miền tại userpage.fu-berlin.de). Họ thường xuyên lấy các phần của mạng ngoại tuyến mỗi tháng một lần. À, ừ, đừng hỏi
Lọ

Bạn có thể / ai đó làm rõ ý nghĩa của "Tôi muốn thoát khỏi dữ liệu" không? Dữ liệu là một phần không thể thiếu của OO (nghĩa là nó thường được gói gọn trong một lớp hoặc được truyền qua / từ các lớp) và bất kỳ mô hình nào được sử dụng, người ta không thể làm gì nếu không có dữ liệu trong máy tính, vì vậy việc loại bỏ dữ liệu không có ý nghĩa với tôi .
Dennis

1
<- là toán tử chuyển nhượng smalltalk ban đầu
DangerMouse

22

Hầu hết nếu không phải tất cả những gì Alan Kay có nghĩa là hướng đối tượng được thể hiện bằng ngôn ngữ Smalltalk.

Ngoài ra, từ http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models :

Alan Kay đã lập luận rằng việc truyền thông điệp quan trọng hơn các đối tượng trong OOP và bản thân các đối tượng thường được nhấn mạnh quá mức. Mô hình lập trình đối tượng phân tán trực tiếp xây dựng dựa trên quan sát này; nó sử dụng khái niệm về luồng dữ liệu phân tán để mô tả hành vi của một hệ thống phân tán phức tạp theo các mẫu thông báo, sử dụng các đặc tả kỹ thuật cao cấp, theo kiểu chức năng.

18
Một người sau đó tự hỏi tại sao anh ta gọi nó là "Hướng đối tượng" chứ không phải là "Định hướng thông điệp".
David Thornley

@David Thornley: Vì vậy, điều đó sẽ làm cho định hướng phương pháp C ++?
back2dos

60
Tôi đã quá bực bội về thuật ngữ trở lại trong thập niên 60 và nên đã chọn một cái gì đó như "định hướng thông điệp"
Alan Kay

1
Nhưng "định hướng thông điệp" là gì? (Tôi có thể nghĩ về các cuộc gọi không đồng bộ (có thể), nhưng thực tế không biết bất kỳ ngôn ngữ nào không thực hiện các phương thức "bình thường" ít nhiều; cũng có một số điều về các giá trị trả về tham số ref '/' out 'hoặc đại loại như thế)
mlvljr

1
"định hướng thông điệp" về cơ bản là ràng buộc muộn / gõ động, thông điệp được truyền tới đối tượng được phân tích (bởi đối tượng đó) trong thời gian chạy.
Đánh dấu Cidade

6

Hầu hết nếu không phải tất cả những gì Alan Kay có nghĩa là hướng đối tượng được thể hiện bằng ngôn ngữ Smalltalk.

"Chúng tôi thậm chí không thực hiện tất cả các ý tưởng tại PARC. Nhiều ý tưởng Diễn viên của Carl Hewitt được tạo ra bởi Smalltalk ban đầu theo tinh thần của OOP hơn là các Smalltalk sau đó. Các phần quan trọng của Erlang giống như một ngôn ngữ OOP thực sự Smalltalk hiện tại và chắc chắn là các ngôn ngữ dựa trên C đã được vẽ bằng sơn OOP sơn. "

Lấy từ nhận xét của Alan Kay tại:

http://computinged.wordpress.com/2010/09/11/moti- Nhiệm vụ-objects-never-well-hardly-ever/


Bạn phải cuộn một đoạn dài xuống các bình luận, đây là đường dẫn trực tiếp đến bình luận của Alan Kay: tính
toán.wordpress.com / 2010/09/11 / từ

Toàn bộ nhận xét đó rất hữu ích, nó bắt đầu bằng một câu trả lời tiềm năng cho câu hỏi này: "Một ví dụ điển hình về một hệ thống lớn mà tôi coi là hướng đối tượng của Hồi là Internet. Nó có hàng tỷ đối tượng được đóng gói hoàn toàn (chính các máy tính) và sử dụng một hệ thống nhắn tin thuần túy của các yêu cầu không phải là lệnh, v.v. "
icc97

5

Một trong những điểm chính mà tôi đã chọn từ các tác phẩm của Alan Kay và những người khác như Jim Coplien là lập trình hướng đối tượng thực sự là về mô hình hóa máy tính và phần mềm theo mô hình tinh thần CON NGƯỜI / NGƯỜI DÙNG, thay vì là chỉ là một công cụ cho PROGRAMMERS.

Theo tôi hiểu, tầm nhìn về OOP của Alan đã biến máy tính thành một công cụ cho phép người dùng làm bất cứ điều gì họ muốn: toàn bộ khả năng của máy tính được tiếp xúc trực tiếp với người dùng cuối thông qua mô hình tương tác trực quan. Tôi có thể xem và điêu khắc các đối tượng thời gian chạy và các tương tác TRỰC TIẾP, không chỉ thông qua mã.

Đây là một bài viết về kế hoạch của tôi để thử một số phiên bản này trong JavaScript như một bằng chứng về khái niệm: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

Từ góc độ phát triển / lập trình phần mềm, Jim Coplien nói về cách mã có thể và NÊN giống với mô hình tinh thần của người dùng về nó. Đó là, mã đọc giống như cách mà một người mô tả hành vi của nó nghe. Điều này phần lớn được thực hiện bằng cách suy nghĩ về các ĐỐI TƯỢNG, thay vì về LỚP VÀ CÁC LOẠI. Hành vi được mô tả theo các điều khoản của VAI TRÒ do các đối tượng chơi, không phải là một phần của định nghĩa về SẮC của đối tượng. Bạn sẽ có thể mô hình hóa các tương tác theo các điều khoản của các đối tượng, được xác định bởi ROLE mà chúng chơi trong một tương tác. Đây là cách các mô hình tinh thần của con người hoạt động: Người phục vụ, Khách hàng, Nhân viên thu ngân, Tài khoản nguồn, Tài khoản đích, ... Đây là những VAI TRÒ, không phải LOẠI và bạn muốn xác định phương thức cho "mọi đối tượng đang đóng vai trò này vào thời điểm nào ",


DDD sử dụng các khái niệm tương tự. Có lẽ bạn đúng về điều này. :-)
inf3rno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.