Для яких проблем об’єктно-орієнтоване програмування не є вдалим вибором? [зачинено]


19

Дещо натхнене цим питанням: Для яких поширених проблем функціональне програмування не годиться? - але все-таки питання, яке я завжди хотів, але надто боявся задавати.

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

Тож я хотів би запитати вас, які б були проблеми сорту, для яких об'єктно-орієнтована парадигма не була б хорошим вибором? У порівнянні з процедурним програмуванням?


Відповіді:


8

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

Вільям Кук чудово пояснює різницю між об'єктами та абстрактними типами даних.

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


5

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


3
Розв’язка - це приємний побічний ефект програмування ОО, зробленого добре, але я б сказав, що головна перевага програмування ОО - організаційне включення функціональності.
Роберт Харві

1
@ Роберт Харві: Я маю іншу точку зору на однакову реальність: для мене організаційне інкапсуляція функціональності є засобом отримання розв'язки, що, у свою чергу, дозволяє повторно використовувати.
mouviciel

@ Роберт Харві: З'єднання та згуртованість - це два способи дивитись по суті на одне і те ж, що є свого роду місцевістю, де можна щось зрозуміти, не потребуючи розуміння занадто багато іншого.
Девід Торнлі

Я думаю, що частина розбіжності полягає в тому, що ІМХО, що використовує ОО, означає, що ви широко використовуєте поліморфізм та успадкування, принаймні інтерфейсів. Наприклад, за моїм визначенням OO, структури C # або D або використання лише остаточних / герметичних класів і жодних інтерфейсів не вважатимуться синтаксичним цукром плюс декількома атрибутами контролю доступу, а не справжніми OO.
dimimcha

3

паралельність: механізм блокування видається проблематичним; тільки деякі дуже хороші розробники покладені на роботу над ниткою частини проектів

розширення: не знаю, наскільки доступні поточні мови OO. тільки знаю, що Java погана. для цього DSL (мови, що стосуються домену) повинні бути реалізовані як рамки. Clojure з іншого боку (тобто функціональний), має макроси.


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

+1 для згадки про одночасність. Концепція, подібна до об'єктів, але підтримує одночасність, - це актор. Актори - це супутні об'єкти, які спілкуються, обмінюючись асинхронними повідомленнями.
Джорджіо

Дітто про одночасність; Я заявив, що ОО, заохочуючи вас виявляти / підтримувати дискретні державні одиниці , насправді заохочує проблеми одночасності.
користувач1172763

0

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

Основний алгоритм, як, наприклад, qsort()використовує абстракції для порівняння довільних об'єктів. fread()використовує інтерфейс для вилучення деталей потоку тощо.

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


0

Я думаю, що при побудові систем, що поєднують інші системи через веб-apis (rest, xmlprc, звичайний curl / wget), ви можете писати OO обгортки, але це очевидно лише зручність. Якщо веб-сервіс, який слід використовувати, простий, і це лише питання однієї чи двох ліній, то OO - це занадто багато. Якщо, з іншого боку, вам доведеться обгортати складні веб-файли (наприклад, Amazon AWS), тоді приємно мати бібліотеку обгортки (як, наприклад, boto в python для AWS).

Думки?


0

Об'єктно-орієнтовані мови PURE не підходять для багатьох випадків. Оскільки для чистої об'єктно-орієнтованої мови необхідно виконати деякі критерії. Див.
Https://stackoverflow.com/questions/250062/what-is-meant-by-the-term-true-object-orientation/250098#250098

Але найбільш широко вживаними мовами програмування є багатопарадигма. Вони містять безліч функцій, що не входять в ООС, щоб зіткнутися з різними проблемами програмування та розробки. C ++, C #, Java або Ruby мають усі функції, що не належать до виводу. Отже, вони можуть зіткнутися з проблемами, в яких чисто-OO не годиться.


0

Об'єктно-орієнтоване програмування можна використовувати для моделювання вашого домену. Класи можуть бути використані для представлення стану та поведінки сутностей, агрегатів, співпраці, служб у вашій моделі домену. Більше того, виклики методів та протоколи між об'єктами можуть моделювати динамічні відносини між сутностями.

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

Тут важливо зазначити, що «сутності», про які я згадував вище, не повинні відображати об’єкти реального світу! Вони можуть представляти абстрактні частини домену вашої програми.

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

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