it-swarm.com.de

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

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 denken, dass dies nicht wahr ist.

32
Aviv Cohn

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


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

  • Funktionale Programmierung modelliert die Berechnung als Ausdrücke das (kann) ergeben Werte. Funktionen sind Werte und können an andere Funktionen übergeben oder von diesen zurückgegeben werden. Von Mutationen wird abgeraten; Alle Variablen sind standardmäßig unveränderlich. Infolgedessen ist es eher deklarativ als zwingend, da es eher betont, was berechnet wird, als die Reihenfolge der Zustandsänderungen, die erforderlich sind, um dies zu erreichen.

  • Rein funktionale Programmierung verbietet Mutation insgesamt (obwohl entgegen der landläufigen Meinung immer noch Mechanismen zur Erzielung von Nebenwirkungen vorhanden sind) .
  • Die gesamte funktionale Programmierung verbietet zusätzlich Ausnahmen und Endlosschleifen. (Eine Gesamtfunktion in der Mathematik ist eine Funktion, die einen Wert für all ihrer Eingaben zurückgibt.)

Ihre Beziehungen sind etwas kompliziert, weil OOP ein ziemlich geladener Begriff ist. Sie können Objekte sowohl in funktionalen als auch in prozeduralen Sprachen verwenden, aber die Sprachen, die sich als OO bewerben, sind prozedural. Um das Problem weiter zu verwirren:

  • Die meisten Menschen kennen den Unterschied zwischen einem Objekt und einem abstrakten Datentyp nicht
  • In den gängigen OOP Sprachen 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 eine dumme Sache wäre, dies zu tun; Sie benötigen sowohl ADTs als auch Objekte.)

Dies führt dazu, dass die Leute denken, OOP sei der einzige Weg, 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 rein sind und Mutationen nicht zulassen.

Darüber hinaus werfen die Leute Imperativ/Prozedur im Allgemeinen austauschbar herum, wobei sie es manchmal mit OOP kontrastieren (was abstraktionslosen Code impliziert, im Allgemeinen C) und manchmal mit funktionaler Programmierung kontrastieren. Der Begriff strukturierte Programmierung ist, soweit ich das beurteilen kann, größtenteils nicht mehr gebräuchlich (wahrscheinlich, weil die meisten Leute zu diesem Zeitpunkt davon ausgehen, dass goto und globals als schädlich angesehen werden.)

69
Doval

Die prozedurale Programmierung ist ein Programmieransatz, der eine der Grundbausteine ​​für viele andere Sprachentwürfe darstellt (funktional nicht eins).

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

BASIC ist prozedural.

Wie andere 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 erfordert einen Mechanismus zum Definieren von "Prozeduren" - Blöcken mit benanntem Code ähnlich wie OO Methoden, die Null bis viele Parameter akzeptieren und optional einen Wert zurückgeben können (der dann im Allgemeinen als Funktion bezeichnet wird) - wahrscheinlich zu Ihrer Verwechslung mit funktionalen Sprachen führen)

Das Paradigma bestimmt nicht, was die Dinge sind, die Sie tun, oder wie die Dinge herumgereicht werden.

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

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

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

In einer prozeduralen Sprache ist das Scoping ziemlich einfach. Eine Variable kann sich im Bereich einer bestimmten Prozedur befinden (lokal deklariert), bis zur Ebene der obersten Aufrufe (global deklariert), mit verschachtelten Bereichen dazwischen.

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

Eine andere Möglichkeit, prozedural im Vergleich zu objektorientiert zu denken, besteht darin, eine objektorientierte Sprache zu betrachten, in der alle Methoden muss als statisch deklariert werden. Das Ergebnis ist eine prozedurale Sprache, in der Klassen verwendet werden können, um Prozeduren zu gruppieren.

12
Rob Baillie

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. Zuerst setzen Sie A auf den Wert 3, dann fügen Sie 1 hinzu und speichern diese erneut im Speicherort A (wobei der vorherige Wert überschrieben wird).

Funktionale Programmierung würde sagen, A ist 3 und B ist A + 1 und dann den Computer herausfinden lassen, wie B berechnet wird. Sobald Sie A definiert haben, sollte es unveränderlich sein (unverändert). Mit Functional können Sie beispielsweise eine Funktion als erstklassigen Wert weitergeben (eine Funktion kann eine Funktion als Argument verwenden).

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 träge tun - das ist funktionale objektorientierte Programmierung. Sie können auch ein Objekt haben, das ein "Repository" darstellt (abstrakte Version einer Datenbank), und Sie können Dinge im Repository "speichern" und wieder "herausholen" und dieses Objekt alle Details der Vorgehensweise verarbeiten lassen . Das ist im Grunde objektorientierte prozedurale Programmierung.

5
Scott Whitlock

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

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

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

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

ist perfekte prozedurale Programmierung.

0
Ingo