Альтернативи об’єктно-орієнтованому програмуванню?


83

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

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

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


1
@Justin Ardini: Я знаю, що їх багато, але хто з них може скласти конкуренцію oop? @Tobiasopdenbrouw & Macros: Добре, змінено.
Dariusz Woźniak

ООП популярний, тому що популярний, якщо ви не проковтнете кулаїд ООП, у вас не буде жодних проектів, над якими можна працювати ...
aoeu256

Орієнтоване на дані програмування простіше, коли ви дбаєте про колекції об'єктів та їх взаємозв'язки, а не про окремі об'єкти, де методи "db object" забезпечують інкапсуляцію. JSON та sexpressions підсолоджують SQL, CSS, HTML, Excel, сценарії оболонки популярні та корисні, але "програмування" означає ООП або процедурні. OOP дякує за підтримку програм Python / JavaScript, незважаючи на те, що OOP становить 20% коду. Закриття та JSON можна використовувати 90% часу замість Об’єктів, вони простіші та простіші у використанні.
aoeu256

Відповіді:


51

Функціональне програмування - ще одна парадигма програмування, яка користується популярністю переважно серед науковців. Найкращий приклад функціональної мови програмування - Haskell і Standard ML .

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

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

Є також новіші мови функціонального програмування, які поєднують функціональне програмування з ООП. Два хороші приклади - F # для платформи .NET та Scala для платформи Java; вони часто можуть використовувати існуючі бібліотеки на платформі, написані іншими мовами.

Зараз тенденцією нових мов програмування є багатопарадигма , коли кілька парадигм, таких як об’єктно-орієнтоване програмування та функціональне програмування, поєднуються в одній мові.


4
Scala прагне інтегрувати особливості об’єктно-орієнтованих та функціональних мов.
Філіп

5
Хороша відповідь, але я думаю, що функціональне програмування та об’єктно-орієнтоване програмування не є двома сторонами медалі, вони можуть чудово співіснувати (як ви вже згадали). Це приблизно так: Процедурна проти об’єктно-орієнтованої, імперативна проти функціональної. Lisp - це популярна процедурна функціональна мова, Java - об'єктно-орієнтована імперативна мова.
fhd

1
@ ventr1s: Так, функціональне програмування може замінити ООП, але, швидше за все, воно буде використовуватися разом із ООП такими мовами, як Scala та F #.
Йонас

1
@ ventr1s: Хорошим прикладом функціонального програмування в галузі є розподілена база даних NoSQL RIAK, написана на Ерлангі. riak.basho.com
Йонас

2
@ ventr1s: Перегляньте це питання про функціональне програмування та шаблони проектування: stackoverflow.com/questions/327955/…
Йонас,

12

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

Його, звичайно, можна використовувати у великомасштабних продуктах з мінімумом болю та максимумом продуктивності


4
Так, і незліченні метричні дослідження показали, що у нього закінчується газ приблизно на 150 тис. LOC. Подивіться на період часу Windows SDK Петцольда, щоб побачити трактат про те, як структуроване програмування розпадається під навантаженням складності: функції з 8 аргументами, 2 - це структури з 6-10 членами. Введення та виведення даних з кожної одиниці обчислення з часом просто не працює.
Роб

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

Об'єктно-орієнтоване програмування іноді призводить до того, що додатки довші через необхідність конструкторів та довгих методів отримання та встановлення. Ці ранні процедурні мови, такі як C, не мали підтримки мета-програмування, жодної системи поліморфізму, закриття або простого синтаксису для представлення даних JSON / загальних даних. C навіть не підтримував необов'язкові аргументи. Монади та макроси можна використовувати для створення потужних вбудованих мов, специфічних для домену.
aoeu256

Функції з 8 аргументами - коли-небудь чули про аргументи за замовчуванням? А як щодо процедурної + першокласної підтримки HashTables + закриття, таких як JavaScript, Python тощо ...? Вони мають багато переваг ООП без такої кількості коду.
aoeu256

4

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


4

Перш за все, зауважте, що багато мов програмування, які зараз використовуються (особливо "мови вищого рівня"), мають багатопарадигму . Це означає, що ви ніколи не будуєте програм, які мають виключно ООП (за винятком того, якщо ви використовуєте Smalltalk або Eiffel для побудови своїх великих проектів).

Погляньте на PHP, наприклад:

  • Має багато елементів ООП (починаючи з версії 5)
  • Раніше був переважно процедурним
  • Має елементи декларативного програмування (наприклад, функції масиву)
  • Реалізовано багато елементів функціонального програмування (починаючи з версії 5.4)

В основному PHP склеює багато різних парадигм (і сам є "клейовою мовою").

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

Перегляньте список мов програмування за типами у Вікіпедії: https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages (не на 100% точний).

Функціональне програмування (підмножина деклеративного програмування)

  • Уідлі використовував на практиці (він став частиною склеєних мов, таких як PHP , також Java та багато інших реалізували концепції функціонального програмування)
  • Багато ідей бере свій початок у LISP, який, безумовно, варто переглянути
  • Ви можете створювати цілі програми, наприклад, за допомогою Haskell, тому він може "замінити" ООП

Процедурне програмування

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

Логічне програмування

  • Найвидатніший приклад - Пролог. Це використовується для конкретних завдань, які отримують користь від логічних логічних запитів на основі правил
  • Не може "замінити" ООП з точки зору побудови великого проекту, але може замінити його іншими термінами

Декларативні / доменні мови в цілому

  • Використання SQL у своїх проектах? Тоді вони не є суто ООП, SQL по суті є декларативним.
  • Багато доменних мов (наприклад, CSS) є декларативними

Загальне програмування загалом

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

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


1

FP - Функціональне програмування - надзвичайно популярна парадигма програмування, яка існує вже дуже давно і в останні роки стала все більш помітною. ФП надає перевагу незмінності порівняно з мінливістю, рекурсією та функціями без побічних ефектів. Деякі приклади популярних мов fp - Erlang, Scala, F #, Haskell та Lisp (серед інших).


-6

В даний час не існує парадигм, які могли б справді замінити ООП. Проблема з (перевагами) ООП полягає в тому, що він робить для вас величезну роботу - автоматично випускає ресурси, перевіряє дані тощо, і полегшує перевірку коду, не кажучи вже про те, що переважна більшість існуючих у світі бібліотек написані мовою ООП, такою як C ++, C # або Java. Реальність ужиття без таких масштабних бібліотек і таких надзвичайно сумнівна.

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

Я думаю, що загальне програмування з’явиться як нова парадигма. Однак, це все ще на стадії розробки, і лише C ++ / D пропонують справді гарне загальне програмування.


3
ООП не робить жодної з цих речей. Це може полегшити їх, але лише в тому випадку, якщо дизайн середовища OO включає їх, наприклад, у .Net, або якщо ви готові їх написати.
Matt Ellen

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

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