Entwicklungparadigmen

Programmierparadigmen

Je nach Art und Design einer Programmiersprache können bei der Entwicklung unterschiedliche Prinzipien zugrunde gelegt werden. Diese können entweder durch die Programmiersprache selbst, die verwendeten Bibliotheken und Frameworks oder durch eine im Team verabredete Konvention vorgegeben sein. Man spricht auch von Programmierstilen oder Programmierparadigmen. Hierbei gibt es weder einen "richtigen" noch einen "falschen" Programmierstil. Es gibt lediglich sinnvolle oder weniger sinnvolle Lösungsansätze für eine Problemstellung. Was hierbei sinnvoll und weniger sinnvoll ist entscheidet sich aus den Anforderungen der zu realisierenden Anwendung.

Eine grundsätzliche Unterscheidung besteht zwischen dem imperativen und dem deklarativen Programmierparadigma. Eine Faustformel zur Unterscheidung beider Ansätze lautet, dass beim imperativen Programmierparadigma das Wie einer Berechnung (der Handlungsablauf), beim deklarativen das Was einer Berechnung (das Ergebnis) im Vordergrund steht (während der Handlungsablauf vom ausführenden Computer festgelegt wird).

Neben dieser grundsätzlichen Unterscheidung existiert eine Vielzahl weiterer Programmierparadigmen, beispielsweise die prozedurale Programmierung (imperativ), die funktionale Programmierung (deklarativ) und die objektorientierte Programmierung. Sofern Programmiersprachen mehrere Stile bzw. Paradigmen unterstüzten, werden sie multiparadigmatisch genannt.

Weiterführende Informationen:

Objektorientierte Programmierung

Die objektorientierte Programmierung versucht durch die Verwendung von Objekten, die im Rahmen einer Anwendung miteinander interagieren, innerhalb der Software eine Annäherung an die Gegebenheiten der realen Welt zu erreichen. Objekte enthalten dabei sowohl Daten (Eigenschaften, properties) als auch Aktionen auf diesen Daten (Methoden, methods). Hierbei wird in der Konzeptionsphase ein Objektmodell für die Anwendung entworfen (bspw. mittels Domain Driven Design). Für jedes konkrete Objekt, das zur Laufzeit einer Anwendung erzeugt wird, existiert eine abstrakte Klasse (ein Bauplan). Klassen definieren (gleichartige) Objekte. Die Datenstruktur eines Objektes wird durch die Eigenschaften bestimmt, das Verhalten eines Objektes durch die Methoden.

Wichtig ist, dass die objektorientierte Programmierung eine Herangehensweise ist. Dies wird manchmal verwechselt mit der Tatsache, dass es objektorientierte Programmiersprachen gibt. Java und Python sind zum Beispiel objektorientierte Programmiersprachen. Man kann mit ihnen jedoch sowohl objektorientiert als auch funktional programmieren. PHP ist eine prozedurale Programmiersprache. Auch in PHP ist es möglich sowohl objektorientiert als auch funktional zu programmieren. Heutige PHP-Frameworks sind aber zum größten Teil objektorientiert programmiert.

Beispiel (PHP):

<?php

class MyClass
{
    protected $property = 'Ich bin eine Eigenschaft';

    public function setProperty($value)
    {
        $this->property = $value;
    }

    public function getProperty()
    {
        return $this->property;
    }
}

// Create two objects
$objectOne = new MyClass;
$objectTwo = new MyClass;

// Get the value of $property from both objects
echo $objectOne->getProperty() . "\n" . $objectTwo->getProperty();

// Set new values for both objects
$objectOne->setProperty('Eigenschaft von 1');
$objectTwo->setProperty('Eigenschaft von 2');

// Output both objects
echo "\n" . $objectOne->getProperty() . "\n" . $objectTwo->getProperty();

Weiterführende Informationen:

Funktionale Programmierung

Bei der funktionalen Programmierung bestehen Programme aus Funktionsdefinitionen, die für eine Eingabe eine Ausgabe liefern. Hierbei können Funktionen miteinander verknüpft sowie als Eingabeparameter und auch als Berechnungsergebnis (Ausgabe) von anderen Funktionen verwendet werden. Die Grundlagen der funktionalen Programmierung stammen aus der Mathematik. Grundprinzip ist, dass Eingabedaten mittels Funktionen auf Ausgabedaten abgebildet (gemappt) werden. Im Vergleich zur imperativen Programmierung, die aus aufeinander folgenden Rechenanweisungen besteht und daher Zustandsänderungen (Seiteneffekte) erzeugt, wird in der funktionalen Programmierung hierauf verzichtet. Imperative Programme arbeiten zur Berechnung von Werten häufig mit Iteration (Schleifen), funktionale Programme arbeiten mit rekursiven Funktionsaufrufen (Rekursion). Funktionale Programmierung gilt als besonders effizient und spielt bei Webanwendungen zum Beispiel im Kontext von Rechenoperationen auf verteilten Infrastrukturen eine Rolle. Insgesamt haben die meisten weborientierten Programmiersprachen inzwischen Möglichkeiten zur funktionalen Programmierung integriert und diese findet zunehmend ihren Weg in aktuelle Webframeworks (siehe das Beispiel unten).

Auch die funktionale Programmierung stellt zunächst eine Herangehensweise dar. Darüber hinaus existieren funktionale Programmiersprachen (wie bspw. Haskell oder auch XQuery/XSLT), die nach streng funktionalen Prinzipien aufgebaut sind und einen funktionalen Programmierstil "erzwingen". Dennoch ist es auch in prozeduralen (PHP), objektorientierten (Java) und multiparadigmatischen Sprachen (JavaScript) möglich funktional zu programmieren.

Beispiel (PHP):

// imperativ / iterativ
foreach ($stringArray as $key => $value) {
  $result[$key] = strtoupper($value);
}

// funktional
$result = array_map('strtoupper', $stringArray);

Anwendung einer anonymen Funktion ("Lambda-Funktion") innerhalb des Slim PHP-Frameworks.

<?php
$app = new \Slim\App;
$app->get('/home', function () {
    // show home page
});

Weiterführende Informationen:

WS 2019/20 – Webbasierte Forschungsapplikationen für die Geisteswissenschaften CC BY-NC-SA 4.0