Objektorientierte vs. funktionale Programmierung im Web

2014-11-15 11:48 (Kommentare: 0)

OOP
© il-fede - Fotolia.com

Viele Webanwendungen sind heute objektorientiert implementiert, doch die funktionale Programmierung erlebt ein Revival. Nicht selten entbrennt beim Paradigma zum Programmieren ein Streit: Die einen schwören auf funktionale, die anderen auf objektorientierte Programmierung. Die Wahrheit liegt wohl dazwischen. Wir zeigen die Unterschiede und verraten euch, wann welches Paradigma gut eingesetzt wird.

Zum besseren Verständnis starten wir mit der Vorstellung der objektorientierten und funktionalen Programmierung.

Objektorientierte Programmierung

Die Softwarearchitektur ist bei der objektorientierten Programmierung (OOP) bestrebt, die Wirklichkeit abzubilden. So genannte Klassen kapseln Daten und implementieren Funktionen zur Datenmanipulation. Sie gilt heute insbesondere in Verbindung mit Design Patterns (Entwurfsmustern) für viele als State of the Art.

Viele OO-Implementierungen wahren das Geheimnisprinzip, welches auch als information hiding bezeichnet wird. Variablen werden bei diesem Programmierparadigma in Objekten gekapselt. Der Zugriff auf Variablen erfolgt gemäß dem Geheimnisprinzip in der Regel über Getter-Methoden und Setter-Methoden. Der Programmierstil ist oftmals dem imperativen/prozedualen Stil ähnlich.

Zentrale Eigenschaft objektorientierter Software ist die Wiederverwendbarkeit. Durch die Vererbung können Klasseneigenschaften in neuen Implementierungen weiterverwendet werden. Änderungen an der Ursprungsklasse erfolgen durch Überladen und Überschreiben von Funktionen der Mutter-Klasse. Auch das Hinzufügen von Schnittstellen und zusätzlichen Methoden in der Tochterklasse ist im Rahmen der Vererbung möglich.

Beispiel für eine PHP-Klasse:

 
class server  
{ 
 var $ram; 
 var $hdd_data; 
 
 function load_hdd_data_into_ram() 
 { 
  $this->ram=$this->hdd_data; 
  echo 'Ladevorgang abgeschlossen.'; 
 } 

function dump_ram() { echo 'folgende Daten sind im Ram:',
$this->ram; }
function __construct() { $this->ram=''; $this->hdd_data='mein programm'; } }
$obj = new server(); $obj->dump_ram(); $obj->load_hdd_data_into_ram(); $obj->dump_ram();

Die Daten sind in der Klasse gekapselt. Die dump_ram liefert bei beiden Aufrufen unterschiedliche Ergebnisse. Die Änderung wird durch den Aufruf der Funktion load_hdd_data_into_ram herbeigeführt.

Funktionale Programmierung

Die funktionale Programmierung wird der deklarativen Programmierung zugeordnet. Bei diesem Programmierparadigma stehen die Funktionen im Mittelpunkt, es basiert auf dem Lambda-Kalkül. Funktionale Programme sind zustandslos und Daten (Variablen) sind unveränderbar. Das beinhaltet Vorteile. Die funktionale Programmierung ist von Hause aus gut für die Parallelisierung gerüstet und sie ist leicht testbar. Sogar Verifizierungen der zustandslosen Funktionen ist möglich.

Der funktionale Code ist in der Regel leicht nachzuvollziehen. Die Funktionen sind dank Zustandslosigkeit und unveränderbarer Daten übersichtlich. Auch die Entwurfsphase gestaltet sich einfach.

Zustandslose Funktionen

Zustandslose Funktionen (stateless functions) haben eine zentrale Eigenschaft: Sie liefern für eine Eingabe immer dasselbe Ergebnis. Kein interner Zustand kann für Varianzen beim Ergebnis sorgen. Dies ist in Hinsicht auf Softwaretests und eine Softwareverifikation das schlagende Argument. Ein Beispiel für diese Funktionen sind anonyme Funktionen, die es in Java, JavaScript, C++ und seit der Version 5.3 auch in PHP gibt.

Beispielcode für eine anonyme (zustandslose) Funktion in PHP:

 
// two quick and dirty one-liner that creates anonymous objects 
$shoe1 = (object) array('color' => 'black'); 
$shoe2 = (object) array('color' => 'black'); 
$pair_of_black_shoes = function ($shoe1, $shoe2)  
{ 
 return (($shoe1->color == 'black') && ($shoe2->color == 'black')); 
}; 
$pair_of_black_shoes($shoe1,$shoe2) ? $output="ein schwarzes Paar Schuhe" : $output="kein schwarzes Paar Schuhe"; echo $output;

Die Funktion pair_of_black_shoes kann beliebig oft aufgerufen werden. Die Ausgabe ist zwar abhängig von den Eingabewerten, jedoch deterministisch. Die übergebenen Objekte werden durch die anonyme Funktion nicht modifiziert. Diese folgt dem Grundsatz der funktionalen Programmierung.

Ein weiteres klassisches Beispiel für die funktionale Programmierung ist die rekursive Berechnung der Fakultät:

 
function fak($n) { 
 return ($n > 0) ? $n* fak($n-1) : 1; 
 /*  
 We use the performance-optimized version of: 
 if($n > 0) 
 return $n * fak($n-1); 
 else 
 return 1; 
 */ 
} 

Wann ist welches Programmierparadigma sinnvoll?

Einen pauschalen Sieger gibt es nicht. Die funktionale Programmierung spielt ihre Stärke aus, wenn gut testbarer und verifizierbarer Code gefragt ist. Auch für leicht parallelisierbaren Code ist die funktionale Programmierung gut geeignet. Die Beispiele zeigen auch, dass die meist imperative objektorientierte Programmierung leicht mit der funktionalen zu kombinieren ist.

Die rekursive Programmierweise der funktionalen Programmierung, wie wir sie im dritten Beispiel sehen, ist jedoch gefährlich: Die Daten und der Programmcode werden für jede Rekursion auf den Stack geladen. Umfangreiche Operationen, die beispielsweise Verbindungen zu anderen Servern oder Datenbanken herstellen und hohe Datenmengen abrufen, können schnell zum Speicherfresser mutieren. Dann drohen Speicherüberläufe und Programmfehler.

Weitere Informationen und Beispiele zum Trend funktionale Programmierung in Webanwendungen findet ihr unter den folgenden Links:

http://angularjs.de/artikel/angularjs-baconjs
http://www.codediesel.com/php/anonymous-functions-in-php/
http://currybuch.de/
http://www.magjs.de/2012-01/strehl/strehl.html
http://drupal.cocomore.de/blog/drupalcon-review-funktionale-programmierung

Zurück

 
domainssaubillig © 2007-2024 Alle Rechte vorbehalten. | Support | AGB | Datenschutzerklärung | Impressum