Marc Reichelt: Vor- / Nachteile von Objektorientierung

Beitrag lesen

Hallo osaki,

Ich stehe vor der Überlegung, eine Webanwendung mit PHP (leider Version 4.3) objektorientiert zu programmieren - oder eben nicht. Was mich davon abhält, ist vor allem auch das limitierte Objektmodell bei Versionen < 5, allerdings ist es in meinem Fall leider nicht möglich, auf Version 5 umzusteigen.

Das ist bedauerlich, da objektorientierte Programmierung erst ab PHP 5 wirklich Spaß macht.

Allerdings kommt es mir auch so vor, als ob mir die komplette objektorientierte Programmierung nur Mehraufwand verursacht. Warum für jeden Krümel get- und set-Methoden schreiben? Auch die Sichtbarkeitsbereich von Objekten, die ja wohl nur die Ausführung des Skripts andauert, verursacht in meinen Augen viel Mehrarbeit (Objekte zwischenspeichern um wieder auf sie zugreifen zu können).

Als PHPler kommt einem das so vor, auch eingefleischte C-Programmierer würden dir voll und ganz zustimmen. Wenn du die Vorteile von OOP wirklich kennen lernen möchtest, empfehle ich Java. In Java ist die OOP von vorne bis hinten durchgezogen. Natürlich kann man auch in Java die objektorientierte Programmierung vernachlässigen (z. B. in dem man nur die main-Methode und statische Funktionen benutzt).

Kurz gesagt: Der absolute Vorteil von OOP liegt in der Wiederverwendbarkeit der Klassen. Nehmen wir mal an, du hättest folgende Java-Klasse:

public Raumschiff {  
  
  public double speed = 0.0;  
  
  /* weitere Methoden des Raumschiffs */  
  
}

Nun kann man von außen die Geschwindigkeit des Raumschiffes beliebig ändern.
Jetzt kommt plötzlich eine andere Klasse daher und führt folgenden Code aus:

Raumschiff raumschiff = new Raumschiff();  
raumschiff.speed = 400000000.0;

Die Geschwindigkeit des Raumschiffes wird also nun auf 400 Millionen Meter pro Sekunde gesetzt, was (nach der Definition der Klasse Raumschiff) beispielsweise gar nicht erlaubt sein sollte.

Bei der folgenden Klasse ist eine solche Änderung - dass ein Raumschiff beispielsweise nur so schnell fliegen kann wie die Lichtgeschwindigkeit es erlaubt - problemlos möglich, ohne dass die andere Klasse es bemerkt:

public Raumschiff {  
  
  private double speed = 0.0;  
  
  public void setSpeed(double speed) {  
    this.speed = speed;  
  }  
  
  public double getSpeed() {  
    return speed;  
  }  
  
  /* weitere Methoden des Raumschiffs */  
  
}

Die veränderte Klasse sähe dann etwa wie folgt aus:

public Raumschiff {  
  
  private double speed = 0.0;  
  public static final double LIGHTSPEED = 299792458.0;  
  
  public void setSpeed(double speed) {  
    if (speed >= 0.0 && speed < LIGHTSPEED) {  
      this.speed = speed;  
    }  
  }  
  
  public double getSpeed() {  
    return speed;  
  }  
  
  /* weitere Methoden des Raumschiffs */  
  
}

Wenn nun eine äußere Klasse den Code
meinRaumschiff.setSpeed(400000000.0);
ausführen würde, würde der Befehl stillschweigend ignoriert (eventuell könnte nun auch eine Fehlermeldung gebracht werden).

Also haben selbst set- und get-Methoden durchaus ihre Berechtigung. Vor allem deshalb, weil man nie weiß, wie die Klasse sich in der Zukunft verändern wird - und natürlich, was andere so alles mit der eigenen Klasse anstellen.

Als einzelner Programmierer wirst du dir jetzt eventuell sagen:
"Hey, wozu brauche ich das denn? Ich weiß schließlich genau, wie mein Code aussieht!!111"
Was aber nun, wenn plötzlich mehrere Programmierer am Projekt arbeiten?
Oder du selbst das Projekt einige Monate lang ruhen lässt und schließlich wieder in Angriff nimmst? Oder das Projekt sehr groß wird? Kommentare sind hier natürlich immer angebracht.

Ansonsten kommt mir eine modulare Aufteilung sinnvoller vor. Ich will zum Beispiel gleiche Teile einer HTML-Seite, wie den Header-Bereich (von <!doctype bis <body>) oder z.B. das komplette Menü des Projekts in einzele php-Dateien auslagern, so dass ich sie per include laden kann und bei Änderungen nur einmal bearbeiten muss. Oder z.B. ein Datenbankmodul, dass alle DB-Funktionen enthält (und für Anfragen die DB-Klasse nutzt).

Das alles lässt sich über OOP üblcherweise sehr elegant lösen.

Einzelne Seiten des Projekts würde ich dann nach wie vor imperativ programmieren und dabei auf meine Module zurückgreifen. Ist das nicht viel einfacher, als auf Biegen und Brechen alles objektorientiert zu machen?

OOP heißt nicht immer "auf Biegen und Brechen objektorientiert machen".
Das geht bei PHP übrigens überhaupt nicht (es bleibt mindestens eine Zeile als Aufruf für die main-Methode). ;-)
Aber bei Projekten, wie du sie beschreibst, kann OOP durchaus eine sehr sinnvolle Erweiterung deines Horizonts sein.

Welcher Meinung seid ihr? Was sind eure pro- und contra-Argumente für/gegen Objektorientierung mit PHP? Würd mich sehr interessieren - und vielleicht hilft's auch bei meiner Entscheidung.

Ich hoffe, ich habe dir den Vorteil von OOP ein wenig näher bringen können.
Und wenn du mal wirklich "richtig" mit OOP beginnen möchtest, würde ich dir Java sehr ans Herz legen. Java ist von Anfang an erst mal sehr ungewohnt (eben, weil alles objektorientiert ist), aber nach einigen Monaten hat man den ganzen Sinn dahinter verstanden.

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
Linux is like a wigwam - no windows, no gates and an Apache inside!
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)