Чому спадкування, інкапсуляція та поліморфізм не є опорами ООП? [зачинено]


16

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

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

Але в чаті "Переповнення стека" мене жорстоко висміяли, учасники категорично не погодилися з такою заявою. Отже, що не так з цим твердженням?

Чи здається, що програмісти навчаються різним речам у коледжах пострадянського простору та США?

Чи спадкування, інкапсуляція та поліморфізм не вважаються опорами ООП програмістами США та Великобританії?


7
Ваше запитання не має контексту; ми не знаємо, про що думали люди в чаті, або що вони відповідали. Можливо, ви можете зв’язати розмову в кімнаті для чату, щоб ми могли подивитись на це? Однак, я думаю, що це найкраще вирішити в кімнаті чату, а не тут.
Роберт Харві

1
@Robert, занадто багато часу минуло. Я сумніваюся, чи зможу я взагалі знайти посилання на розмову. Але я згоден, що контекст важливий. Не винуватити когось, чи представляти себе невиною жертвою агресії в чаті, я просто хочу знати правду.
PaulD

5
Лаунж. Ви спочатку одягали свій вогнестійкий костюм?
Роберт Харві

1
Єдине значення, яке я можу надати реченню, це або "ви можете мати OOP без жодного з них" (правда, але не має сенсу принаймні для інкапсуляції), або "ви можете використовувати їх і поза OOP", або щось подібне.
SJuan76

2
IO OO має лише один стовп, і це: "Держава". Як тільки ваш мозок замислюється в стані, ви отримуєте ОО.
Пітер Б

Відповіді:


40

Чи спадкування, інкапсуляція та поліморфізм не вважаються опорами ООП програмістами США та Великобританії?

Багато програмістів вважаються стовпами, і багато коледжів навчають ОО таким чином.

На жаль, це також короткозорий вигляд.

  • Спадкування - це лише один механізм, який використовується для впровадження OOP, і його можна зловживати, щоб не робити OOP.
  • Інкапсуляція - це концепція, корисна для програмування різного роду, OOP і ні.
  • Поліморфізм - це ... ознака (?) Для опису поведінки обчислень. Існує багато способів досягнення поліморфізму, не всі з яких є специфічними для ОО.

OOP має дуже мало підґрунтя, оскільки насправді це дуже концептуально: "Підходьте до проекту вашої програми, думаючи про речі як про об'єкти - згуртовані пачки даних та функціональні можливості".

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


10
Гідна відповідь на по суті невідчутне запитання.
Роберт Харві

3
Чи існує ООП?
Tulains Córdova

5
Я б заперечував, що лише інкапсуляція є «стовпом» ООП. Найбільша відмінність OOP від ​​структурного програмування полягає в ідеї, що об'єкти містять код і дані, а не лише дані (наприклад, класична структура С). Два інших поняття в основному використовуються в мовах ОО, але вони не обмежуються лише ОО та не вимагаються ним.

3
@Snowman Інкапсуляція також не обмежується OOP. Люди весь час реалізують абстрактні типи даних на мові С та на функціональній мові.
Doval

2
І @ JörgWMittag отримав хорошу відповідь щодо повідомлень. Ідея обміну повідомленнями обов'язково вимагає інкапсуляції. Повідомлення зазвичай передаються функції або методу на об'єкті, який потім діє на стан, який в ньому інкапсульовано . Це не означає, що мови, що не мають ОО, також не можуть мати повідомлення або інкапсуляцію, лише те, що це основоположні ідеї ООП.

23

tl; dr: Ви можете мати спадщину без OO, ви можете мати капсуляцію без OO, ви можете мати поліморфізм без OO, ви можете навіть всі три одночасно без OO. На зворотному боці ви можете мати ОО без спадкування. Крім того, існують різні види інкапсуляції (орієнтовані на ADT та OO); IOW не всі інкапсуляції є OO.

Довга версія:

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

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

По мірі впровадження, обмін повідомленнями - це запізнілий виклик процедури, і якщо виклики процедури запізніли, то ви не можете знати в час проекту, що ви збираєтесь викликати, тому ви не можете робити жодних припущень щодо конкретного подання стану. Отже, насправді мова йде про обмін повідомленнями, пізнє зв’язування - це реалізація повідомлень, а інкапсуляція є наслідком цього.

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

Лише ніжне нагадування про те, що я взяв певні болі на останньому OOPSLA, щоб спробувати нагадати всім, що Smalltalk - це не лише НЕ його синтаксис чи бібліотека класів, мова навіть не про класи. Мені шкода, що я давно придумав для цієї теми термін «об’єкти», оскільки це змушує багатьох людей зосередитися на меншій ідеї.

Велика ідея - це "обмін повідомленнями" - саме про це і полягає ядро ​​Smalltalk / Squeak (і це те, що ніколи не було завершено в нашій фазі Xerox PARC). У японців є невелике слово - ma - для "того, що знаходиться між ними" - можливо, найближчий англійський еквівалент "interstitial". Ключове значення у створенні чудових та розростаючих систем - це набагато більше, щоб розробити, як його модулі спілкуються, а не якими мають бути їх внутрішні властивості та поведінка. Подумайте про Інтернет - щоб жити, він (а) повинен дозволити безліч різних ідей та реалізацій, що виходять за межі будь-якого єдиного стандарту, та (b) дозволяти різного ступеня безпечної взаємодії між цими ідеями.

(Звичайно, сьогодні більшість людей навіть не зосереджуються на предметах, а на заняттях, що ще більше неправильно.)

Повідомлення є основним для ОО як метафори, так і як механізму.

Якщо ви надіслаєте комусь повідомлення, ви не знаєте, що вони з ним роблять. Тільки річ , яку ви можете спостерігати, їх відповідь. Ви не знаєте, чи обробляли вони повідомлення самостійно (тобто, якщо об’єкт має метод), чи пересилали повідомлення комусь іншому (делегування / надання доступу), якщо вони навіть розуміли його. Ось в чому полягає інкапсуляція, ось про що йдеться ОО. Ви навіть не можете відрізнити проксі від реального, якщо він відповідає, як ви цього очікуєте.

Більш "сучасним" терміном "обмін повідомленнями" є "динамічне відправлення методу" або "віртуальний виклик методу", але це втрачає метафору і фокусується на механізмі.

Подібні пункти також в On Розуміння абстракції даних, Revisited по Вільям Р. Кук , а також його пропозиція щодо спрощення, сучасні визначення «об'єкта» і «об'єктно - орієнтованого» .

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

У Smalltalk-72 навіть об’єктів не було! Були лише потоки повідомлень, які були розібрані, переписані та перепрограні. Спочатку з'явилися методи (стандартні способи розбору та перенаправлення потоків повідомлень), пізніше з'явилися об'єкти (групування методів, які поділяють деякий приватний стан). Успадкування з'явилося набагато пізніше, і заняття були запроваджені лише як спосіб підтримки спадщини. Якби дослідницька група Кей вже знала про прототипи, вони, ймовірно, ніколи б не вводили заняття в першу чергу.

Кожен програміст повинен прочитати « Розуміння абстрагування даних», переглянутий . Це докладно пояснює, у чому саме різниця полягає між об'єктами та абстрактними типами даних. Він наводить приклади, використовуючи Java, і це надзвичайно актуально для цього питання, оскільки і в прикладах ADT, і в об'єктних прикладах він використовує успадкування, інкапсуляцію та поліморфізм, але лише один із прикладів об'єктно-орієнтований! Іншими словами: у вас може бути спадщина, інкапсуляція та поліморфізм, ви навіть можете мати всіх трьох одночасно і все ще не мати ОО.

З іншого боку, ви можете мати ОО без спадкування. Як я натякав вище: оригінальні версії Smalltalk (мова, розроблена Аланом Кей, винахідником терміна "Об'єктно-орієнтоване програмування") не мали успадкування.

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


Ви можете мати "спадщину", "поліморфізм" і "спадщину" ... міркує, що там десь
друкується

1
Ця відповідь змушує мене також побажати, що ми могли б "улюблені" відповіді.
Чан-Хо Су

Визначення Алана Кей застаріле. OO потребує успадкування, і якщо ви можете виконати прив'язку часу виконання та компіляції, як у C ++, ви також отримаєте продуктивність нарівні з C.
Ерік Алапя

Ні, його визначення є правильним. Вам взагалі не потрібно спадкування, щоб бути ОО. Мови прототипів не використовують успадкування, як C ++, і вони все ще є OO. Спадкування використовується лише для повторного використання коду, це навіть не найкращий спосіб, наприклад, існує багато кращих мов, у яких є міксини. Це також не має нічого спільного з прив'язкою, оскільки ви можете мати динамічну диспетчеризацію, навіть не на C ++, коли ви можете використовувати віртуальні методи. Продуктивність не має нічого спільного з цим, це концепції високого рівня, вони не мають продуктивності. Насправді ви могли реалізувати передачу повідомлень у C та бути OO
Луїз Феліпе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.