Які функції необхідні для орієнтації на об'єкти?


9

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

Наприклад, подивіться на наступний код C:

SDL_Surface* screen = SDL_SetVideoMode( 640, 480, 16, SDL_HWSURFACE);
SDL_FreeSurface( screen );

або код, обговорений тут .

Тепер наведений вище код не використовує успадкування, поліморфізм (?), Віртуальні функції і т. Д. Але мені це здається OOP.

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


2
OOP зазвичай вимагає об'єктів . Однак можна написати код, який виглядає OOP на більшості мов (я сумніваюся, ви можете сказати "ця збірка виглядає OOP")
Raynos

Вищевказаний код не використовує оператор if або цикл . Він не використовує множення чи додавання. Ви не можете використовувати два рядки коду та список речей, які не відображаються, щоб взагалі зробити будь-яке судження. З цих двох рядків коду я міг зробити висновок, що це суто ледача функціональна мова програмування, а не мова ОО. Використання двох рядків коду як частини узагальнення не є справжнім питанням.
S.Lott

Посилання також включаються в наведеному вище коді , який я судив на. Також зауважте, що це не рішення , я прошу вас, чи можна це вважати ООП.
ApprenticeHacker

Тривіальна відповідь - так . Моя думка в цьому. Ви не можете - з прикладів коду - судити про OOP. Це банальна справа визначення. Або мова визначена як мова OOP, або її немає. Будь-який заданий зразок коду може не вимагати всіх функцій OOP. Дійсно, код OOP може використовувати дуже-дуже мало функцій. Наприклад, у Python 1+2насправді є об'єктно-орієнтована. Це конструктор, який будує новий об’єкт із двох існуючих об’єктів. Використання зразків коду нічого не виявляє.
S.Lott

Що поганого у використанні цього визначення та порівнянні з мовою (не два зразки коду)? en.wikipedia.org/wiki/…
С.Лотт

Відповіді:


11

За словами Алана Кей, який винайшов термін "орієнтований на об'єкт",

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

Повідомлення (як реалізовано в Smalltalk) - це поняття, яке можна порівняти з поліморфізмом, але досить потужнішим (принаймні, ніж поліморфізм, підтримуваний C ++ або Java). Це можна зробити на всіх мовах, але досить болісно, ​​якщо не підтримується безпосередньо мовою. В основному це означає, що об'єкти можуть надсилати один одному повідомлення, що містять що завгодно, а AMD може реагувати, хоча вони хочуть, на повідомлення, які вони отримують. Щоб повністю підтримувати обмін повідомленнями, повинен існувати спосіб, щоб об'єкти гнучко реагували на повідомлення, не перераховуючи їх у вихідному коді (що в основному є тим, що виконують визначення методу / функції).

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

пізнє прив’язування всіх речей - розсувна шкала, за якою С насправді далеко від бачення Кей (Як це C ++, тоді як Java набагато ближче). Можна підробити (див. COM), але це буде біль.

Зверніть увагу, як Кей не згадує спадщину . У тому ж електронному листі він написав

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


4
Як саме Java та C # ближче до пізнього зв’язування, ніж C ++?
fredoverflow

@FredOverflow: Java ліниво завантажує визначення класів під час виконання під час їх першого використання, і робить це неявно через надзвичайно гнучкий механізм, який легко дозволяє додавати нові класи або навіть генерувати їх на льоту. C ++ вимагає, щоб ви знову пов’язали виконувані або явно завантажували бібліотеки. Ситуація з C # здається менш зрозумілою, ніж я думав, тому я видалив посилання на ti.
Майкл Боргвардт

5

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

Отже, будь-яка мова, яка може якось моделювати об'єкти (сутності, що містять і дані, і код) та інкапсуляцію, може використовуватися для створення OOP. Наприклад, на C ви можете використовувати покажчики функцій для зберігання функцій у структурах, а можна використовувати заголовок / вихідну файлову систему для реалізації інкапсуляції. Це не зручно, але досить зробити OOP. Ви, мабуть, навіть можете згорнути щось на зразок Haskell або ML у виконанні OOP, і я не здивуюсь, якби хтось міг придумати спосіб проведення OOP в зборі.

Однак практично мовою можна назвати "об'єктно-орієнтовану", якщо вона пропонує повний набір функцій синтаксису для явного об'єктно-орієнтованого програмування. Як правило, це означає, що така мова повинна мати: * поняття про об'єкт * поняття про виклик методу або передачу повідомлення * зручний та простий спосіб управління доступом до членів об’єкта * зручний та простий спосіб визначення інтерфейсів

Отже, я би назвав фрагмент кодового об'єкта, якщо він дотримується принципів OOP та використовує наявний синтаксис OOP.

До речі, ваш приклад коду, ймовірно , використовує поліморфізм та віртуальні функції, хоча синтаксис C не робить це очевидним. Я не фахівець з SDL, але сподіваюся, SDL_surfaceщо зможу представляти різні типи поверхонь, кожна зі своїм специфічним набором реалізацій - для того, щоб щось вибивати на біт-карту пам’яті, а блискавка до поверхні екрана вимагає докорінних відмінностей код, але інтерфейс (функції, які беруть SDL_surface*аргумент) залишається тим самим. Так само, він також реалізує інкапсуляцію: ви не можете отримати доступ до основного представлення поверхні безпосередньо, ви повинні пройти функції, які вміють обробляти SDL_surface, тому що це все, що у вас є. Це приємний приклад того, як ви робили OOP у C.


Абстрактні типи даних, моделювання даних та інкапсуляція не властиві лише OO (як ви коротко зазначите про себе). Я вважаю за краще описати ОО на основі його більш унікальних особливостей (динамічне зв’язування викликів методу, поліморфізм через виклики зазначеного методу тощо)
hugomg

4

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

Конкретний синтаксис для реалізації ОО не є ключем, який визначає, є мова є ОО чи ні. Наприклад, Smalltalk і C # мають різні синтаксиси, але обидва є мовами OO (в різній мірі). Ключовим є те, чи зберігає дана мова філософію (вище) та чи надає необхідні засоби імплантації.


2

Ще в студенті мене вчили, що об'єктно-орієнтоване програмування стоїть на трьох стовпах:

  • капсулювання ,
  • поліморфізм , і
  • спадкування .

Мова повинна підтримувати ці функції , щоб вважати об'єктно-орієнтованою мовою.

Зауважте, що це описує набір функцій, а не синтаксис . Отже, чи потрібно писати

type obj; // or type obj = new type;
obj.func(arg);

або

type* ptr = create_type();
func(ptr, arg); 

не має значення.

Таким чином, ви дійсно можете програмувати відповідно до об'єктно-орієнтованої парадигми на C. Але мова не підтримує цього, що робить це досить болісною вправою. Ось чому C не вважається об'єктно-орієнтованою мовою.


2
Викладання цих "стовпів", мабуть, принесло світу більше шкоди, ніж користі. Інкапсуляція - це добре, але це стосується цього.
tdammers

1
Вони в цьому списку, тому вони, здається, широко прийняті: en.wikipedia.org/wiki/…
S.Lott

Чи можете ви пояснити, чому поліморфізм та спадковість погані?
MathAttack

@MathAttack: Ти говориш зі мною? Тому що я точно не казав цього.
sbi

1
@missingno: Щось не повинно бути унікальним для певної парадигми, щоб вважати важливим, щоб відрізняти парадигму. Інкапсуляція більше не повинна бути унікальною для OOP, оскільки функції повинні бути унікальними для структурованого програмування.
sbi

2

Ви можете робити ОО будь-якою пристойною мовою загального призначення.

Це легше зробити це в «ОО» мовою, тому що у вас є ідіоматичні конструкції доступні і не повинні вдаватися до чого - то , як OO в C - що це можливо, але і страшний.

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


2

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

Дві основні інші характеристики, пов'язані з мовами ОО, надані мовами, що не належать до ОО:

  • Інкапсуляція досить добре забезпечується Ada83;
  • Спадщина надається Обероном (Оберон цікавий, Вірт хотів надати мові ОО з якомога меншою кількістю суворості, але довелося переглянути свою концепцію, щоб отримати її - Оберон-2 є ОО).

1

Орієнтація об'єкта визначається як

також ознайомтеся з записами у вікіпедії. це ті особливості, якими повинна надати мова, щоб вона була визначена як об'єктно-орієнтована.

вважайте, що ваш код орієнтований на об'єкт, якщо він знаходиться в об'єктно-орієнтованій мові програмування. навіть якщо ви пишете щось, що видається процедурним, воно буде діяти на методи в об'єктах з класів, що використовують поліморфізм шляхом інкапсуляції [можливо] :)

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


3
Визначено ким?
Майкл Боргвардт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.