832 Stimmen

Was ist der Unterschied zwischen dem deklarativen und dem imperativen Paradigma in der Programmierung?

Ich habe im Internet nach einer Definition für folgende Begriffe gesucht deklarativ et Imperativ Programmierung, die mir etwas Licht ins Dunkel bringen würde. Allerdings ist die Sprache, die bei einigen der Ressourcen, die ich gefunden habe, verwendet wird, entmutigend - zum Beispiel bei Wikipedia . Hat jemand ein Beispiel aus der Praxis, das er mir zeigen könnte und das dieses Thema aus einer anderen Perspektive beleuchten könnte (vielleicht in C#)?

76 Stimmen

Imperativ geht in ein Restaurant und bestellt ein Steak (blutig gebraten), Pommes frites (mit Ketchup), einen Beilagensalat (mit Ranch) und eine Cola (ohne Eis). Der Kellner liefert ihm genau das, was er bestellt hat, und berechnet ihm 14,50 Dollar. Auf der anderen Seite, Deklarativ geht in ein Restaurant und sagt dem Kellner, dass er nur etwa 12 Dollar für das Abendessen bezahlen möchte und Lust auf Steak hat. Der Kellner kommt mit einem Steak (medium gegart), Kartoffelpüree, gedünstetem Brokkoli, einem Brötchen und einem Glas Wasser zurück. Ihm werden 11,99 Dollar berechnet.

3 Stimmen

Ein weiteres gutes Beispiel, das ich gefunden habe, ist vielleicht, wie Sie Docker-Dateien und Befehle tun... z.B. ein imperativer Ansatz ist, dass Sie alle Ihre Schritte nacheinander in der Befehlszeile definieren, z.B. erstellen Sie einen Container in aws, erstellen Sie ein Netzwerk und dann setzen Sie Ihre Ressourcen irgendwie zusammen... der DECLARATIVE Ansatz wäre dann: Sie DECLARE eine Dockerdatei (oder docker-compose.yaml), wo Sie im Wesentlichen alle Ihre Befehle (oder Sie nur benennen, was Sie wollen, dass es zu tun) innerhalb einer Datei, und dann einfach diese Datei ausführen. Seine deklariert alle auf einmal vorher, so sollte es immer ähnlich verhalten.

1 Stimmen

Sie können die Natur eines deklarativen Programms und der deklarativen Programmierung besser verstehen, wenn Sie sie als einen Konfigurations- und Konfigurationsprozess betrachten.

1105voto

Reed Copsey Punkte 536986

Ein großartiges C#-Beispiel für deklarative vs. imperative Programmierung ist LINQ.

Mit Imperativ Beim Programmieren teilt man dem Compiler Schritt für Schritt mit, was passieren soll.

Beginnen wir zum Beispiel mit dieser Sammlung und wählen wir die ungeraden Zahlen:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Bei der imperativen Programmierung würden wir das Schritt für Schritt durchgehen und entscheiden, was wir wollen:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Hier sagen wir:

  1. Erstellen einer Ergebnissammlung
  2. Gehen Sie jede Nummer in der Sammlung durch
  3. Prüfen Sie die Zahl, wenn sie ungerade ist, fügen Sie sie zu den Ergebnissen hinzu.

Mit deklarativ Beim Programmieren hingegen schreiben Sie einen Code, der beschreibt, was Sie wollen, aber nicht unbedingt, wie Sie es erreichen können (Sie geben Ihre gewünschten Ergebnisse an, aber nicht die einzelnen Schritte):

var results = collection.Where( num => num % 2 != 0);

Hier sagen wir "Gib uns alles, wo es ungerade ist", nicht "Geh durch die Sammlung. Überprüfen Sie dieses Element, wenn es ungerade ist, fügen Sie es zu einer Ergebnissammlung hinzu".

In vielen Fällen wird der Code auch eine Mischung aus beiden Designs sein, es ist also nicht immer schwarz-weiß.

18 Stimmen

+1. Sie erwähnen jedoch zuerst LINQ, aber was haben die Beispiele damit zu tun?

22 Stimmen

Collection.Where verwendet die deklarativen LINQ-Erweiterungsmethoden. Es werden nicht die C#-Sprachfunktionen verwendet, sondern die deklarative API. Ich wollte hier keine Meldungen vermischen, weshalb ich die auf den deklarativen Methoden aufbauenden Spracherweiterungen vermieden habe.

467 Stimmen

Mir scheint, dass die deklarative Programmierung nichts anderes als eine Abstraktionsschicht ist.

208voto

Mark Rushakoff Punkte 236626

Deklarative Programmierung ist, wenn man sagt was Sie wollen, und imperative Sprache ist, wenn Sie sagen 何ゆえ um zu bekommen, was Sie wollen.

Ein einfaches Beispiel in Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

Das erste Beispiel ist deklarativ, weil wir keine "Implementierungsdetails" für die Erstellung der Liste angeben.

Um ein C#-Beispiel einzubinden, führt die Verwendung von LINQ im Allgemeinen zu einem deklarativen Stil, da Sie nicht sagen 何ゆえ um das zu bekommen, was Sie wollen; Sie sagen nur was Sie wollen. Das Gleiche könnte man über SQL sagen.

Ein Vorteil der deklarativen Programmierung ist, dass sie dem Compiler erlaubt, Entscheidungen zu treffen, die zu einem besseren Code führen können, als wenn man sie von Hand treffen würde. Bleiben wir bei dem SQL-Beispiel: Wenn Sie eine Abfrage haben wie

SELECT score FROM games WHERE id < 100;

der SQL-"Compiler" kann diese Abfrage "optimieren", weil er weiß, dass id ein indiziertes Feld ist - oder vielleicht ist es nicht indiziert, in diesem Fall muss es ohnehin den gesamten Datensatz durchlaufen. Oder vielleicht weiß die SQL-Engine, dass dies der perfekte Zeitpunkt ist, um alle 8 Kerne für eine schnelle parallele Suche zu nutzen. Sie Als Programmierer müssen Sie sich nicht mit diesen Bedingungen befassen, und Sie müssen Ihren Code nicht so schreiben, dass er jeden Sonderfall auf diese Weise behandelt.

63 Stimmen

Das Python-Beispiel ist nicht deklarativ.

1 Stimmen

Prolog ist eine deklarative Programmiersprache.

24 Stimmen

@Juanjo: Es IS Abziehbild.

179voto

AliKarimi Punkte 1719

Deklarativ vs. Imperativ

A Programmierparadigma ist ein grundlegender Stil der Computerprogrammierung. Es gibt vier Hauptparadigmen: imperativ, deklarativ, funktional (das als Teilmenge des deklarativen Paradigmas betrachtet wird) und objektorientiert.

Deklarative Programmierung : ist ein Programmierparadigma, das die Logik einer Berechnung (What do) ausdrückt, ohne den Kontrollfluss (How do) zu beschreiben. Einige bekannte Beispiele für deklarative domänenspezifische Sprachen (DSLs) sind CSS, reguläre Ausdrücke und eine Teilmenge von SQL (z. B. SELECT-Abfragen) Viele Auszeichnungssprachen wie HTML, MXML, XAML, XSLT... sind häufig deklarativ. Die deklarative Programmierung versucht, die Unterscheidung zwischen einem Programm als eine Reihe von Anweisungen und einem Programm als eine Behauptung über die gewünschte Antwort zu verwischen.

Imperative Programmierung T: ist ein Programmierparadigma, das Berechnungen in Form von Anweisungen beschreibt, die einen Programmzustand verändern. Die imperativen Programme können sowohl als Programmierbefehle als auch als mathematische Aussagen betrachtet werden.

Funktionale Programmierung: ist ein Programmierparadigma, das die Berechnung als Auswertung mathematischer Funktionen behandelt und Zustände und veränderliche Daten vermeidet. Der Schwerpunkt liegt auf der Anwendung von Funktionen, im Gegensatz zum imperativen Programmierstil, bei dem Zustandsänderungen im Vordergrund stehen. In einer rein funktionalen Sprache wie Haskell sind alle Funktionen ohne Seiteneffekte, und Zustandsänderungen werden nur als Funktionen dargestellt, die den Zustand transformieren.

Das folgende Beispiel für imperative Programmierung in MSDN durchläuft in einer Schleife die Zahlen 1 bis 10 und findet die geraden Zahlen.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's even"
var evenNumbers = numbersOneThroughTen.Where(number => number % 2 == 0);

Beide Beispiele führen zu demselben Ergebnis, und das eine ist weder besser noch schlechter als das andere. Das erste Beispiel erfordert mehr Code, aber der Code ist testbar, und der imperative Ansatz gibt Ihnen die volle Kontrolle über die Implementierungsdetails. Im zweiten Beispiel ist der Code zwar besser lesbar, aber durch LINQ haben Sie keine Kontrolle über die Vorgänge hinter den Kulissen. Sie müssen darauf vertrauen, dass LINQ das angeforderte Ergebnis liefert.

15 Stimmen

Können Sie eine Beschreibung für objektorientiert hinzufügen?

4 Stimmen

111voto

engineforce Punkte 2512

In den Antworten hier und in anderen Online-Posts wird Folgendes erwähnt:

  • Mit deklarativ Beim Programmieren schreibt man einen Code, der beschreibt, was man will, aber nicht unbedingt, wie man es bekommt.
  • Sie sollten die deklarative Programmierung der imperativen Programmierung vorziehen

Was sie uns nicht gesagt haben, ist wie man es erreicht . Damit ein Teil des Programms eher deklarativ ist, müssen andere Teile die Abstraktion bereitstellen um die Implementierungsdetails zu verbergen (das ist die Imperativ Code).

  • LINQ ist z.B. deklarativer als Schleifen (for, while, etc.), z.B. können Sie mit list.Where() um eine neue gefilterte Liste zu erhalten. Damit dies funktioniert, hat Microsoft die ganze schwere Arbeit hinter der LINQ-Abstraktion geleistet.

Einer der Gründe, warum funktionale Programmierung und funktionale Bibliotheken deklarativer sind, liegt darin, dass sie Schleifen und Listenerstellung abstrahiert haben und alle Implementierungsdetails (höchstwahrscheinlich imperativer Code mit Schleifen) hinter der Szene verstecken.

In jedem Programm werden Sie immer sowohl imperativen als auch deklarativen Code haben, und Sie sollten versuchen, alle Imperativ Code hinter dem domänenspezifische Abstraktionen so dass andere Teile des Programms sie verwenden können deklaratorisch .

Und schließlich können funktionale Programmierung und LINQ Ihr Programm zwar deklarativer machen, aber Sie können es immer noch deklarativer machen, indem Sie mehr Abstraktionen bereitstellen. Zum Beispiel:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}

// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

P.S. Das Extrem der deklarativen Programmierung besteht darin, neue domänenspezifische Sprachen (DSL) zu erfinden:

  1. String-Suche : Reguläre Ausdrücke anstelle von benutzerdefiniertem imperativem Code
  2. React.js : JSX statt direkter DOM-Manipulation
  3. AWS CloudFormation : YAML anstelle von CLI
  4. Relationale Datenbank : SQL anstelle von älteren Schreib-Lese-APIs wie ISAM oder VSAM.

1 Stimmen

Es gibt viele gute Beispiele für deklarative Programmierungen: Reagieren Sie , CloudFormation , Terraform

1 Stimmen

"Deklarative" Programmierung bedeutet also nur, dass der Code, der die Aufgabe erfüllt, in eine Funktion verschoben wird?

6 Stimmen

@GuillaumeF. Es geht darum, die domänenspezifische Abstraktion zu schaffen. Z.B. - im Bankwesen: Sie sollten Funktionen erstellen wie debit , deposit usw., anstatt imparativen Code zu wiederholen account.balance += depositAmount

53voto

Erich Mirabal Punkte 9642

Ich füge ein weiteres Beispiel hinzu, das in der Diskussion um deklarative/imperative Programmierung selten auftaucht: die Benutzeroberfläche!

In C# können Sie eine Benutzeroberfläche mit verschiedenen Technologien erstellen.

Auf der zwingenden Seite könnten Sie DirectX oder OpenGL verwenden, um Ihre Schaltflächen, Kontrollkästchen usw. unbedingt Zeile für Zeile (oder wirklich Dreieck für Dreieck) zu zeichnen. Es liegt an Ihnen zu sagen, wie die Benutzeroberfläche gezeichnet werden soll.

Auf der deklarativen Seite haben Sie WPF. Sie schreiben im Grunde etwas XML (ja, ja, technisch gesehen "XAML") und das Framework erledigt die Arbeit für Sie. Sie sagen, wie die Benutzeroberfläche aussehen soll. Es liegt am System, herauszufinden, wie es funktioniert.

Aber das ist nur ein weiterer Punkt, über den man nachdenken sollte. Nur weil eine Sprache deklarativ oder imperativ ist, bedeutet das nicht, dass sie nicht bestimmte Merkmale der anderen Sprache aufweist.

Ein Vorteil der deklarativen Programmierung ist auch, dass der Zweck in der Regel leichter zu verstehen ist, wenn man den Code liest, während man bei der imperativen Programmierung die Ausführung besser kontrollieren kann.

Die Quintessenz des Ganzen:

Deklarativ -> what die Sie erledigen möchten

Imperativ -> how Sie wollen es erledigt haben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X