Alternativen zur objektorientierten Programmierung?

82

OOP ist wahrscheinlich das am häufigsten verwendete Programmierparadigma im heutigen Software-Design. Meine Frage ist - welche anderen Paradigmen können damit konkurrieren und an die Stelle von OOP treten ? Um diese Frage zu klären, frage ich nicht nach anderen Paradigmen. Es gibt viele von ihnen, aber ich würde gerne wissen, welche ...

  • Wurde in der Praxis nicht nur in der Theorie eingesetzt.
  • Kann mit OOP konkurrieren , kann also in einem großen Projekt mit einem Minimum an Schmerzen verwendet werden.
  • Kann verwendet werden, um eine Desktop-App mit Geschäftslogik, Datenbanken usw. zu entwickeln.
  • Wird nicht neben OOP verwendet, sondern als Ersatz für OOP.

Und wenn es welche gibt, was sind die Vor- und Nachteile, warum ist es besser / schlechter als OOP, welche Sprachen sind am besten zu verwenden, was ist mit der Verwendung in populären Sprachen, hat es irgendwelche Entwurfsmuster und kann es OOP komplett ersetzen?

Dariusz Woźniak
quelle
1
@ Justin Ardini: Ich weiß, dass es viele gibt, aber mit welchem ​​kann man mithalten? @ Tobiasopdenbrouw & Makros: Ok, geändert.
Dariusz Woźniak
OOP ist beliebt, weil es beliebt ist. Wenn Sie den OOP-Koolaid nicht schlucken, haben Sie keine Projekte, an denen Sie arbeiten können ...
aoeu256
Die datenorientierte Programmierung ist einfacher, wenn Sie sich eher um Objektsammlungen und ihre Beziehungen als um einzelne Objekte kümmern, wenn die "db object" -Methoden die Kapselung bereitstellen. JSON und Sexpressions versüßen SQL, CSS, HTML, Excel, Shell-Skripte sind beliebt und nützlich, aber "Programmieren" bedeutet OOP oder prozedural. OOP wird für die Wartung von Python / JavaScript-Programmen gedankt, obwohl OOP 20% des Codes ausmacht. Closures & JSON können 90% der Zeit anstelle von Objekten verwendet werden und sind einfacher und benutzerfreundlicher.
aoeu256

Antworten:

51

Funktionale Programmierung ist ein weiteres Programmierparadigma, das vor allem bei Akademikern beliebt ist. Das beste Beispiel für eine funktionale Programmiersprache ist Haskell und Standard ML .

Der grundlegende Unterschied zwischen funktionaler Programmierung und objektorientierter Programmierung besteht darin, dass Sie im Sinne des Datenflusses anstelle des Steuerflusses programmieren . Eine gute Einführung finden Sie in der Präsentation Taming Effects with Functional Programming von Simon Peyton-Jones .

Ein gutes Beispiel für die in der Industrie verwendete funktionale Programmierung ist Erlang . Es wird hauptsächlich in Telekommunikations-, verteilten und fehlertoleranten Systemen verwendet. Siehe die Präsentation Erlang - Software für eine gleichzeitige Welt von Joe Armstrong .

Es gibt auch neuere funktionale Programmiersprachen, die funktionale Programmierung mit OOP kombinieren. Zwei gute Beispiele sind F # für die .NET-Plattform und Scala für die Java-Plattform. Sie können häufig vorhandene Bibliotheken auf der Plattform verwenden, die in anderen Sprachen geschrieben sind.

Der Trend zu neuen Programmiersprachen ist jetzt das Multi-Paradigma , bei dem mehrere Paradigmen wie objektorientierte Programmierung und funktionale Programmierung in derselben Sprache kombiniert werden.

Jonas
quelle
4
Scala zielt darauf ab, Merkmale objektorientierter und funktionaler Sprachen zu integrieren.
Philipp
5
Gute Antwort, aber ich denke, dass funktionale Programmierung und objektorientierte Programmierung nicht zwei Seiten einer Medaille sind, sondern perfekt koexistieren können (wie Sie erwähnt haben). Es ist eher so: Prozedural VS Objektorientiert, Imperativ VS Funktional. Lisp ist eine beliebte prozedurale Funktionssprache, Java ist eine objektorientierte imperative Sprache.
fhd
1
@ ventr1s: Ja, funktionale Programmierung kann OOP ersetzen, wird jedoch höchstwahrscheinlich zusammen mit OOP in Sprachen wie Scala und F # verwendet.
Jonas
1
@ ventr1s: Ein gutes Beispiel für funktionale Programmierung in der Branche ist die in Erlang geschriebene verteilte NoSQL-Datenbank RIAK. riak.basho.com
Jonas
2
@ ventr1s: Siehe diese Frage über funktionale Programmierung und Entwurfsmuster: stackoverflow.com/questions/327955/…
Jonas
12

Die prozedurale Verarbeitung war alles, bevor OOP auftauchte, und hat einige große reale Anwendungen (tatsächlich die meisten ursprünglich) und viele Betriebssysteme hervorgebracht.

Es kann sicherlich in großen Produkten mit einem Minimum an Schmerzen und einem Maximum an Leistung verwendet werden

Woody
quelle
4
Ja, und unzählige Metrikstudien haben gezeigt, dass bei etwa 150.000 LOC kein Gas mehr vorhanden ist. Schauen Sie sich das Windows SDK um Petzold an, um eine Abhandlung darüber zu erhalten, wie sich die strukturierte Programmierung unter Komplexitätslasten auflöst: Funktionen mit 8 Argumenten, 2 Strukturen mit 6-10 Mitgliedern. Das Ein- und Ausschieben von Daten in jede Recheneinheit funktioniert schließlich einfach nicht.
Rob
1
OK, aber - wie viele Anwendungen werden so groß? Das Problem mit OOP ist, dass es äußerst kompliziert zu verstehen ist und für große Anwendungen entwickelt wurde - aber auch für kleine Anwendungen die Standardeinstellung ist. Dies hat den gegenteiligen Effekt, dass die kleinere App nicht unbedingt zu kompliziert wird.
Niico
Objektorientierte Programmierung führt manchmal dazu, dass Anwendungen länger sind, da Konstruktoren und lange Getter / Setter-Methoden erforderlich sind. Diese frühen prozeduralen Sprachen wie C hatten keine Unterstützung für die Meta-Programmierung, kein System für Polymorphismus, Abschlüsse oder einfache Syntax für die Darstellung von JSON / allgemeinen Daten. C unterstützte nicht einmal optionale Argumente. Monaden und Makros können verwendet werden, um leistungsstarke eingebettete domänenspezifische Sprachen zu erstellen.
aoeu256
Funktionen mit 8 Argumenten - schon mal von Standardargumenten gehört? Was ist mit prozeduraler + erstklassiger Unterstützung für HashTables + Closures wie JavaScript, Python usw.? Sie haben viele der Vorteile von OOP ohne so viel Code.
aoeu256
4

Die vektorrelationale Datenmodellierung wird verwendet, um ausführbare Informationsmodelle mit domänenrelevanter Semantik innerhalb der Global Information Network Architecture, einem netzwerkresidenten Modellbroker, zu erstellen.

Disrup Tional
quelle
4

Bitte beachten Sie zunächst, dass viele der derzeit verwendeten Programmiersprachen (insbesondere "höhere Sprachen") Multi-Paradigmen sind . Das bedeutet, dass Sie niemals Programme erstellen, die nur OOP sind (außer wenn Sie Smalltalk oder Eiffel verwenden, um Ihre großen Projekte zu erstellen).

Schauen Sie sich zum Beispiel PHP an:

  • Hat viele Elemente von OOP (seit Version 5)
  • War vorher meistens prozedural
  • Hat Elemente der deklarativen Programmierung (zB die Array-Funktionen)
  • Implementierung vieler Elemente der funktionalen Programmierung (seit Version 5.4)

Grundsätzlich klebt PHP viele verschiedene Paradigmen zusammen (und ist selbst eine "Klebesprache").

Auch Java implementiert viele Konzepte, die nicht aus dem objektorientierten Paradigma stammen (z. B. aus der funktionalen Programmierung).

Schauen Sie sich die Liste der Programmiersprachen nach Typ in Wikipedia an: https://en.wikipedia.org/wiki/List_of_programming_languages_by_type#Imperative_languages (nicht 100% genau).

Funktionale Programmierung (Teilmenge der deklerativen Programmierung)

  • Wideley in der Praxis verwendet (es wurde Teil von geklebten Sprachen wie PHP , auch Java und viele andere haben Konzepte der funktionalen Programmierung implementiert)
  • Viele Ideen stammen aus LISP, was definitiv einen Blick wert ist
  • Sie können ganze Anwendungen erstellen, z. B. mit Haskell, daher kann es OOP "ersetzen"

Verfahrensprogrammierung

  • C (als meist prozedurale Sprache) ist immer noch eine der am häufigsten verwendeten Sprachen
  • Viele moderne Leimsprachen waren am Anfang prozedural
  • Trotzdem sind viele Programme meistens prozedural (wenn Sie möchten, können Sie OOP "ersetzen").

Logische Programmierung

  • Das bekannteste Beispiel ist Prolog. Dies wird für bestimmte Aufgaben verwendet, die von regelbasierten logischen Abfragen profitieren
  • Kann OOP beim Erstellen eines großen Projekts nicht "ersetzen", kann es aber auch bei anderen Begriffen ersetzen

Deklarative / domänenspezifische Sprachen im Allgemeinen

  • Verwenden Sie SQL in Ihren Projekten? Dann sind sie nicht rein OOP, SQL ist im Wesentlichen deklarativ.
  • Viele domänenspezifische Sprachen (wie CSS) sind deklarativ

Imperative Programmierung im Allgemeinen

Diese Liste ist nicht vollständig, sie soll nur eine Idee geben. Beachten Sie nur, dass Sie beim Schreiben einer großen Anwendung normalerweise viele verschiedene Paradigmen verwenden und sogar jede Sprache, die Sie verwenden, mehrere Paradigmen implementiert.

OOP wird normalerweise als gute Wahl für die Strukturierung großer, komplexer Beziehungen bei der Modellierung von Daten angesehen. Es ist nicht immer das Paradigma für viele andere Aufgaben.

Blackbam
quelle
1

FP - Functional Programming ist ein äußerst beliebtes Programmierparadigma, das es schon sehr lange gibt und in den letzten Jahren immer mehr an Bedeutung gewonnen hat. FP bevorzugt Unveränderlichkeit gegenüber Veränderlichkeit, Rekursion und Funktionen ohne Nebenwirkungen. Einige Beispiele für beliebte fp-Sprachen sind Erlang, Scala, F #, Haskell und Lisp (unter anderem).

Matthew J Morrison
quelle
-5

Derzeit gibt es keine Paradigmen, die OOP wirklich ersetzen könnten. Das Problem mit (Vorteil von) OOP ist, dass es eine Menge Arbeit für Sie erledigt - Ressourcen automatisch freigeben, Daten validieren usw. und es einfach macht, Code zu validieren - ganz zu schweigen davon, dass die überwiegende Mehrheit der weltweit vorhandenen Bibliotheken sind in einer OOP-Sprache wie C ++, C # oder Java geschrieben. Die Realität, ohne solche großen Bibliotheken auszukommen, ist äußerst zweifelhaft.

In Nischen- oder akademischen Welten finden Sie viel funktionale Programmierung. Wenn Sie jedoch wirklich ein großes Projekt durchführen möchten, ist OOP der einzige Weg.

Ich denke, dass generische Programmierung als neues Paradigma auftauchen wird. Es befindet sich jedoch noch in der Entwicklungsphase und nur C ++ / D bietet eine wirklich gute generische Programmierung.

Hündchen
quelle
3
OOP macht keines dieser Dinge. Dies kann sie einfacher machen, aber nur, wenn das Design des OO-Frameworks sie enthält, wie in .Net, oder wenn Sie bereit sind, sie zu schreiben.
Matt Ellen
Technisch gesehen hast du recht. Die Realität ist jedoch, dass alle gängigen OO-Sprachen das Ressourcenmanagement als Merkmal der Objektorientierung enthalten. Es wird Ihnen schwer fallen, eine direkt objektunterstützende Sprache zu finden, die diese Sprache nicht enthält. Und das OP interessiert sich eindeutig für die Praxis, nicht für die Theorie.
Welpe
3
Ressourcenverwaltung ist kein Merkmal der Objektorientierung - Ressourcenmanagement ist ein Merkmal zwingender Programmiersprachen, die objektorientiert sein können oder nicht. Ich kenne keine rein funktionalen Sprachen, die Sie dazu zwingen, Systemressourcen explizit zu verwalten.
Matthew J Morrison