Отже, що насправді мав на увазі Алан Кей під терміном "об'єктно-орієнтований"?


95

Як повідомляється, Алан Кей є винахідником терміна "орієнтована на об'єкти". І він часто цитується, що сказав, що те, що ми сьогодні називаємо ОО, - це не те, що він мав на увазі.

Наприклад, я щойно знайшов це в Google:

Я склав термін «об’єктно-орієнтований», і можу вам сказати, що я не мав на увазі C ++

- Алан Кей, OOPSLA '97

Я смутно пам'ятаю, як почув щось досить проникливе про те, що він мав на увазі. Щось уздовж рядків "проходження повідомлення".

Ви знаєте, що він мав на увазі? Чи можете ви заповнити більш детальну інформацію про те, що він мав на увазі та чим він відрізняється від загального сьогоднішнього ОО? Будь ласка, поділіться деякими посиланнями, якщо вони є.

Дякую.


Можливо, ви знайдете цікаві мої записи в блозі з цього приводу: yegor256.com/tag/oop.html
yegor256

Перегляньте розділ коментарів до цього повідомлення в блозі, де Алан Кей сам відповідає на запитання: Алан Кей
помилявся про те, що він помилявся

Відповіді:


82

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


Дата: Ср, 23 липня 2003 09:33:31 -0800 До: Стефан Рам [видалено для конфіденційності] Від: Алан Кей [видалено для конфіденційності] Тема: Re: Роз'яснення "об'єктно-орієнтованого"

Привіт Стефане -

Вибачте за затримку, але я був у відпустці.

О 18:27 +0200 7/17/03 Стефан Рам написав:

Шановний доктор Кей,

Я хотів би мати якесь авторитетне слово про термін "об'єктно-орієнтоване програмування" для моєї сторінки підручника з цього питання. Єдині два джерела, які я вважаю "авторитетними", - це Міжнародна організація зі стандартів, яка визначає "об'єктно-орієнтовану" в "ISO / IEC 2382-15", і ви, тому що, як то кажуть, ви ввели цей термін.

Я майже впевнений, що так і зробив.

На жаль, важко знайти веб-сторінку або джерело з визначенням або описом цього терміна. Існує кілька повідомлень про те, що ви могли сказати з цього приводу (наприклад, "успадкування, поліморфізм та інкапсуляція"), але це не джерела з перших рук. Я також усвідомлюю, що пізніше ви більше ставите наголос на "обміні повідомленнями" - але я все одно хотів би знати про "об'єктно-орієнтовану".

Щодо записів, моєї сторінки підручника, а також для подальшого розповсюдження та публікації ви можете, будь ласка, пояснити:

Коли і де вперше вживали термін «об’єктно-орієнтована»?

У штаті Юта, після 66 листопада, коли під впливом Sketchpad, Simula, дизайну для ARPAnet, Burroughs B5000 та мого досвіду біології та математики я подумав про архітектуру програмування. Напевно, у 1967 році хтось запитав мене, що я роблю, і я сказав: "Це об'єктно-орієнтоване програмування".

Первісна концепція його мала наступні частини.

  • Я подумав, що такі об’єкти, як біологічні клітини та / або окремі комп’ютери в мережі, здатні спілкуватися лише з повідомленнями (тому повідомлення надходило на самому початку - знадобилося певний час, щоб зрозуміти, як зробити обмін повідомленнями на мові програмування достатньо ефективно, щоб бути корисним).

  • Я хотів позбутися даних. B5000 майже зробив це завдяки своїй майже неймовірній архітектурі HW. Я зрозумів, що метафора комірки / цілого комп'ютера позбудеться даних, і що "<-" буде просто ще одним символом повідомлення (мені знадобилося досить багато часу, щоб продумати це, бо я справді вважав усі ці символи як імена для функції та процедури.

  • З моїх математичних передумов я зрозумів, що кожен об'єкт може мати кілька алгебр, пов'язаних з ним, і можуть бути такі сім'ї, і що це буде дуже дуже корисно. Термін "поліморфізм" був накладений набагато пізніше (я думаю, Пітер Вегнер), і це не зовсім справедливо, оскільки він дійсно походить від номенклатури функцій, і я хотів зовсім трохи більше, ніж функції. Я склав термін «загальність» для роботи з родовою поведінкою у квазіалгебраїчній формі.

  • Мені не сподобалося, як наслідували наследство Simula I або Simula 67 (хоча я вважав, що Nygaard і Dahl були просто приголомшливими мислителями та дизайнерами). Тому я вирішив залишити спадщину як вбудовану функцію, поки не зрозумів її краще.

Мої оригінальні експерименти з цією архітектурою були зроблені за моделлю, яку я адаптував із «Узагальнення Алголя» Ван Війнгаартена та Вірта та Вірта Ейлера. Обидва вони були скоріше схожими на LISP, але з більш звичним для читання синтаксисом. Тоді я не розумів ідеї чудовисько LISP про відчутну метамовність, але наблизився до уявлень про розширювані мови, почерпнуті з різних джерел, включаючи IMP Irons.

Друга фаза цього полягала в тому, щоб нарешті зрозуміти LISP, а потім використати це розуміння, щоб зробити набагато приємнішими і меншими, більш потужними та більш пізньозв’язаними підструктурами. Дисертація Дейва Фішера була виконана в стилі "Маккарті", і його ідеї щодо розширюваних структур управління були дуже корисними. Іншим великим впливом в цей час був ПЛАНЕР Карла Хьюітта (який ніколи не здобув визнання, яке заслуговує, враховуючи, наскільки добре і як раніше він міг передбачити Пролог).

Оригінальний Smalltalk у Xerox PARC вийшов із вищезазначеного. У кінці розділу "Історія" скаржиться на наступні малі розмови: вони відступили в бік Simula і не замінили механізми розширення на більш безпечні, які були десь поблизу, як корисні.

Що для вас означає «об’єктно-орієнтоване [програмування]»? (Не потрібне введення, подібне до підручника, лише коротке пояснення [на зразок "програмування з успадкуванням, поліморфізм та інкапсуляція") з точки зору інших понять для читача, знайомого з ними, якщо це можливо. Крім того, не потрібно пояснювати "об'єкт ", оскільки я вже маю джерела з вашим поясненням" об'єкта "з" Рання історія малих розмов ".)

(Я не проти типів, але я не знаю жодної системи типів, яка не викликає повного болю, тому я все ще люблю динамічне введення тексту.)

OOP для мене означає лише обмін повідомленнями, локальне збереження та захист та приховування державно-процесу, а також надзвичайне запізнення всіх речей. Це можна зробити в Smalltalk та LISP. Можливо, є й інші системи, в яких це можливо, але я їх не знаю.

[Крім того,] Одне з речей, які я мав би зазначити, - це те, що існувало два основних шляхи, які каталізували Симула. Ранній (випадково) був маршрутом біо / нетто даних, який я взяв. Інший, який з’явився трохи пізніше як об’єкт дослідження, був абстрактними типами даних, і це отримало набагато більше гри.

Якщо ми подивимось на всю історію, то побачимо, що прото-OOP-матеріали, розпочаті з ADT, мали невелику роздвоєння до того, що я назвав "об'єктами" - це призвело до Smalltalk тощо., - але після маленької вилки, Створення CS дуже багато зробив ADT і хотів дотримуватися парадигми процедур даних. Історично варто поглянути на файлову систему USAF Burroughs 220 (яку я описав в історії Smalltalk), ранню роботу Дага Росса в MIT (AED та новіших версіях), в якій він виступав за вбудовування покажчиків процедури в структуру даних, Sketchpad (який мав повний поліморфізм - де, наприклад, одне зміщення в його структурі даних означало "відображення", і там був би вказівник на відповідний порядок для типу об'єкта, який представляла структура тощо, і Burroughs B5000, чиї довідкові таблиці програм були справжніми "великими об'єктами" і містили покажчики на "дані" та "процедури", але часто могли робити правильно, якби намагалися шукати дані та знаходили покажчик процедури. І найпершими проблемами, які я вирішив зі своїми ранніми матеріалами штату Юта, було "зникнення даних", використовуючи лише методи та об'єкти. Наприкінці 60-х (я думаю) Боб Бальцер написав досить чудовий документ під назвою "Програмування без даних", і незабаром після цього Джон Рейнольдс написав настільки ж чудовий папір "Геданкен" (в 1970 я думаю), в якому він показав, що використовує ламду вирази правильним способом дозволять абстрагувати дані процедурами. але часто можна зробити правильно, якби намагався шукати дані та знаходив покажчик процедури. І найпершими проблемами, які я вирішив у своїх ранніх справах Юти, було "зникнення даних", використовуючи лише методи та об'єкти. Наприкінці 60-х (я думаю) Боб Бальцер написав досить чудовий документ під назвою "Програмування без даних", і незабаром після цього Джон Рейнольдс написав настільки ж чудовий папір "Геданкен" (в 1970 я думаю), в якому він показав, що використовує ламду вирази правильним способом дозволять абстрагувати дані процедурами. але часто можна зробити правильно, якби намагався шукати дані та знаходив покажчик процедури. І найпершими проблемами, які я вирішив у своїх ранніх справах Юти, було "зникнення даних", використовуючи лише методи та об'єкти. Наприкінці 60-х (я думаю) Боб Бальцер написав досить чудовий документ під назвою "Програмування без даних", і незабаром після цього Джон Рейнольдс написав настільки ж чудовий папір "Геданкен" (в 1970 я думаю), в якому він показав, що використовує ламду вирази правильним способом дозволять абстрагувати дані процедурами.

Люди, яким подобалися об'єкти як недієві дані, були меншими за чисельністю, і я включав себе, Карла Хьюітта, Дейва Рід та ще декількох інших людей - майже всі цієї групи були з спільноти ARPA і були так чи інакше пов'язані з дизайн ARPAnet → Інтернет, в якому базовою одиницею обчислення був цілий комп'ютер. Але лише щоб показати, наскільки вперто може зависати ідея, протягом семидесятих та вісімдесятих років, було багато людей, які намагалися обійтись через «Виклик віддалених процедур», а не думати про об’єкти та повідомлення. Sic transit gloria mundi.

Ура,

Алан Кей


1
HTTP / 1.1 403 Заборонено доступ.
Робота

1
Я просто зміг отримати доступ до нього, тому це, мабуть, було тимчасовою проблемою. Дякую за те посилання, Маной.
Девід Конрад

2
@Job Середа (16 березня, день, коли ви, мабуть, отримали помилку 403) - це щомісячний день обслуговування адміністратора домену на сторінці userpage.fu-berlin.de). Вони звичайно беруть частину мережі офлайн один раз на місяць. Ага, так, не питайте…
Конрад Рудольф

Чи можете ви / хтось уточнити, що означає "я хотів позбутися даних"? Дані є невід'ємною частиною ОО (тобто його часто інкапсулюють у класі або передають у / з класів), і яка б парадигма не використовувалася, без даних у обчисленні не обійтися, тому позбавлення даних для мене не має сенсу. .
Денніс

1
<- був оригінальним оператором призначення
маленьких розмов

22

Більшість, якщо не все те, що мав на увазі Алан Кей під орієнтацією на об'єкт , втілено в мові Smalltalk.

Також з http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models :

Алан Кей стверджував, що передача повідомлень важливіша, ніж об'єкти в ООП, і що самі об'єкти часто надмірно підкреслюються. На цьому спостереженні будується модель програмування розподілених в реальному часі об'єктів; він використовує концепцію розподіленого потоку даних для характеристики поведінки складної розподіленої системи з точки зору моделей повідомлень, використовуючи специфікації на високому рівні у функціональному стилі.

18
Потім дивується, чому він назвав це "Об'єктно-орієнтованим", а не "Орієнтованим на повідомлення".
Девід Торнлі

@David Thornley: Отже, це зробить метод C ++ орієнтованим?
back2dos

60
Я надто роздумував над терміном ще в 60-х, і мав обрати щось на кшталт "орієнтованого на повідомлення"
Алан Кей

1
Але що тоді "орієнтоване на повідомлення"? (Я можу подумати про виклики асинхронізації (можливо), але насправді не знаю жодної мови, що не реалізує більш-менш «нормальні» методи; також є річ у значеннях повернення, але це може бути обмануто таким чином « ref '/' out 'параметри або щось подібне)
mlvljr

1
"орієнтована на повідомлення" - це в основному пізнє прив'язування / динамічне введення тексту - повідомлення, передане об'єкту, аналізується (цим об'єктом) під час виконання.
Марк Сідаде

6

Більшість, якщо не все те, що мав на увазі Алан Кей під орієнтацією на об'єкт, втілено в мові Smalltalk.

"Ми навіть не зробили всієї ідеї в PARC. Багато ідей" Карлів Хьюітта ", які були викликані оригінальним Smalltalk, були більше в дусі OOP, ніж наступні Smalltalks. Значні частини Erlang більше схожі на справжню мову OOP нинішній Smalltalk, і, звичайно, мови на основі C, які були пофарбовані "OOP фарбою". "

Взято з коментаря Алана Кей на:

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


Ви повинні прокрутити далеко вниз коментарі, ось пряме посилання на коментар Алана Кей: computinged.wordpress.com/2010/09/11/…
icc97

Цей весь коментар дуже корисний, він починається з потенційної відповіді на це запитання: "Хорошим прикладом великої системи, яку я вважаю" об'єктно-орієнтованою ", є Інтернет. Він має мільярди повністю інкапсульованих об'єктів (самі комп'ютери) та використовує чиста система обміну повідомленнями "запити не команди" тощо. "
icc97

5

Один з найважливіших моментів, який я підхопив після виконання робіт Алана Кей та інших, таких як Джим Коплін, - це те, що справжнє "об'єктно-орієнтоване програмування" стосується моделювання комп'ютерів та програмного забезпечення з точки зору розумових моделей ЛЮДИНИ / КОРОТКУ, а не просто інструмент для ПРОГРАММЕРІВ.

Як я розумію, бачення Алана OOP робило комп'ютер інструментом, який дозволяє користувачеві зробити людину все, що завгодно: усі можливості комп'ютера безпосередньо піддаються кінцевому користувачеві через інтуїтивну інтерактивну модель. Я повинен мати можливість переглядати та ліпити об'єкти виконання та взаємодії Прямо, а не лише через код.

Ось публікація про мої плани спробувати деяку версію цього тексту в JavaScript як доказ концепції: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494

З точки зору розробки / програмування програмного забезпечення, Джим Копліен розповідає про те, як код і ДОЛЖЕН би нагадувати ментальну модель користувачів. Тобто код читається приблизно так само, як це звучало б людина, описуючи його поведінку. Це значною мірою досягається шляхом мислення з точки зору ОБ'ЄКТІВ, а не з точки зору КЛАСІВ ТА ТИПІВ. Поведінка описується в термінах РОЛІВ, які відтворюються об'єктами, а не як частина визначення ідентичності об'єкта. Ви повинні мати змогу моделювати взаємодію за умовами об’єктів, які ідентифікуються РОЛЮ, яку вони грають у взаємодії. Ось як працюють ментальні моделі людини: офіціант, клієнт, касир, вихідний рахунок, цільовий рахунок ... Це РОЛИ, а не ТИПИ, і ви хочете вміти визначати методи для того, щоб "будь-який об'єкт грав цю роль у той час". ",


DDD використовує подібні поняття. Напевно, ви маєте рацію з цього приводу. :-)
inf3rno
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.