Was genau ist prozedurale Programmierung? Wie genau unterscheidet es sich von OOP? Ist es dasselbe wie funktionale Programmierung?

32

Ich programmiere in Java in einem sehr objektorientierten (OO) Stil. OOP kommt sehr intuitiv zu mir, aber ich habe sehr wenig Wissen über andere Arten der Programmierung.

Was genau ist prozedurale Programmierung ? Wie genau unterscheidet es sich von OOP? Ist es dasselbe wie funktionale Programmierung ?

Früher dachte ich, dass jede Programmierung, die nicht OO ist, prozedural ist. Aber ich fange an zu glauben, dass das nicht stimmt.

Aviv Cohn
quelle
9
Das Teilen Ihrer Forschung hilft allen. Sagen Sie uns, was Sie versucht haben und warum es nicht Ihren Bedürfnissen entsprach. Dies zeigt, dass Sie sich die Zeit genommen haben, um sich selbst zu helfen, es erspart uns, offensichtliche Antworten zu wiederholen, und vor allem hilft es Ihnen, eine spezifischere und relevantere Antwort zu erhalten. Siehe auch Wie man fragt
Mücke
2
Prozedurale Programmierung ist nicht dasselbe wie funktionale Programmierung. Eigentlich ist es dasselbe wie bei der objektorientierten Programmierung, abzüglich der Objekte und Klassen.
Mason Wheeler
1
Imperative OOP tatsächlich ist prozeduralen Programmierung, so dass es genau das , was man die ganze Zeit tun ...
Ingo

Antworten:

68

Wikipedia hat gute Erklärungen für diese Begriffe. Unabhängig davon ist hier die Zusammenfassung:


  • Deklarative Programmierung ist das Gegenteil von imperativer Programmierung. Sie gibt an, was und nicht wie berechnet werden soll (z. B. SQL, reguläre Ausdrücke).

  • Funktionale Programmierung modelliert die Berechnung als Ausdrücke , die Werte ergeben (können). Funktionen sind Werte und können an andere Funktionen übergeben oder von diesen zurückgegeben werden. Mutationen werden nicht empfohlen. Alle Variablen sind standardmäßig unveränderlich. Infolgedessen ist es eher deklarativ als imperativ, da es den Schwerpunkt auf die zu berechnenden Elemente legt und nicht auf die dafür erforderliche Abfolge von Zustandsänderungen.

  • Rein funktionale Programmierung verbietet Mutationen insgesamt (obwohl entgegen der landläufigen Meinung immer noch Mechanismen zur Erzielung von Nebenwirkungen existieren).
  • Die vollständige funktionale Programmierung verbietet außerdem Ausnahmen und Endlosschleifen. (Eine Gesamtfunktion in der Mathematik ist eine Funktion, die für alle Eingabeneinen Wert zurückgibt.)

Ihre Beziehungen sind etwas kompliziert, da OOP ein ziemlich geladener Begriff ist. Sie können Objekte sowohl in funktionalen Sprachen als auch in prozeduralen Sprachen verwenden, aber die Sprachen, die als OO angezeigt werden, sind prozedurale Sprachen. Um das Problem weiter zu verwechseln:

  • Die meisten Menschen kennen den Unterschied zwischen einem Objekt und einem abstrakten Datentyp nicht
  • In den OOP-Hauptsprachen werden ADTs nicht erwähnt, sie werden nur sehr schlecht unterstützt und Objekte werden als der einzig wahre Weg angepriesen.
  • Niemand sagt " Abstract Data Type-Oriented Programming" (weil es dumm wäre, das zu tun; Sie brauchen sowohl ADTs als auch Objekte.)

Dies veranlasst die Leute zu der Annahme, dass OOP der einzige Weg ist, um eine Abstraktion zu erreichen, und dass funktionale Programmierung und OOP irgendwie gegensätzlich sind oder sich gegenseitig ausschließen. Viele Leute denken auch, dass alle funktionalen Sprachen reine und unzulässige Mutationen sind.

Darüber hinaus werden Imperative / Prozeduren im Allgemeinen austauschbar herumgeworfen, manchmal im Gegensatz zu OOP (was abstraktionslosen Code impliziert, im Allgemeinen C) und manchmal im Gegensatz zu funktionaler Programmierung. Der Begriff strukturierte Programmierung ist, soweit ich das beurteilen kann, größtenteils nicht mehr gebräuchlich (wahrscheinlich, weil zu diesem Zeitpunkt die meisten Leute davon ausgehen, dass goto und globals als schädlich eingestuft werden).

Doval
quelle
3
"verbietet Sprünge" ist eher generisch; das beinhaltet if / while / etc .. vielleicht "willkürliche Sprünge verbieten"?
Izkata
@ Izkata Guter Punkt, geändert.
Doval
1
Könnte es wert sein, tatsächlich auf die Wikipedia-Einträge zu verlinken.
Haylem
Und deshalb heißt es "Objektorientiert" und nicht "Nur Objekt".
JeffO
1
@OrangeDog Wie unterscheidet sich das von einem abstrakten Datentyp, der auch einen gekapselten Satz von Daten und Funktionen definiert, die darauf einwirken können? Darüber hinaus können Sie unveränderliche Objekte haben. In diesem Fall also welchen Zustand ?
Doval
12

Die prozedurale Programmierung ist ein Programmieransatz, der einer der Grundbausteine ​​für viele andere Sprachentwürfe ist (funktional ist keiner).

Die meisten Sprachen fallen in die Gruppe der "prozeduralen Programmierung" und es ist wahrscheinlich der natürlichste Entwurfsansatz für die meisten Menschen (wenn Sie in Bezug auf OO denken, dann würde ich sagen, dass Sie in einer Minderheit sind).

BASIC ist prozedural.

Wie andere bereits gesagt haben, handelt es sich um einen Mechanismus zur sequentiellen Strukturierung von Programmen.

  • Zuerst mache ich x
  • Zweitens mache ich y
  • Drittens mache ich Z

Es ist ein Mechanismus zum Definieren von "Prozeduren" erforderlich - Blöcke mit benanntem Code, die OO-Methoden ähneln, die Null bis viele Parameter akzeptieren und optional einen Wert zurückgeben (der dann im Allgemeinen als Funktion bezeichnet wird - was möglicherweise zu einer Verwechslung mit funktionalen Sprachen führt )

Das Paradigma gibt nicht vor, was Sie tun oder wie die Dinge herumgereicht werden.

Es wird lediglich beschrieben, dass das Programm als eine Reihe von Prozeduren (oder Funktionen) strukturiert ist, die nacheinander ablaufen. Die Daten werden dann unabhängig von den Prozeduren definiert.

Dies unterscheidet sich von der objektorientierten Programmierung, bei der das Programm anhand von Datensammlungen und Methoden (nicht Funktionen) strukturiert wird, die auf diese Daten einwirken.

Eine Möglichkeit, darüber nachzudenken, ist der Umfang der Daten.

In einer prozeduralen Sprache ist das Scoping ziemlich einfach. Eine Variable kann sich im Gültigkeitsbereich einer bestimmten Prozedur (lokal deklariert) befinden, bis zu der Ebene, in der das Zeug als erstes aufgerufen wird (global deklariert), wobei verschachtelte Gültigkeitsbereiche dazwischen liegen.

In einer objektorientierten Sprache fügen Sie einen neuen Gültigkeitsbereichskontext hinzu, nämlich den des aktuell verwendeten Objekts, der zu dem obigen orthogonal ist.

Eine andere Möglichkeit, prozedural im Vergleich zu objektorientiert zu denken, besteht darin, eine objektorientierte Sprache zu betrachten, in der alle Methoden als statisch deklariert werden müssen . Das Ergebnis ist eine prozedurale Sprache, in der mithilfe von Klassen Prozeduren zusammengefasst werden können.

Rob Baillie
quelle
5

Prozedurale Programmierung ist definitiv keine funktionale Programmierung.

Prozedurale Programmierung ist, wenn Sie ein Modell des Computers als Maschine im Kopf haben und darüber nachdenken, wie Daten im Speicher geändert werden. Sie setzen also zuerst Aden Wert 3, addieren dann 1 und speichern diesen erneut im Speicher A(überschreiben den vorherigen Wert).

Funktionale Programmierung würde sagen, Aist 3 und Bist A + 1und lässt dann den Computer herausfinden, wie er berechnet B. Sobald Sie es definiert Ahaben, sollte es unveränderlich sein (unverändert). Mit Functional können Sie beispielsweise eine Funktion als erstklassigen Wert übergeben (eine Funktion kann eine Funktion als Argument annehmen).

Objektorientierte Programmierung kombiniert oft beides und ist zu beiden orthogonal. Sie können die funktionale Programmierung verwenden und ein unveränderliches Objekt zurückgeben, und dieses Objekt kann eine Methode haben, die einen berechneten Wert zurückgibt, und dies sogar schleppend - das ist die funktionale objektorientierte Programmierung. Sie können auch ein Objekt haben, das ein "Repository" (abstrakte Version einer Datenbank) darstellt, und Sie können Sachen im Repository "speichern" und Sachen wieder "abrufen" und das Objekt alle Details dazu verarbeiten lassen . Das ist im Grunde objektorientierte prozedurale Programmierung.

Scott Whitlock
quelle
0

OOP ist nichts anderes als eine etwas verfeinerte Form der prozeduralen Programmierung, die wiederum zur größeren Familie der imperativen Programmierung gehört. Ein Beweis für diese Behauptung ist, dass viele C # / Java-Programmierer dazu neigen, "etwas zu tun" und Methoden wie die folgenden bevorzugen:

void doThisAndThat(....) { ... do something ... }

Also, ein Programm, das aus einer Reihe von Void-Methoden (früher bekannt als Procedures (sic!)) Und Code besteht, wie:

doThis();
if (state is that) doSomethingElse();
doThat();

ist perfekte prozedurale Programmierung.

Ingo
quelle
doThisAndThat (....) impliziert, dass eine Methode mehr als eine Sache tut, die im Allgemeinen keine gute Praxis ist. Java- und C # -Entwickler halten sich größtenteils an das Single-Responsibility-Prinzip. Ich denke, deine Analogie ist fehlerhaft. objectmentor.com/resources/articles/srp.pdf
JohnK
@ JohnK Ich weiß, dass es keine gute Praxis ist. Noch eine gemeinsame. Vor allem unter Java-Entwicklern, wenn man beurteilen kann, was man jeden Tag auf SO sieht.
Ingo
@JohnK Java- und C # -Entwickler halten sich größtenteils an das Prinzip der einmaligen Verantwortung - Lippenbekenntnis?
Ingo
Java-Entwickler halten sich meistens an die Single Responsibility? Wenn das nur im wirklichen Leben wahr wäre ...
Sridhar Sarnobat