Що означає "ООП приховує державу"? [зачинено]


11

В одній із багатьох анти-ООП-рейтів на cat-v.org я знайшов уривок Джо Армстронга, який висунув кілька заперечень проти моделі ООП, одним з яких було таке:

Заперечення 4 - Об'єкти мають приватний стан

Держава - корінь усього зла. Зокрема, слід уникати функцій з побічними ефектами.

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

Зважаючи на те, що держава існує в реальному світі, які засоби програмування повинні передбачати мову програмування для роботи з державою?

OOPL кажуть "приховати стан від програміста". Стани приховані і видимі лише через функції доступу. Звичайні мови програмування (C, Паскаль) кажуть, що видимість змінних стану контролюється правилами області застосування мови. Чисті декларативні мови говорять про те, що немає держави. Глобальний стан системи здійснюється у всіх функціях і виходить з усіх функцій. Такі механізми, як монади (для FPL) та DCG (логічні мови) використовуються для приховування стану програміста, щоб вони могли програмувати «як би стан не мав значення», але мати повний доступ до стану системи, якщо це буде необхідно.

Опція «приховати стан від програміста», обрана OOPL, є гіршим можливим вибором. Замість того, щоб розкривати державу і намагатися знайти способи мінімізувати неприємності держави, вони приховують це.

Що саме мається на увазі під цим? У мене дуже мало низького рівня чи процедурного досвіду, переважно OOP, так що, ймовірно, пояснюється, наскільки я незнайомий з цим. І з більш сучасної точки зору, тепер, коли більшість об'єктно-орієнтованих істерій пройшли (принаймні, наскільки я можу сказати), наскільки точним / релевантним ви вважаєте, що це уривок?

Спасибі за вашу допомогу.


3
рекомендуємо прочитати: Обговори це $ {blog}
gnat

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

1
Ба. Все більше я думаю, що вся ця «непорушна» річ - це гарна ідея, яка починає смердити від релігії.
Роб

3
Джо Армстронг публічно визнав, що його заперечення проти ОО грунтуються на серйозних непорозуміннях, що саме є ОО. Зараз він зрозумів, що Ерланг насправді є глибоко об'єктно-орієнтованою мовою (насправді це може бути найбільш об'єктно-орієнтована мова в основному використанні).
Jörg W Mittag

9
Для розширення цього питання: перше захоплення archive.org про рандо Джо Армстронга - з квітня 2001 року. Джо написав свою дисертацію в 2003 році. Під час написання дисертації він дізнався багато про ОО, і зрозумів, що став здобиччю поширене неправильне уявлення про те, що ОО якимось чином було пов'язане зі станом, що змінюється (це не так, стан, що змінюється, є абсолютно ортогональним). З того часу він визнав, що його критика щодо ОО була помилковою і що за іронією долі Ерланг - це фактично об'єктно-орієнтована мова (у ній є повідомлення, у неї є об'єкти, які вона називає процесами, у неї інкапсуляція).
Йорг W Міттаг

Відповіді:


32

Що саме мається на увазі під цим?

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

як точний / релевантний ви думаєте, хлопці, цей пасаж?

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

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

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


3
З усією думкою погоджуйтеся на цілі "школи java", це зовсім не так. Дуже дякую, я би голосував, якби міг.
Джейк

2
Якщо бути точним: монади взагалі не приховують стан, деякі монади (наприклад, IO). Дивіться серед інших stackoverflow.com/questions/2488646 / ...
thSoft

2
+1. Це набагато більш збалансований та нюансований аналіз, ніж стаття, до якої
Бенджамін Ходжсон

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

2
Йорг - ви могли б опублікувати посилання на подальше від Джо? Мені б дуже цікаво прочитати. І @radarbob, прямо так!
user949300

2

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

На практиці ефективне програмування часто вимагає, щоб деякі об'єкти мали змінений стан; такий стан, однак, повинно бути обмежено, однак, нерозділені об'єктів робочих. Розглянемо IEnumerable/ IEnumeratorінтерфейси в .NET: якщо колекція реалізується IEnumerable, вона дозволить прочитати елементи по черзі. Фактичний процес зчитування колекції часто вимагає відстеження, які елементи були прочитані (фрагмент змінного стану), але такий стан не міститься в рамках реалізації IEnumerable. Натомість IEnumerableнадає метод, GetEnumeratorякий називається, який поверне об'єкт, який реалізує IEnumeratorта містить достатній стан, щоб дозволити зчитування елементів із колекції. Те, що об'єкт містить такий стан, не створюватиме проблем, протеякщо реалізація об'єкта IEnumeratorне поділяється .

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


Відмінна відмінність між тим, що має бути незмінним, і тим, що може мати стан, що змінюється. Читаючи це, я зрозумів, що мої новіші графіки об’єктів (більш непорушні, ніж раніше) в основному слідують цьому керівництву, не викладаючи його так чітко, як ви. Це хороший помірний протиотруту проти «мутаційного стану - це завжди зло», яке ви іноді чуєте.
Майк підтримує Моніку

@Mike: Я думаю, що справжня проблема полягає в тому, що всі посилання на об'єкти в Java та .NET повністю розбірливі; будь-який код, який набуває або отримує посилання на об'єкт, може ділитися ним з будь-яким іншим кодом без обмежень. Жоден фреймворк не має жодного поняття нероздільного еталонного поля; структури та byrefs у .NET близькі, але вони є досить обмеженими в плані того, що вони можуть зробити або що можуть завадити виконувати зовнішній код. У будь-якому випадку, я б запропонував фундаментальну приказку щодо стану, що змінюється: о 12:57, об'єкт може одночасно представляти ...
supercat

... теперішній стан об'єкта реального світу та стан об'єкта мав о 12:57 ранку. Якщо стан об'єкта в реальному світі зміниться, об’єкт більше не зможе представляти обох. Іноді потрібно, щоб об’єкт продовжував представляти стан 12:57, а іноді і теперішній стан. Однак зв'язок між станом 12:57 та теперішнім станом не може залишатися, якщо теперішній стан зміниться.
supercat

0

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

Зрештою, у кожного є своя улюблена мова, яку вони описують такими термінами, як "дуже дуже потужна", тобто вони їм дуже подобаються . Але дивовижність обчислювальної універсальності полягає в тому, що якою б славною не була мова, якщо вона справді потужна, вона може імітувати асемблерну мову. І якщо може, хтось побачить, що це робить. (Не те, що в мові складання нічого поганого.)

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

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

Тоді, як на наступному рівні, я хотів би, щоб штучний інтелект зміцнювався. Мені хотілося б, щоб програмісти рухалися за байтами та потоками, а також віртуальними таблицями функцій та CUDA та переходили до того, як змусити машини міркувати, вчитися та створювати. Я знаю, що це просунулося дуже далеко в невеликих куточках поля, але ніде досить широко.


1
"Якщо він справді потужний, він може імітувати мову складання" - ви поміняєте своє визначення powerfulсаме там. Коли інші кажуть powerful, вони говорять про те, наскільки добре це дозволяє програмістам абстрагуватися , що історія інша, ніж обчислювальна потужність .
Філ

@Phil: конспект - ще одне з цих слів :)
Майк Данлаве

Ні. Ви говорили про слова. Я говорив про ідеї. Ваше 2-е та 3-е вживання слова powerозначають різні речі. Будь ласка, не вводите в оману.
Філ

Btw, якщо вам цікаво, перегляньте Ракетку , яка дещо близька до підходу, про який ви говорите в четвертому пункті (що дозволяє програмістам довести мову до рівня своєї проблеми, а не змусити їх звести свою проблему до рівня фіксований набір конструкцій мови). Це виходить за рамки класичної програми Lisp / Scheme, лише на випадок, коли хтось матиме таке враження при першому погляді.
Філ

0

Доступність не є особливістю OOP, вона специфічна для таких реалізацій, як Java та Microsoft dotNET. Основна особливість, яка визначає ООП, - поліморфізм.

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

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


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