Download PHP - Endlich objektorientiert - OO- und UML

Transcript
4 – PHP objektorientiert
Stellen Sie sich vor, dass Sie die alte Kundenklasse aus Listing 4.25 bereits vielfältig im
Einsatz haben. Sie können die existierende Kundenklasse durch die neue Klasse aus Listing 4.39 in allen existierenden Projekten ohne negative Auswirkungen ersetzen. Die
neuen Methoden der Rechnungsverwaltung eines Kunden werden in alten Projekten nur
nicht aufgerufen bzw. verwendet. Die strikte Modularität der objektorientierten Denkweise vereinfacht also die Versionierung und das Aufspielen verbesserter Komponenten.
In Listing 4.40 wird die neue Rechnungsklasse präsentiert. Die Eigenschaften $id,
$datum, $rabatt und $bezahlt mit ihren Get- und Set-Methoden sind ebenso unkritisch wie
die Referenz auf das Kundenobjekt, das der Rechnung in ihrem Konstruktor übergeben
und in $kunde festgehalten wird.
Die interessante Frage ist, wie die Komposition zwischen der Rechnung und ihren Positionen realisiert wird. Eine Rechnung benötigt mindestens eine Rechnungsposition, um
existieren zu können. Die Daten für diese erste Position wird daher im Konstruktor der
Rechnung übergeben, die erste Rechnungsposition im Konstruktor erzeugt, in der Liste
der Positionen gespeichert und der Zähler der Rechnungspositionen auf 1 gesetzt.
Zusätzlich existiert in der Rechnungs-Klasse eine Methode addPosition(...), die aber keine
zuvor erstellte Rechnungsposition erhält, sondern alle notwendigen Daten zur Erzeugung einer neuen Rechnungsposition. Denn ansonsten müsste der Aufrufer der
Methode im Vorfeld eine Rechnungsposition erzeugen, die noch nicht zu einer Rechnung gehört. Dies widerspricht streng betrachtet der Komposition, bei der das Teil (die
Position) nicht ohne ihr Ganzes (die Rechnung) existieren kann.
Auch in der Methode getPositionen() sollte man bei der Komposition nicht einfach über
return $this->positionen; das Datenfeld mit den Referenzen auf die Positionsobjekte übergeben. Denn nach einem Destruktor-Aufruf der Rechnung könnten die Positionen oder
Kopien via clone-Befehl weiter existieren. Die Daten der Rechnungspositionen werden
daher in ein Datenfeld umgewandelt und zurückgegeben. Der Aufrufer der Methode
kann dann dieses Datenfeld weiterverwenden.
<?php
class Rechnung{
private $id; private $datum; private $kunde; private $rabatt; // in %
private $bezahlt=FALSE;
private $positionen=Array(); private $anzPositionen=0;
public function __construct($id,$datum,$kunde,$rabattGesamt,
$artikel,$menge,$rabattPos1){
$this->id=$id; $this->datum=$datum; $this->kunde=$kunde;
$this->rabatt=$rabattGesamt;
$this->positionen[0]=new Rechnungsposition($artikel,
$menge,$rabattPos1);
$this->anzPositionen=1;
$kunde->addRechnung($this);
Listing 4.40: Die neue Rechnungsklasse
258