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 ist für mich sehr intuitiv, aber ich habe nur 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 „t OO“ ist, prozedural ist. Aber ich “ Ich fange an zu denken, dass dies nicht wahr ist.

Kommentare

  • Das Teilen Ihrer Forschung hilft allen. Sagen Sie uns, was Sie ‚ habe es versucht und warum es nicht Ihren Anforderungen 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, mehr zu bekommen spezifische und relevante Antwort. Siehe auch Fragen
  • Prozedurale Programmierung ist nicht dasselbe wie funktionale Programmierung; sie ‚ ist eigentlich im Wesentlichen dasselbe wie objektorientierte Programmierung, abzüglich der Objekte und Klassen.
  • Imperative OOP ist eigentlich prozedurale Programmierung, also genau Was Sie ‚ die ganze Zeit tun …

Antwort

Wikipedia hat gute Erklärungen für diese Begriffe. Unabhängig davon ist hier 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).

  • Funktionsprogramm ming modelliert die Berechnung als Ausdrücke , die (möglicherweise) Werte ergeben. 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 Mutationen insgesamt (obwohl sie entgegen der landläufigen Meinung immer noch Mechanismen zur Erreichung der Seite haben Effekte).
  • Gesamtfunktionsprogrammierung verbietet zusätzlich Ausnahmen und Endlosschleifen. (Eine Gesamtfunktion in der Mathematik ist eine Funktion, die einen Wert für alle ihrer Eingaben zurückgibt.)

Ihre Beziehungen sind etwas kompliziert, weil OOP ist ein ziemlich geladener Begriff. 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 Leute 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 Abstrakte datentyporientierte Programmierung (weil es eine dumme Sache wäre; Sie benötigen sowohl ADTs als auch Objekte.)

Dies lässt die Leute denken, dass OOP der einzige Weg ist, um Abstraktion zu erreichen, und das funktionale Programmierung und OOP sind irgendwie gegensätzlich oder schließen sich gegenseitig aus. Viele Leute denken auch, dass alle funktionalen Sprachen rein sind und Mutationen nicht zulassen.

Außerdem werfen die Leute Imperativ / Prozedur im Allgemeinen austauschbar herum, manchmal im Gegensatz zu OOP (impliziert abstraktionslosen Code, im Allgemeinen C) und manchmal Kontrast zur funktionalen Programmierung.Der Begriff strukturierte Programmierung ist meines Erachtens 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.)

Kommentare

  • “ verbietet Sprünge “ ist eher allgemein gehalten; Dazu gehört, wenn / while / etc .. vielleicht “ willkürliche Sprünge verbietet „?
  • @Izkata Guter Punkt, geändert.
  • Könnte es wert sein, tatsächlich auf die Wikipedia-Einträge zu verlinken.
  • Und das ‚ ist der Grund, warum es heißt Objekt “ orientiert “ und nicht nur Objekt.
  • @OrangeDog Wie ist das? etwas anderes als ein abstrakter 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 welcher Status ?

Antwort

Prozedurale Programmierung ist ein Programmieransatz, der eine der Grundbausteine für viele andere Sprachentwürfe darstellt (funktionale nicht eine).

Die meisten Sprachen fallen unter „Prozedurale Programmierung“. und es ist wahrscheinlich der natürlichste Designansatz 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 gesagt haben, handelt es sich um einen Mechanismus zum sequentiellen Strukturieren 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 OO-Methoden, die Null bis viele Parameter akzeptieren und optional einen Wert zurückgeben können (der würde dann im Allgemeinen als Funktion bezeichnet werden – was wahrscheinlich zu Ihrer Verwechslung mit funktionalen Sprachen führt)

Der Absatz digm bestimmt nicht, was Sie tun oder wie die Dinge weitergegeben werden.

Es beschreibt lediglich, dass das Programm als eine Reihe von Prozeduren (oder Funktionen) strukturiert wird, in denen gearbeitet wird eine sequentielle Weise. 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 (lokal deklariert) befinden, bis zur Ebene der obersten Aufrufe (global deklariert), mit verschachtelten Bereichen zwischen.

In einer objektorientierten Sprache, die Sie verwenden Fügen Sie einen neuen Kontext 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 Dabei müssen alle Methoden als statisch deklariert werden. Das Ergebnis ist eine prozedurale Sprache, in der Klassen zum Gruppieren von Prozeduren verwendet werden können.

Antwort

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 es funktioniert „s Ändern von Daten im Speicher. Zuerst setzen Sie A auf den Wert 3, fügen dann 1 hinzu und speichern diese im Speicher A erneut (überschreiben des vorherigen Werts).

Funktionale Programmierung würde bedeuten, dass A 3 ist und B A + 1 und lassen Sie den Computer dann herausfinden, wie B berechnet wird. Sobald Sie A definiert haben, sollte unveränderlich sein (sich nicht ändern). Mit Functional können Sie auch Dinge wie die erste Weitergabe einer Funktion ausführen. Klassenwert (eine Funktion kann eine Funktion als Argument annehmen).

Objektorientierte Programmierung kombiniert häufig beide und ist zu beiden orthogonal. Sie können funktionale Programmierung verwenden und ein unveränderliches Objekt zurückgeben, und das 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“ (abstrakte Version einer Datenbank) darstellt, und Sie können Dinge im Repository „speichern“ und wieder „herausholen“ und dieses Objekt alle Details darüber verarbeiten lassen, wie “ Das ist im Grunde genommen eine objektorientierte prozedurale Programmierung.

Antwort

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 ... } 

Also ein Programm, das aus einer Menge besteht von void-Methoden (früher bekannt als procedure (sic!)) und Code wie:

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

ist die perfekte prozedurale Programmierung.

Kommentare

  • doThisAndThat (….) impliziert, dass eine Methode mehr als eine Sache ausführt, was im Allgemeinen keine gute Praxis ist. Java- und C # -Entwickler halten sich hauptsächlich an das Prinzip der Einzelverantwortung. Ich denke, Ihre Analogie ist fehlerhaft. objectmentor.com/resources/articles/srp.pdf
  • @JohnK Ich weiß, dass dies keine gute Praxis ist. Noch eine gemeinsame. Besonders unter Java-Entwicklern, wenn man nach dem beurteilen kann, was man jeden Tag auf SO sieht.
  • @JohnK Java- und C # -Entwickler halten sich meistens an das Prinzip der Einzelverantwortung – Lippenbekenntnis?
  • Java-Entwickler halten sich meistens an die Einzelverantwortung? Wenn das nur im wirklichen Leben wahr wäre …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.